Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

安全论文每日读 2015.02.07

继续二进制代码中密码学算法识别主题的论文推荐,今天要推荐的论文来自Felix Groebert等在2011年RAID会议上发表的论文Automated Identification of Cryptographic Primitives in Binary Programs,论文可在 http://www.hgi.ruhr-uni-bochum.de/media/emma/veroeffentlichungen/2011/06/21/cryptoPrimitives-raid11.pdf 下载(实际上这个工作在2010年的27C3安全会议上已经发表),在 https://kerckhoffs.googlecode.com/ (需翻墙)可以下载到之前一版更为详细的master thesis和27C3 slides

这篇论文的精华在于提出了利用密码学算法的I/O特性来识别算法原语的思想,密码学设计思想中本就认为一个固定了密钥的加密算法(特别是Block cipher加密算法)应该是一个伪随机的置换,能够将明文空间的样本点“伪随机”地映射到密文空间上去,这个映射关系由密钥决定,一旦密钥固定就是一个确定性的映射,而且一般的其它函数很难产生出撞车的相同映射,因此可以作为密码算法的“指纹”特征。

这个识别方法的优势在于几乎可以完全消灭误报,但是可能会有比较多的漏报。利用这个特性来做密码算法检测存在两个问题,第一,需要知道密钥才能确定下这个映射,即

F(plaintext, key) = ciphertext

这个关系中,但是在二进制代码中精确匹配加密函数边界、明文和密钥并不是那么容易的;第二,性能问题也是非常大的麻烦之一,如果对所有代码部分进行上述检测,势必引起极大的性能开销。

作者提出的解决方案中包括了一些基于观察总结得到的启发式优化手段,例如使用loop detection来定位可能的密码学函数candidates,以及和之前2009年Caballero文章(J. Caballero, P. Poosankam, C. Kreibich, and D. Song. Dispatcher: Enabling Active Botnet Infiltration using Automatic Protocol Reverse-Engineering. In ACM Conference on Computer and Communications Security, 2009.)类似的通过分析函数中arithmetic instructions的比率来识别的技巧,以及利用密钥或者明文一般是一段长度固定的buffer(由密码算法的block而定)等方法来减少复杂度。论文的实验结果在识别率上得到了非常好的确认,作者使用了很多malware作为实验样本,工作同样基于dynamic binary instrumentation,但是这一次框架换成了Intel PIN framework(支持Windows和Linux)。更详细的测试细节可以在作者的master thesis中查看,虽然作者测试了14个程序,但是都是非常小规模的(For the evaluation, we developed 14 testing applications. The testing applications consist of 1102 lines or 835 sloc of C code in total.),而这个方法在真实分析中,往往会遇到时间开销和存储开销(trace记录)过大的问题。