Linux下ELF文件的代码签名验证机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。
h = Hash(m)
其中,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:
s = E(x) = hdmod n
2.2验证
设被验证数据为m′,其数字摘要为h′。
h′= Hash(m′)
假设我们已经取得签名者的真实公钥PK,然后我们使用PK中的公开数据e对s进行解密计算,得到还原的数字摘要h′′,这里h′′就相当于是○1式中的h。
h′′= D(s) = se mod n
现在,我们比较h′和h′′是否完全相同。如果相同则验证通过,否则验证失败。
3 设计与实现
为了便于描述,我们引入以下几个基本概念:
1. 完全摘要值--指对ELF文件的所有数据以及签名相关数据计算出来的摘要值;
2. 不完全摘要值--指对ELF文件的一部分重要数据(主要是ELF文件头)以及签名相关数
据计算出来的摘要值;
3. 完全签名值--指对完全摘要值加密所得到的签名值;
4. 不完全签名值--指对不完全摘要值加密所得到的签名值;
5. 系统验证级别--指系统级的验证级别,它适用于系统中所有的ELF文件;
6. 文件验证级别--指单个ELF文件的验证级别,它只适用于指定的某个ELF文件。
签名相关数据是指原始文件大小、签名者公钥标识ID、签名算法、签名时间以及签名者基本信息等数据。
3.1 签名策略
对ELF文件的签名是通过签名工具完成的,与操作系统核心无关,同时也和平台无关。签名过程完全遵循第二节中所描述的标准和原理。
首先,我们通过○1式计算得到两种摘要值:不完全摘要值(hpart)和完全摘要值(hcomp)。然后再通过 2 式使用签名者私钥(SKsign)加密摘要值,从而得到两种签名值:不完全签名值(spart)和完全签名值(scomp)。
最后,我们将不完全签名值和完全签名值按照固定的格式组合在一起,并放在被签名文件的末尾。如图3-1所示(括号中的数字表示该字段所占字节数)。
图3-1 代码签名过程及签名值存放
3.2 验证策略
对被执行ELF文件签名值的验证是根据"系统验证级别"和该文件的"文件验证级别"二者进行的。"文件验证级别"是为单个文件设置的验证级别,共分为3个级别,分别由0~2表示。"文件验证级别"保存在每个文件的inode节点标志中,系统管理员可以根据需要设置文件的验证级别。"文件验证级别"的具体含义如表3-1所示。
表3-1:文件验证级别
级别名称说明
0 无保护级不验证该文件的签名值。
1 中保护级验证该文件的不完全签名值。
2 高保护级验证该文件的完全签名值。
"系统验证级别"分为四级,分别由0~3表示。"系统验证级别"通过PROC文件系统来进行控制,可以由管理员根据需要进行设置。"系统验证级别"的具体含义如表3-2所示。
表3-2:系统验证级别
级别名称说明
0 无保护级执行所有程序,不进行任何验证。
1 低保护级根据"文件验证级别"验证被执行文件的签名值。
2 中保护级"文件验证级别"为0时,根据"系统验证级别"验证被执行文件的签名值;
"文件验证级别"不为0时,根据"文件验证级别"验证被执行文件的签名值。
3 高保护级验证所有被执行文件的完全签名值。
3.3验证算法
当用户请求执行某个ELF文件时,系统将根据图3-2所示的流程来判断如何验证该文件的签名值。为了提高系统效率,我们将分别为已验证过"不完全签名值"和"完全签名值"的ELF 文件维护相应的缓存,当再次请求执行这些文件时,就可以不必重复验证其签名值了。
图3-2:系统级签名值验证机制