K-Hunt: Pinpointing Insecure Cryptographic Keys from Execution Traces

In 2018 ACM SIGSAC Conference on Computer and Communications Security (CCS ’18)

October 15–19, 2018, Toronto, ON, Canada. ACM, New York, NY, USA, 14 pages. https://doi.org/10.1145/3243734.3243783

摘要

当代密码学最主要的保密内容是加密密钥,找到程序中密钥如何使用和发现不安全密钥至关重要。本文开发了K-Hunt系统,在二进制可执行程序中识别不安全密钥。根据加密操作定位密钥存储内存缓冲区,跟踪其来源和传播,识别如固定密钥、不安全协商密钥、可恢复密钥,进而识别出带不安全密钥的未知加密算法和自定义加密实现。

测试了10个加密库和15个加密应用,包含标准和自定义的对称密码、非对称密码、流密码、数字签名,发现了22/25程序存在不安全密钥,其中包括多种标准密码库。

简介

软件实现中的不安全密钥行为,如缺少随机性(非随机产生),密钥泄露(Heartbleed),密钥伪造(非授权加密),开发滥用(静态对称密钥,相同IV值),需要对密钥安全性进行识别和探测。

密码算法复杂(对称、非对称、流、数字签名等),密码软件复杂(使用多种加密技术),密码软件专有(无源码,只有可执行文件)。

K-Hunt分析密钥产生、传输、使用来定位密钥位置,根据运行信息定位密钥代码块和密钥存储的内存缓冲区,同时在程序运行时跟踪密钥来源和传输过程。

贡献

  •  在程序执行时识别不安全的密钥,如固定生成密钥、不安全协商密钥、可恢复密钥,此方法不依赖签名,可用于标准和非标准加密算法。
  •  开发了K-Hunt工具,集成多种技术有效优化了二进制代码分析能力。
  •  在实际软件的多种加密算法中可有效识别出加密库和应用的不安全密钥。

讨论三种不安全密钥

1、可控制生成的密钥(DGK) 如硬编码密钥,非强随机可爆破密钥

2、不安全协商密钥(INK) 密钥协商时每一方都影响密钥的输出,若某一方不经过其他方就生成共享密钥,则认为此密钥存在安全隐患。

3、可恢复密钥(RK)通过代码注入或侧信道攻击获取内存中存储的密钥信息。操作系统在密码操作后通常不会清除内存区域,密钥依然保存在栈或堆中,直到此区域被重新分配覆盖,一般是应用来实现,但是开发人员不都是密码学专家,所以会造成内存密钥泄露。

需要完成的工作:

1)定位加密代码块

2)代码块中识别出密钥

3)密钥如何生成,哪些数据受密钥影响

4)监控密钥传播过程,加密后是否在内存释放

面临的挑战

1)如何识别密码操作,尤其是非标准自定义算法

2)如何识别密钥

3)如何在复杂程序中检测不安全密钥

解决方法

1)独立实现识别密码操作

针对自定义密码算法,使用动态分析技术识别核心代码块,根据几条限制条件

a)大量使用算术运算符

b)生成高随机的数据流

c)与输入大小相对应长度的运行操作

2)定位密钥

代码块处理的输入: 加密 — 明文+密钥  解密 — 密文+密钥  签名– 消息+密钥+签名

其中消息和密钥用于密码操作,且密钥通常比较短小(128bit),密钥与其他参数保存位置也不同,生成的数据来源也不同,如密钥来自伪随机数生成器,明文/密文/消息等来源于网络或文件读取

3)检测不安全密钥

以密钥为中心的策略,以识别出的密钥来深入检测密钥来源和传输过程。

如图1,密钥来自于keygen函数,通过检查输入源发现密钥只有32bit,检测密钥缓冲区发现其在程序运行结束后未释放。围绕密钥进行前向和后向的密钥追踪。

研究范围

研究二进制可执行程序不安全的密钥 — 密钥由某输入生成、共享密钥是否由某一方单独生成、密码操作后密钥内容是否释放。

x86/64可执行程序,无源码,无调试信息。

只关系与密钥操作有关的密码算法。标准和非标准的密码算法

定位密钥

1、密码基础块的识别

定义一:密码基本块 1)算术运算 2)数据流与密钥流的多次交叉运算 3)数据具有高随机性

计算每一个代码块中算术比特位操作比率,超过某阈值(15%)则为可能密码相关代码块;若指令中存在明确的密码算法指令,如AES等,则判定为密码代码块。

然后判断此代码块是否是数据相关的,即输入不同长度数据,统计代码块执行数是否具有相关性。若执行次数与输入输出大小线性相关,则认定为疑似密码相关代码块。

定义二:数据束 在程序执行的指令操作中生成的所有数据,大小就是数据集数。

比如图1b中地址 0x0040109A处read指令,读取256次。一旦数据束建立,检测其随机性。使用ent方法,包括卡方分布和蒙特卡洛π近似方法判定是否随机。

根据以上方法,可以识别出 代码块 0x0040108E -0x004010B2是密码相关操作:存在算数和比特位操作;执行数与输入数据大小相关;访问多个内存缓冲区;生成高随机数据。

2、密钥缓冲区识别

加密、解密、签名都需要密钥作为输入参数

定义三:密码缓冲区指在密码基本块内一个数据束中的所有执行的内存地址,大小等于包含的不重复地址数

1)缓冲区大小 密钥缓冲区通常较小,密钥保存在定长的内存缓冲区,密文/明文/消息一般取决于输入长度

2)运行时内容 密钥和其他输入由不同函数生成,密钥来自于密钥生成函数或伪随机数生成器,密文/明文/消息来自于文件或网络读取。

检测不安全密钥

动态污点跟踪技术,针对函数层变体进行分析

污点源:无输入00   本地输入01  远程输入10

定义四:缓冲区输入长度(IL)指程序输入的字节数

K-Hunt使用细粒度污点分析去追踪污点标记的每一条指令和传输过程,对数据的读写操作进行污点标记,即数据的产生和传输过程。函数的数据来源可以联合进行标记,如11表示本地+远程输入。计算IL,是否具有高随机性。追踪所有的IL值,存在内存写操作时,记录当前IL,及函数返回后的IL,标记针对某函数输入输出buffer的映射。

污点水槽分析

1)DGK 如果密钥来自于非输入,则可能是固定密钥。如果密钥长度IL小于128bits,则认为密钥不安全。

2)INK 若污点标记的密钥只包含一方来源(本地或远程),则认为协商密钥不安全

3)RK 密码操作结束后,内存缓冲区中依然存在1/3以上密钥内容,则认为是可恢复密钥

限制

可定位密钥,但是不知道执行的密码函数算法。可通过C = E(K,P) 爆破处算法E,但不适用于自定义密码算法。

污点传播作用于函数层,函数内所有数据都被污点标记,导致不安全的密钥也会识别为安全。

无法探测存放于CPU寄存器中的密钥安全性。

K-Hunt下一步可以作用于手机App,检测不安全密钥

结论

K-Hunt,根据输入的执行文件识别不安全密钥的动态分析系统。根据密码操作定位密钥位置,根据密钥生成和传递过程识别三种不安全密钥类型:固定密钥、不安全协商密钥、可恢复密钥。测试了10个密码库和15个包含密码操作的应用。成功识别对称、非对称、流密码和数字签名中的密钥。22/25个程序中存在不安全密钥,包括设计良好的开源密码库,并已通知软件厂商进行及时修复。

您可能还喜欢...