Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

安全论文每日读 2015.02.09

继续二进制代码中密码学算法识别主题的论文推荐,今天要推荐的论文 是2014年发表在IEEE Transactions on Dependable and Secure Computing (TDSC)的论文CipherXRay: Exposing cryptographic operations and transient secrets from monitored binary execution(实际上论文在2012年已经放出了Draft,可以看出为什么在计算机行业里面大家愿意发会议不愿意发期刊~),论文可在 http://www.cs.gmu.edu/~xwangc/Publications/TDSC-CipherXRay-final.pdf 下载,作者来自于美国Geroge Mason University.

这篇论文在我们之前的介绍中提到过,主要思路利用了密码学算法的雪崩特性(即改变输入的一个bit,会引发输出差不多一半的bits翻转)这一经典的性质来做算法识别(实际上,如果讨论更为本质的confusion和diffusion特征可能会更好?),从某种程度上解决了这个领域经常被人问及的一个问题:“密码算法识别如何做的更为通用的识别,能否识别未知的密码算法?”。

论文设计了一个称为CipherXRay的系统,同样还是基于动态的二进制instrumentation(利用PIN framework),通过使用information flow analysis对一个函数的输入输出进行分析,如果某一部分输入完全扩散到了某一部分输出(换句话说,这部分输入的每一个bit都影响了输出部分的所有bit),就说明这个过程很有可能是一个密码算法。然而实际上这个检查工作是非常非常耗时的(在Groebert 2012年RAID论文和我们组2012年ISC的论文中都反映了这个问题),一则需要搜索所有的函数,二则做taint analysis本身就非常的heavyweight,所以作者提出了许多优化方法:考虑使用assembly function的起始和结束作为检查点,同时,检查的对象主要只考虑continous memory buffer,这两点就可以把很多检查开销省下来。

要做一个比较通用的识别系统,作者还考虑了许多其他的细节,例如当一组密码算法组合起来用的时候,他们的系统如何正常的工作;在识别过程中,如何把secret key和一些其它数据(如IV,internal buffer等,这些数据的information flow特性可能是一样的)区分开,如何区分几种密码学原语(block cipher,public key,hash function和stream cipher),如何检测block cipher的几种mode以及如何区分加密与解密等等。

作者在评估部分给出了几个cases的分析,包括混合一堆算法和操作模式让CipherXRay检测,对RSA的加密解密进行检测并提取公钥,对KeePassX软件的检测以及对一些malware里面Proprietary cipher的检测,这里就不展开介绍了。感觉就是这篇文章非常充分的利用了密码学的许多本质特性,把这个领域一下子往前推进了一步。当然,小小的诟病一下,感觉作者的实验还是有些tricky,给出的实验时间开销才数十分钟,如果不是已经缩小了检测的范围,估计是不大可能优化到这么快吧?