Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Java Cryptography Uses in the Wild

作者:Mohammadreza Hazhirpasand, Mohammad Ghafari, Oscar Nierstrasz

单位:University of Bern, Bern, Switzerland

会议:ESEM 2020

论文链接:Java Cryptography Uses in the Wild

Abstract

[背景]开发人员经常会误用密码学API。 [目的]了解开源Java项目使用加密API的方式、误用的类型以及误用原因。 [方法]使用静态分析工具来分析数百个依赖Java密码体系结构的开源Java项目,并手动检查分析结果。在每个项目的GitHub仓库上创建问题来联系维护者,并与其讨论。 [结果]有85%的密码学API被误用,但并非每次误用都会造成严重后果。开发人员的反馈表明,加密API文档中的安全警告很少,第三方代码的误用行为可能被忽略,加密API的上下文应被考虑。 [结论]对于开发人员而言,使用Crypto API仍然存在问题,但盲目将此类误用其归咎于开发人员可能会导致错误的结论。

1 INTRODUCTION

对于开发人员而言,加密API并不容易使用。最近的一项研究报告称,GitHub上有72%的Java项目至少存在一种密码误用,例如选择弱算法,短加密密钥或过时的函数调用。

通用信息源中缺少与安全性相关的提示会加剧此问题。Oracle的Java Cryptography Architecture(JCA)官方在线文档局限于对每个API及参数的解释,很少解释有关API安全配置的警告。非官方文档例如Stack Overflow网站上有许多密码学问题,但答案可能已过时,或者建议的解决方案未考虑安全隐患。

作者进行了一项探索性研究,以了解开源Java项目中加密API使用的当前状况。作者在API级别上研究此问题,即解释哪些API存在问题以及哪些类型的误用现象普遍存在。

2 METHODOLOGY

2.1 Searching, downloading, and compiling

作者从一组使用JCA API的项目开始(Crysl工作中确定的项目),获取这些项目的协作者,并检查他们贡献的其他Java项目。接下来,使用GitHub搜索代码API来检查Java项目是否使用任何JCA API,例如MessageDigestCipherKeyStore。 作者使用bash脚本检查项目路径中是否存在构建文件(POM),然后使用Maven编译项目,以进行静态分析。

2.2 Analysis

作者扩展了静态分析工具CogniCrypt,以收集和报告每个API在哪行使用,以及在哪个用户定义方法中使用,使用GitHub API获得有关每个项目的信息(星级数、分叉数、项目创建和更新日期)。

2.2.1 Schema

作者使用bash脚本借助正则表达式从生成的分析报告中提取信息,将其在CryptoMine数据集中显示为逗号分隔的CSV文件。每条记录描述一个加密API的用法。

“misuse_type”字段表示静态分析工具提供的五种类型:

(1)“wrong type”:错误地使用某种引用类型。例如,PBEKeySpec的构造函数要求将口令作为character array传递,而不应作为string object传递。 (2)“wrong object”:对象传递的方式不符合预期的安全要求。 (3)“wrong constraint”:为整数或字符串对象选择错误的值传递给加密API。这是常见的误用类型,例如密钥大小、算法名称或迭代计数。 (4)“incomplete operation”:未实现加密的完整路径,例如未能调用PBEKeySpec.clearPassword()。 (5)“incomplete order”:方法调用顺序不正确,例如未能在Cipher API中调用init()

2.2.2 Manual investigation

本文的两位作者依靠专业知识和CrySL规则,手动检查了1280条CryptoMine记录(数据集的48%)。审阅者分别检查1280条记录,最后交叉检查他们的个人判断,如有冲突会参考工具规则并进行讨论。

2.3 Contacting the developers

为了解误用原因,作者联系了GitHub上的216个仓库维护者,维护者表示样本具有95%的置信度和5%的误差率。对于每个仓库,作者在GitHub页面上创建了一个问题,解释报告加密误用的目标,提供了每种误用的解释,并指出了受影响的Java文件、行号和API名称。

3 RESULTS

3.1 The state of crypto uses

作者调查了489个项目中15类JCA API的使用,发现只有两个项目是完全正确使用的,487个项目都至少存在一个加密误用。

在手动调查的记录中,有74条记录(占6%)被标记为拒绝,即被错误地标记为误用。例如,在SignatureAPI中使用sign方法之前,开发人员需要调用initSignupdate方法。但是,如果开发人员在循环中使用了update方法,自动分析无法识别它。

图1总结了每个JCA API的使用与误用。

表2提供了6个误用最多的API中误用类型的分布信息。

完整的分析结果位于CryptoMine数据集(http://crypto-explorer.com/cryptomine/),它有助于调查以下研究问题:

(1)最常见的密码错误是什么,应该采取什么措施来提高可学习性? (2)密码使用在项目中如何演变? (3)项目的质量特征与该项目中的加密使用有何关系? (4)通常在什么情况下使用加密API? (5)为什么有些开发人员在使用密码学时表现更好? (6)静态分析工具在检测加密误用方面的性能如何? (7)比较几种静态分析工具检测数据集的加密使用的基准结果是什么?

3.2 Developer feedback

作者评估了140个仓库的反馈,极少数的仓库维护者(7个仓库)同意解决此问题,大多数维护者(46个仓库)不同意。幸运的是,有32位仓库维护者对问题原因以及是否会产生风险感兴趣。

下面介绍了九个主要类别的响应:

Personal repository “该项目旨在用于教育目的,并有意包含一些漏洞例子。” “该项目是为内部使用而创建的,不会解决任何实际问题。”

人们不知道这些问题可能会对依赖在线示例的人产生影响。另一个方面,当程序规模很小时,他们不关心安全性。

Will fix later “这些误用不会影响程序功能,也不是必须立即解决的。”

开发人员经常低估加密误用的影响。

Request for pull 作者认为这可能会导致开发人员盲目接受pull请求,对软件安全性产生不利影响。例如,对手可能将项目的安全机制降级。

缺乏安全知识的开发人员可能会盲目接受与安全相关的请求。

Refer to the main library 开发人员使用了开源库,要求将问题报告给开源库。

不幸的是,开发人员似乎并不担心与外部库相关的安全风险。

Repo is not maintained > 非活跃项目在开源社区中很常见,但只要代码可在线使用,新手开发人员就能依赖开源项目。

Consult documentation 10个仓库的开发人员要求作者阅读API文档,或在响应中引用了文档。 “根据文档,KeyStore的第二个参数参数是字符串,为什么不应该是java.lang.String呢?” “根据Java文档,java仍支持MD5。” “参考了官方Java文档,信任Signature API中的SHA1withRSA算法。” 两个开发人员未被说服停止在Cipher API中使用NoPadding,他们指出在Java 8中使用空字符串可能会导致运行时错误,并引用了Java文档中的Cipher页面。

开发人员对官方文档有信心,但此类资源很大程度上缺乏安全方面的考虑。

Uncertainty 开发人员提到了误用了KeyStoreAPI的博客文章,怀疑在SecretKeySpecKeyPairGenerator中可以安全使用哪种算法,一些开发人员不清楚错误使用Cipher API可以如何被利用。

开发人员对使用API方法的不确定性与方法或算法名称有关。

Consider the context and disagreement 主要与MessageDigest API有关,其使用频率较高,可用于许多场景中,例如身份验证、校验和、归档或与其他算法结合使用。

常见问题是MD5或SHA1未被用于安全目的。仓库贡献者指出代码注释表明SHA1仅用于为文件夹的所有内容生成单个哈希,这绝对足够。

一些贡献者说这些代码很旧(已使用了十年),并且上下文不是以安全性为重点的。一位贡献者引用了一篇博客文章,讨论了SHA1仍然可用,而不管现有的碰撞漏洞如何。

开发人员认为上下文与安全性无关。使用安全API产生哈希值是最常见的与安全性无关的用法。

为了显示加密误用的主要原因,作者确定了必须考虑的各种影响因素。 * 项目的年龄; * 盲目依赖第三方库的使用; * 开发人员可能无法充分利用静态分析工具来解决加密问题; * 在不考虑上下文的情况下静态检查代码可能会产生误报; * 误用加密的示例在开源项目中的广泛传播可能会对经验不足的开发人员产生深远的影响。

4 THREATS TO VALIDITY

作者采用了静态分析工具CogniCrypt,以评估数百个Java项目中加密使用的状态。为了提供更高的可靠性,作者手动交叉检查了CryptoMine数据集中48%的结果。此外,安全性假设可能会发生变化(例如SHA1),需要做进一步的工作以增加API使用范围。

6 CONCLUSION

作者分析了数百个使用JCA API的项目,发现85%的加密API至少存在一个误用,并联系了项目的维护者,将他们的回答分为九大类。结果表明,API文档缺乏安全提示,误用源于第三方库,或者代码上下文在错误使用加密API中起着至关重要的作用。 最后,作者公开了CryptoMine数据集,包括分析结果以及每个项目的信息。