CryptoGo精读记录
ACSAC '22 CCF-B
总结:1.使用污点分析静态程序分析技术;2.设计5种污点分析规则;3.设计12种加密规则;4.说明不同API对应的source、sink、filter
背景和相关工作
面对误用,开发人员存在1.readme文档写的不好2.自身知识不够两个问题
当前Go领域还没有针对性的检测工具

算法分类和加密规则
算法分类
梳理go官方提供的加密算法,标准库(v1.18.3)和补充库(v0.0.020220622213112-05595931fe9d);针对密码算法类型和当前安全强度进行分类,见下表
Insecure ceyptographic algorithms:不安全的算法
Acceptable but not recommended cryptographic algorithms:可接受但不推荐的算法
Recommended cryptographic algorithms:推荐的算法

规则梳理
梳理出12条加密规则
ID | 属性 | 说明 | 补充 |
---|---|---|---|
R-01 | 算法本身 | 禁止使用表2中Insecure的算法 | |
R-02 | 算法本身 | 推荐使用表2中Recommended的算法 | |
R-03 | 密钥生成 | 禁止使用不安全的伪随机数生成器(PRNG) | 两个PRNG:math/rand(不安全)、crypto/rand(安全) |
R-04 | 密钥生成 | 加密密钥随机生成,而不是常量硬编码 | |
R-05 | 共享 | 禁止使用相同的密钥或salt进行密钥派生 | 密钥派生函数KDF需要开发者输入随机密码和salt |
R-06 | 分组密码初始IV或计时器 | 分组模式前四种要求IV或计数器唯一、后两种要求IV随机生成 | 6种分组模式(CTR、OFB、GCM、XTS、CBC和CFB) |
R-07 | RSA的padding oracle | 禁止使用不安全的padding oracle | 两种:PKCS#1-v1.5(不安全)、optimal asymmetric encryption padding (OAEP,安全) |
R-08 | http | 禁止使用http | |
R-09 | SSL/TLS应用程序的加密使用 | 不允许使用弱SSL/TLS协议(SSLv2.0, SSLv3.0, TLSv1.0) | |
R-10 | SSL/TLS应用程序的加密使用 | 禁止使用不安全的密码套件 | CBC有padding oracle attack、安全强度不高的弱密码 |
R-11 | SSL/TLS应用程序的加密使用 | 正确验证证书和主机名? | |
R-12 | Go加密库 | 禁止使用Go加密库中不安全的api |

CryptoGo设计
转成中间格式IR
使用go的buildssa包将go项目源码转化成IR中间信息(SSA形式)这一步骤的目的是为后续的静态分析构建一个易于操作的表示形式。SSA形式的中间表示接近Go的源语言,并提供了控制流和数据流的信息流图,从而为污染分析器的构建提供了便利
SSA:每次对变量x赋值都重新使用一个新的变量xi,并在后续使用中选择最新的变量

构建污染分析器
定义四种类别:source、sink、propagator、filter
类别 | 功能描述 | 示例函数 |
---|---|---|
Source | 产生不可信数据 | scanf() , recv() , getenv() |
Sink | 使用不可信数据执行敏感操作 | system() , exec() , fwrite() |
Propagator | 传播不可信数据 | strcpy() , x = y |
Filter | 过滤不可信数据 | html_escape() , validate_input() |

为了便于信息流的跟踪,CryptoGo定义了五种主要的污染分析器:
- 不安全的API调用识别:识别和标记在Go项目中使用的不安全的加密API,如不安全的加密算法、不安全的RSA填充方式等
- 密钥长度跟踪:跟踪使用不同密钥长度的加密API,并确保其安全性。特别是,对于不同的密钥长度,CryptoGo会根据算法类型进行区分
- 函数嵌套跟踪:跟踪嵌套的加密函数调用,确保高层次的加密API调用使用的是安全的底层加密原语
- 随机性跟踪:跟踪加密过程中的随机数生成和使用,确保密钥、IV等参数的生成是不可预测且安全的
- SSL/TLS跟踪:针对SSL/TLS配置进行跟踪,确保使用的是安全的协议版本和加密套件
污染分析
污染分析通过跟踪Go程序中的信息流来检测潜在的密码滥用。分析可以分为加密API调用识别、向后污染跟踪和正向污染跟踪:
-
加密API调用识别:分析发现API调用数>变量数,故而找到SSA中所有调用的形式,根据规则确定是否有误用
-
向后污染跟踪:用于跟踪从API参数到其定义之间的信息流,确保这些参数的定义符合安全要求。例如,在AES-CBC加密中,CryptoGo确保密钥和IV的生成是随机且不可预测的
类型 追踪终止条件 判定依据(是否安全) key length tracking 遇到 *ssa.Const
(常量)若是合法长度常量 → 安全 function nesting tracking 遇到 *ssa.Call
(函数调用)进一步分析函数是否可信 randomness tracking 遇到 *ssa.Call
且为过滤器函数有过滤器 → 安全;否则 → 加密误用 -
正向污染跟踪:用于跟踪从定义到使用之间的流向,特别是在SSL/TLS配置中,确保所有配置参数符合安全要求

实施与评估
实施
- 代码实现: CryptoGo是用大约2236行Go代码实现的。这些代码的主要功能是构建污染分析器,以自动检测Go加密API的滥用
- 基础框架: CryptoGo使用了Gokart扫描器的污染跟踪分析框架。具体来说,利用Go的分析包和SSA(静态单赋值)包实现静态分析功能
- 中间表示法: 输入的Go项目代码被转换为SSA形式的中间表示,这使得对代码的静态分析和信息流跟踪更加容易和有效
评估
-
实验设置
- 数据集选择: 研究团队从GitHub上选择了120个开源Go项目作为数据集,这些项目涉及区块链、公钥基础设施(PKI)、VPN、证书、加密工具和TLS等主题
- 执行环境: 实验是在配备Intel Xeon E5-2682 v4(2.50 GHz CPU和4GB内存)的PC上进行的,平均每千行代码的运行时间为86毫秒
-
实验结果
-
警报总数: 在120个Go项目中,CryptoGo共发出了622个加密API警报,涵盖了83.33%的项目,这些项目至少存在一次加密滥用
-
准确率: 手动源代码分析确认了622个警报中的594个为真阳性,导致CryptoGo的整体准确率为95.50%,28 例误报是由于路径不敏感和调用了非官方 Go 密码库的 API
-
误用类型
- 不安全的加密算法: 在48个Go项目中共发现151个不安全的加密算法使用案例,其中包括MD5、SHA-1等不推荐使用的算法
- 随机性滥用: CryptoGo报告了85例随机性滥用,包括可预测的密钥生成、不安全的初始化向量(IV)等问题
-


限制和讨论
支持的加密库
局限性:
- 官方库为主:CryptoGo主要专注于检测官方Go加密库中的API滥用。这意味着它对第三方加密库或自定义实现的加密算法的检测能力有限。
- 假阴性风险:由于未覆盖所有可能的加密库,使用非官方或第三方加密库的项目可能导致未被检测到的加密滥用,从而产生假阴性结果。
讨论:
- 扩展支持:未来的工作可以考虑扩展CryptoGo以支持更多的加密库,包括流行的第三方库和自定义实现,以提高检测的全面性和准确性。
- 动态识别:通过动态分析技术或基于二进制的检测方法,可以更有效地识别和分析来自非官方加密库的API调用。
路径不敏感性
局限性:
- 路径不敏感分析:CryptoGo采用静态污染分析技术,但这种方法在处理复杂的代码路径时可能存在不足,特别是在存在条件分支或动态调用的情况下。
- 假阳性问题:由于路径不敏感,CryptoGo可能会错误地标记某些安全的API调用为滥用,从而产生假阳性警报。
讨论:
- 改进分析技术:引入路径敏感的静态分析方法或结合符号执行技术,可以减少假阳性的发生,提高检测的准确性。
- 上下文感知:通过增强分析器的上下文感知能力,CryptoGo可以更好地理解代码的执行路径,从而做出更准确的判断。
静态分析的固有限制
局限性:
- 单一应用分析:CryptoGo只能在单个应用程序内部进行分析,无法执行跨应用程序或跨模块的综合分析。这限制了其在复杂系统中的应用效果。
- 动态生成参数:如果加密参数(如密钥、IV)是在运行时动态生成的(例如,用户输入),CryptoGo可能无法检测到这些滥用情况,因为静态分析无法捕捉动态生成的数据流。
讨论:
- 综合分析框架:开发能够进行跨模块或跨应用程序的综合分析框架,可以提升CryptoGo在大型项目中的适用性和检测能力。
- 动态分析结合:将静态分析与动态分析相结合,能够更全面地捕捉运行时生成的加密参数,从而提高检测的覆盖率。
责任披露与开发者反馈
局限性:
- 有限的反馈:研究团队联系了100个带有密码滥用警报的项目开发者,但仅有26名开发者回复并提供了有用的反馈。这限制了对CryptoGo检测结果的全面验证和改进。
- 开发者响应:部分开发者将检测到的问题归因于缺乏密码学知识或遗留代码,这表明工具的检测结果需要结合开发者的实际情况进行解释和处理。
讨论:
- 改进沟通机制:建立更有效的沟通和反馈机制,鼓励更多的开发者参与反馈过程,以便更好地验证和优化CryptoGo的检测能力。
- 教育与培训:针对检测到的常见加密滥用问题,提供相应的教育资源和培训,帮助开发者提升密码学知识,减少未来的滥用风险。
未来工作方向
建议:
- 扩展检测范围:不仅限于官方加密库,还应涵盖更多的第三方库和自定义实现,以提高检测的全面性。
- 结合动态分析:通过结合静态和动态分析技术,提升对运行时生成参数的检测能力,减少假阴性和假阳性。
- 增强路径敏感性:采用更高级的静态分析技术,如路径敏感分析或符号执行,以提高检测的准确性。
- 用户界面和报告优化:改进CryptoGo的用户界面和报告机制,使其更易于开发者理解和使用检测结果,从而更有效地修复安全漏洞。