Android 平台中的安全编程

  • Sergio De Simone
  • 王振峰

2014 年 5 月 7 日

话题:JavaAndroid语言 & 开发架构

CERT 安全编程团队,隶属于卡内基梅隆大学软件工程学院,最近发布了Android 平台上 Java 应用的安全编程指南

CERT 在该领域已经有所积累,并且在 2013 年发布CERT Java 安全编程规范,后来出版Java 编程指南:可靠安全编程的 75 条建议一书,该 Android 指南是对以上工作成果的拓展和延伸。所以,在新版 Android 编程规范和指南中,一部分是参照已有的 Java 规范指南,当然也少不了与 Android 相关,致力于解决移动相关问题的新规则。

Lori Flynn 是发起 CERT Android 编程规范和指南的研究人员之一,据她所说,“其他地方也存在这样的 Android 安全编程建议,但是我们发现这些建议都不完整并且分散在网络的各个角落。”CERT 研究人员采用以下三种方式制定了新版 Android 编程规范与指南:

  • 挖掘 CERT 已有的安全编程规范;
  • 研究已有漏洞数据库,包括国土安全部的国家漏洞数据库等;
  • 研究目前与安全相关的文献,比如,研究论文、在线文章以及安全会议演讲等。

所有规范和指南都可以在 CERT Wiki上获取。每条记录以简要概述开头,然后描述此条规范所要解决的安全问题,并且包括违规代码案例。Wiki 中还提供了基于严重程度的评分、漏洞被恶意使用的可能性,以及如果在代码中发现漏洞,修复漏洞的成本等。

InfoQ 联系了 Lori Flynn,并针对 CERT Android 安全编程规范和指南采访了她。Lori 目前在 CERT 的工作不仅包括完善新版安全编程规范,还包括对移动应用进行组合性静态分析,检查是否符合 Android 平台的数据流规则。她工作经历丰富,包括网络安全研究,基于标准的安全分析,以及合作开发了一种检测多态程序的新型静态分析方法,并且取得了专利。Flynn 在圣克鲁斯获得了加利福尼亚大学的计算机科学博士学位,她的研究方向是移动自组网络的安全多播路由协议。

Lori,您能简要介绍一下Android安全编程规范和指南的目标受众有哪些吗?

我们制定的 Android 安全编程规范和指南目前主要面向使用 Java 语言的 Android 应用开发人员。但是,我们也在着手制定适用于基于底层(非 Java)语言如 C 和 C++ 所开发应用的安全规范。我们的目标是帮助开发人员构建可靠安全的系统,但是这些规范和指南对实现其他质量特性如可靠性也大有裨益。

所有希望保护客户系统免受危害的组织或个人,在其开发人员遵循规则和指南并产出安全代码后,都会从中受益。金融、卫生和防御系统都必须小心保护其应用所处理的信息。有些应用处理的数据非常敏感——比如,用户的信用卡信息、位置、短信、联系方式和照片。除了对用户造成潜在伤害外,非安全代码可能会使处于金融风险中的开发人员走上法庭,也可能使整个公司失去公众信任(和导致销售损失),或导致困难局面,使给公众造成不安全印象的单应用销售乏力。

总而言之,知晓 Android 安全编程规范和指南,不论对于大型组织还是独立应用开发者都会有所帮助。软件开发管理者、软件需求方,或者其他软件开发和需求专家可以将安全编程规范作为禁止性需求的参考。教育工作者也可以通过该指南教会学生安全开发 Android 应用的方法。

据您所知,移动相关人员在碰到应用安全问题时面临的主要挑战是什么?在移动领域,您是否知道某些特定安全相关问题?

除了已知的公认安全编程问题以及规范和指南给出的修复方法外,无法有效把控应用的数据去向也是我们面临的挑战之一。信息泄露如此泛滥,Android 应用之间的相互影响是主要原因。我们目前正在研发静态分析工具,用于检测和消除这些漏洞。有了这些工具,用户——包括个人和组织——将更有信心解决部分应用的数据泄露问题。然而,尽管我们目前的工作有效促进了安全分析的发展,但是还是无法解决底层代码或反射面临的安全问题。数据流安全问题同样非常严重,所以有许多工业界和学术界的研究人员在这方面倾注心血。

另一个问题是可用性。实际上在我们深入分析数据流时,应用需要给用户展现对应选项,还得让用户(开发人员用户排除在外)容易明白这些选项的意义。Adrienne Porter Felt(Google)已经发表了若干非常优秀的研究论文,分析了用户界面安全问题并给出了修复建议。她的工作涉及面向开发人员的可用性问题,比如与权限相关的不恰当 API,可能导致正常开发人员的权限过大,进而被恶意应用利用。

Android 安全还面临另一个问题,在 Google 修复 Android 暴露的安全问题后,因为各种原因,移动运营商可能在很长时间后才将安全更新推送给用户。这就导致在这段时间内,与应用相关的数据将面临巨大的风险。

遵循Android安全编程规范和指南,对应用有哪些好处?您有没有这方面的案例,遵循指南后,应用能够避免以前遇到的安全问题?

如果我们能够严格遵守 Android 安全编程规范和指南,数据和系统会更安全。举个例子吧,DRD00-J禁止将敏感数据保存到 SD 卡中,因为其他应用可以读取 SD 卡,DRD01-J限制内容提供者中敏感数据的权限等。Skype 的 Android 应用曾经出现过一个漏洞,该应用将联系信息和个人用户信息保存在未加密数据库中,并且没有实施权限控制。如果应用遵守 DRD01-J 就可以避免该问题。

为了改善语言的安全现状,SCI(Secure Coding Initiative)发起了开发编程语言国际规范的工作。该规范致力于防范代码漏洞,并充分利用在研发 CERT 安全编码规范和一致性测试中所收集的信息。

您对应用CERT安全编程规范和指南有哪些建议方法,工具、流程或其他方法都可以?感兴趣的开发人员或组织要如何开始呢?

我建议开发人员首先通读我们的技术报告,移动源码安全分析实验室:Java 和 Android 安全编程规则和分析,然后浏览 Android 安全编程首页。我们打算创建单独的 CERT 编程规范,就像其他 CERT 安全编程规范一样可以通过CERT 编程规范 Wiki主页访问。该首页概述了我们目前在研发 Android 安全编程规范方面的工作:分析(适用性)和扩展已有 Java 规范;分析(适用性)和扩展 Java 指南,虽然该指南还在制定过程中;制定面向 Android 的安全编程规范,但该规范并不一定只针对 Java 语言。查看出现在首页中的三个主题链接,这是 Android 安全编程规范制定中的主要课题。

接下来,我建议开发人员浏览一遍 DRD 规范和指南,并考虑如何将它们应用到应用编程中。然后,我建议大家阅读Java CERT Oracle 安全编程规范(Addison-Wesley Professional, 2011)中适用于 Android 的 Java 规范,包括 Wiki,关注该书相关的主题。这些规则是安全应用必须遵守的,这也是将其放在指南前面的原因。读完规则后,以同样方式阅读Java 编程指南:可靠安全编程的 75 条建议(Addison-Wesley Professional,2013)。虽然我们不一定能够立即将书中列出的规范和指南应用到工作中,但是这些知识精华会印入我们的脑海,当开发应用需要用到这些规范和指南时,我们可以再仔细查看。另外我们值得做的是订阅安全编程简报,LinkedIn 上的安全编程讨论,还有安全编程 wiki 中的提醒,当增加新规范和指南时会立即提醒。这些渠道有助于开发人员及时知晓安全方面的修复程序。

您在Android安全编程规范方面的工作完成了吗?或是您有没有设想将来涉及其他领域?

我们在 Android 安全编程指南方面的工作还在继续。另一个我们特别想研究的领域是分析 CERT 安全编程指南在基于 C 和 C++ 的 Android 应用中的适用性。我们已经有了初步的分析,但是要检验 Android 底层编程接口如何影响已有编程规则的适用性,还要付出更多努力。同时,我们也会完善应用于反射的初步规则和指南。

你们的团队还有其他类似的项目吗?

我们的CERT 安全编程倡议(SCI)已经为 C、C++、Java 和 Perl 制定了安全编程规范,其中一些规范已经被像 Cisco 和 Oracle 这样的企业在公司范围内采用。我们鼓励开发人员以及其他使用这些语言工作的组织使用我们的安全编程规范,这将会带来诸多好处,就像使用 Android 安全编程规范和指南一样。

SCI 的目标是将漏洞的数目降低到某个级别,有效缓解运营环境中的风险应用。该目标通过在实现和测试阶段预防编程错误或检测并清除安全缺陷来达成。同时,SCI 也在持续壮大源码分析实验室(SCALe),支持根据我们的编程规范对系统进行一致性测试,包括针对移动平台(Mobile SCALe)的一致性测试。移动 SCALe 目前专注于 Android 平台,因为这是我们在制定安全编码规范和指南时所面向的首个移动平台。我们还计划支持针对 Apple iOS 和 Microsoft Windows 8 的安全编程规范和一致性测试。

查看英文原文:Secure Coding for the Android Platform


感谢崔康对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

JavaAndroid语言 & 开发架构