当入侵者在系统取得一定权限后,他们通常会在系统中植入恶意代码,并利用这些代码为日后的入侵提供方便。增加或修改 ELF 文件正是入侵者植入恶意代码的常用途径。本文将描述一种 Linux 下 ELF 文件的代码签名及验证机制的设计与实现,这种机制能有效防止基于 ELF 文件的恶意代码的入侵,并同时提供了灵活的分级验证机制,使系统在安全性与效率方面取得最佳平衡。
1、引言
随着 Linux 的不断发展,已有越来越多的人开始推广和使用 Linux,其安全性也受到越来越多的挑战。ELF(Executable and Linkable Format)[1] 作为 Linux 下最主要的可执行二进制文件格式,自然成了病毒及各种恶意代码的攻击目标。事实证明,有不少 Linux 下的病毒程序就是通过直接修改 ELF 文件的方法来实现入侵的 [10]。传统的 Unix 系统(包括 Linux)并不会对执行的代码进行完整性和合法性检测,因而让很多病毒程序以及木马程序有机可乘。
代码签名验证是一种能够有效的防止病毒以及其他恶意代码入侵的方法。对于 Linux 下的代码签名验证机制,早几年就已经有人研究。文[2]提出了在安装时进行签名验证的方法,并通过修改 chmod 系统调用控制文件的可执行属性,但这种方法无法检测程序安装后对代码的任何修改,有一定的局限性。文 [3] [4] [5] 描述的都是在执行时进行签名验证的方法,其中 [4] [5] 采用了缓存已验证文件的策略,使效率较 [3] 有很大提高。但是,它们将所有 ELF 文件 "一视同仁",没有主次轻重之分,缺少灵活性。
本文提出了一种改进的基于 ELF 文件格式的代码签名验证机制,通过提供更加灵活的分级验证方式,进一步提高验证效率,并且使系统在安全性与效率方面取得平衡。
2、签名验证原理
我们采用完全符合 PKCS [8] 系列标准的签名验证算法,并兼容所有符合 X509 格式的证书,以 RSA [6 ][7] 非对称密钥体制为基础来完成对 ELF 文件代码的签名验证。
2.1 签名
设被签名的数据为 m,其数字摘要为 h。
其中,Hash 是哈希单向散列算法,如 MD5、SHA-1 等。
设 p,q,d 为签名者的私有数据,他们都包含在签名者的私钥 SK 中;n,e 为签名者的公开数据,并且都包含在签名者的公钥 PK 中。这些数据满足以下要求:
n = pq 其中 p ≠ q,p q 均为大素数;e,d∈RZn 并且 e = d-1,ed ≡ 1mod(n);这里,(n) = (p-1)(q-1)。那么,使用签名者私钥对 h进行加密即可得到签名值 s:
2.2 验证
设被验证数据为m′,其数字摘要为h′。
假设我们已经取得签名者的真实公钥PK,然后我们使用PK中的公开数据e对s进行解密计算,得到还原的数字摘要h′′,这里h′′就相当于是○1式中的h。
|