论文摘要
在Linux操作系统中,存在各类可供利用的漏洞。从后果来区分,有些漏洞会导致系统拒绝服务,有些漏洞会导致信息泄漏,有些漏洞会导致攻击者获取最高权限,其中危害最严重的是可能导致提权攻击的漏洞。从漏洞的来源区分,可以分为用户态软件漏洞和内核漏洞。实际情况下,攻击者在攻击开始时只有少量非root用户权限,攻击者通常利用少量权限,触发内核漏洞,进而执行敏感操作完成提权攻击。本文旨在研究一种轻量级的防御方式,以防御针对内核漏洞的提权攻击。本文的主要工作可以概括为以下方面:1. 研究了Linux内核中常见的安全机制,包括运行级别隔离、UID沙箱、权能机制、强制类型访问控制机制、SELinux系统、名称空间机制和地址空间随机化技术。2. 研究了常见的针对内核漏洞的权限提升攻击以及学界针对这类攻击的防御方式。在这类攻击中,攻击者利用内核代码漏洞,将本身权限从非root用户转换成root用户。从exploitdb攻击数据库中,总结了此类提权攻击运行时的规律,即利用内核代码漏洞,攻击内核函数钩子,使内核执行敏感函数,进行提权操作。3. 针对这种攻击提出一种轻量级的防御方法。通过对内核代码中钩子上下文调用环境插桩,在钩子函数调用前使用简单的操作保存钩子函数的地址,在敏感函数入口处检查已保存过的地址是否合法,判断钩子函数是否指向合法地址,进而判断攻击是否存在。由于在代码中分离了钩子函数的使用和验证,可以在少量的验证点上进行耗时的验证操作,从而达到降低性能开销的目的。4. 实现针对这种攻击的防御系统,包含四个主要模块:a) 插桩模块,用于在钩子函数调用前后添加保存和删除的代码。b) 检查模块,用于在敏感函数入口点处添加保护代码,调用检查函数,若检查不通过,则禁止敏感函数执行。c) 内核kwatch模块,在内核中实现核心功能,包括管理进程相关的虚拟栈、实现插桩模块和检查模块使用的接口。d) 钩子函数提取模块,利用现有的内核插桩点,在kwatch中增加钩子提取功能,在系统运行时自动记录钩子函数及其合法目标地址,实现从提取模式到监控模式的热切换,并且可以从kwatch模块中导出钩子函数配置表,供下次系统启动时使用。5. 使用通用的性能测试工具对系统性能进行测试,使用一个典型的提权攻击验证系统有效性。实验表明,本系统在监控模式工作时,可以以较低的性能开销(5%左右)防止攻击者篡改内核函数钩子完成提权攻击。