2020年8月
Aug. ,2020第36卷第4期Vol. 36, No. 4滨州学院学报Journal of Binzhou University
面向Linux 系统的二进制漏洞
防御技术的设计与实现
路来智,胡雪松
(滨州学院信息工程学院,山东滨州256603)
摘要:Linux 操作系统广泛应用于服务器、工控系统、嵌入式设备、云计算等领域,其安全 性研究具有极其重要的意义。针对修复Linux 二进制漏洞问题,从格式化字符串、栈溢出、堆溢 出等方面对二进制漏洞进行了深入分析。探讨了 Linux 中动态链接技术原理,详细描述了可执 行文件的ELF 结构,深入研究了 pit hook 原理与技术,利用ELF 的数据结构,给出了基于pit hook 的二进制漏洞防御方案,并对该方案进行了设计与实现。经过一系列可靠测试,确定了该 设计的可靠性。
关键词:pit hook ;二进制漏洞;信息安全
中图分类号:TP 301 文献标识码:A EXDI :10.13486/j. cnki. 1673 - 2618. 2020. 04. 0120引言
随着开源软件在世界范围内影响力日益增大,Linux 操作系统的市场份额快速增长。Linux 广泛应 用于服务器、工控系统等领域,所以Linux 系统的安全性研究具有重要的意义,而针对内存中二进制漏洞 的攻击和防御研究则是Linux 信息安全领域的研究热点。常见的防御机制包括:地址空间布局随机 化一利用二进制溢出漏洞,将程序流程指向内存中已设置好的shellcode 的地址,为了防止攻击者每次 都能可靠地跳转到内存中特定的地址-ASLR 技术随机排列进程的关键数据区域的地址,造成难以捕获 shellcode 地址不可执行技术一用于区分内存中指令集与数据,任何标记了 NX 位的区块代表仅供 存储数据使用而不是存储处理器的指令集,处理器不会将此处的数据作为代码执行,这种技术可防止多数 的缓存溢出攻击本文从Linux 可执行文件的运行原理着手,通过pit hook 机制破坏漏洞产生的条件 或替换存在漏洞的函数,达到修补漏洞目的。
1 Linux 二进制漏洞及危害
在Linux 中有几种常见的二进制漏洞,比如栈溢出、格式化字符串、伪造io_file 、条件竞争、堆利用等, 这些漏洞在实际的生产环境中也出现过很多次,并且造成过非常大的影响図o 其中最常见的就是栈溢出, 在C 语言、C++或汇编语言中,对内存的操作稍有不慎就会造成栈溢出,轻则泄露内存数据,重则计算机 被完全控制。同时,相比较其他几种漏洞,栈溢出、格式化字符串漏洞学习和利用的门槛低,更应该引起注 意。
收稿日期=2020 -06 -12
基金项目:滨州市社会科学规划重点研究课题(20 - SKGH - 85);滨州学院教研项目(BYJYYB201723);滨州学院实验技术项目(BZXYSYXM201818)
第一作者简介:路来智(1980—),男,山东滨州人,讲师,硕士,主要从事网络安全研究。E-mail :Uz0429@163. com
• 69 •
滨州学院学报第36卷2ELF动态链接技术与pit hook技术
ELF动态链接技术是基于ELF可执行文件结构本身实现的。ELF是unix类操作系统的用于可执行文件、目标代码文件、共享链接库文件与核心转储文件的格式。总体上分为四个部分:(DELF头(ELF header),对应结构Elf(N)_Ehdr;
(2)程序头表(Program header table),对应结构Elf(N)_Phdr;
(3)节头表(section header table),对应结构Elf(N)_Shdr;
(4)节(section)。
一般情况下,可以使用操作系统中自带的readelf命令查看ELF文件的各个段内容间,如图1所示。
图1磁盘中的ELFS:件程序头
动态链接技术是把程序的模块划分开,形成完全独立的文件,不对组成程序的目标文件进行链接,等到程序运行的时候才进行链接的一种技术。这种技术可以在一定程度上解耦代码,方便不同组织和不同开发者合作开发,并且节省内存,减少页面交换,但是时间成本会高一些。
hook技术是一种拦截用户函数调用的技术。通过hook技术可以实现统计用户对某些函数的调用次数,对函数注入新的功能的目标。在Linux平台,hook技术可以分成用户和内核两个层面。pit hook技术在函数调用其他库中函数时,都会跳转到.pit节中,去执行一个假的函数,然后都会执行一个跳转到.节指定位置的一个指令,该节也是格式固定的,存在相应的结构,可以解析这个结构,得到. 节目标地址的位置。如果能够对这个目标地址的值进行修改,跳转到指定的地址,就可以不执行_川_ runtime_resolve()这个寻真实地址的函数,直接执行指定的代码或程序段,从而实现hook,这就是pit hook技术。
3基于pit hook的二进制漏洞防御实现
•Pit节是代码段,代码段的权限是只读,若需要对其进行写入操作,就需要修改目标地址所在段的写权限。如果修改自己进程中的段的权限,不需要获取root权限;如果需要修改其他进程的段信息,需要获取root权限的。
3.1确定hook目标地址
通过link_map结构和Elf(N)_Dyn结构确定目标地址。link_map结构是一个双向链表的结构。当一个共享链接库被映射到内存之后,链接器会获取到共享库的动态段,把共享库的符号表添加到自身维护的符号表链中。这个符号表链中存储了所有加载到内存中的共享库的符号表,并且,连接器会为每一个共享库维护一个link_map结构,最终生成一个双向链表。通过dladdr函数或dladdrl函数获取当前共享库的link_map结构⑷。Elf(N)_Dyn数组类型的结构,用来定位动态段内部的不同部分。
3.2pit hook对原函数的影响
pit hook能够使用原函数的参数,能够对参数和返回值进行修改。这是因为在pit hook中,修改的•70•
第4期路来智,胡雪松面向Linux系统的二进制漏洞防御技术的设计与实现
是.pit节中跳转的目标地址,并没有改变代码的运行时环境,对运行时堆栈信息,寄存器参数的改变很小,仅有常规的函数入栈和IP寄存器值改变等微小的变化,不影响整体代码运行情况。
3.3基于pit hook技术的漏洞修复技术
3.3.1格式化字符串漏洞利用
printf函数,在参数可控的情况下,会产生任意地址数据泄露,最直接的后果就是通过该漏洞,能够泄露存在libc.so.6系统文件中的system函数地址和字符串“/bin/bash”的地址,从而获取shell权限,这是一种非常严重的漏洞。
例如对于某个存在格式化字符串漏洞的程序,输入以下命令:
payload:aaaaaaaa.%p.%p.%p.%p.%p.%p.%p.%p.%p
可以看到格式化第1个参数就是printf第6个参数,如图2所示,泄露了相邻内存的数据,形成了安全隐患。
图2格式化字符串漏洞
3.3.2格式化字符串漏洞修复技术
对printf函数而言,无法改动其内部实现,也无法重新实现,但是这个漏洞是由于参数控制不得当引起的,可以通过pit hook技术来修复该漏洞。pit hook通过改变和控制传入printf函数的参数,对printf 函数进行hook操作页。
(1)过滤第一个参数中的不可见字符。
(2)如果前两个参数相同,使用putsO函数进行替换。
hook函数callbefor利用hook技术对printf函数参数进行控制。从图3中callbefor函数可以看到,如果前两个参数相同,那么直接使用puts函数就不会触发格式化字符串漏洞,因为puts函数不会解析格式化字符串。
图3对printf的增强和修复
4系统测试
测试环境:测试库libtest.so是已经编译好并放入系统库路径/lib/x86_64-linux-gnu下,该库主要
•71•
滨州学院学报第36卷
提供了testFun()函数,该函数存在格式化字符串漏洞和栈溢出漏洞。脚本exp.py攻击应用了libtest.so 库的程序,利用存在的漏洞实现获取shell,并在之后进行修复。引用存在漏洞的libtest.so被攻击的情况,如图4所示。
图4被攻击成功
linux内核设计与实现 pdf利用测试脚本exp.py拿到shell之后的路径就是当前可执行文件所在路径,权限为运行该可执行文件用户的权限。使用pit hook技术对存在漏洞的函数进行替换和修复。
如图5所示,putSome函数存在较为明显的格式化字符串漏洞,使用pit hook printfO函数,直接替换整个函数体来修复漏洞,如图6所示。
图5存在漏洞的函数
使用这个函数来整体替换掉存在漏洞的putSome函数之后,重新对其使用exp攻击,且多次反复尝试,查看结果,如图7所示。通过测试发现,现在已经无法获取shell权限,且原函数功能正常。
图6替换的函数图7防御成功经过一系列测试,结果表明,针对已知漏洞,设计针对性的修复方案,可以起到较好的效果,并且该设计使用较为简单方便,能够在项目中快速部署。
・72・
第4期路来智,胡雪松面向Linux系统的二进制漏洞防御技术的设计与实现5结论
近几年,二进制漏洞分析与利用技术已经发展得相当成熟,很多技术也被黑产所利用,也正因如此,二进制安全已成为非常重要的课题。该文章利用pit hook技术,通过直接修改GOT表,使得在调用该共享库的函数时跳转到的是用户自定义的hook功能代码,完成对具有漏洞函数的修补,达到保护程序运行的目的。本系统也存在一些遗憾与不足之处,主要有这两个:一是暂时不能对间接引用的库函数进行pit hook修复,只能对直接引用的库函数进行pit hook修复;二是暂时不能对除自己之外的进程进行pit hook修复。这两个不足在一定程度上限制了该设计的功能发挥与拓展。
参考文献:
[1]曾永瑞,李拮.Linux二进制漏洞利用:突破系统防御的关键技术[J].信息安全研究,2018,4(9):806
-81&
[2]O?NEILL R.Linux二进制分析[M].棣琦,译•北京:人民邮电出版社,2017.
[3]GREGG B性能之巅:洞悉系统、企业与云计算[M].徐章宁,吴寒思,陈磊,译.北京:电子工业出版
社,2015.
[4]高凯轩.面向Linux系统的Rootkit检测技术研究与实现[D].西安:西安理工大学,201&
[5]贾靖仪.Linux内核提权攻击防护方法的研究与实现[D].北京:北京交通大学,201&
Design and Implementation of Binary Vulnerability
Defense Technology for Linux System
LU Lai-zhi,HU Xue-song
(^College of Information Engineering,Binzhou University,Binzhou256603,China)
Abstract:Linux operating system is widely used in servers,industrial control systems,embedded devices,cloud computing and other fields.The security research of Linux system is of great significance.In this paper,the problem of repairing Linux binary vulnerability is studied.The binary vulnerability is deeply analyzed from the aspects of format string,stack overflow and heap overflow.The principle of dynamic link technology in Linux is discussed in depth.The ELF structure of executable file is described in detail.The principle and technology of pit hook are further studied.By using the data structure of ELF, the pit hook is designed and implemented based on binary vulnerability defense scheme.After a series of reliable tests,the reliability of the design is confirmed.
Key words:pit hook;binary vulnerability;information safety
(责任编辑:贾晶晶)
・73・
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论