漏洞背景
使用格式并用开头的补丁,会导致代码执行
影响版本
GNU Patch 2.7.6及以下
(笔者下载了GNU Patch 2.7.1~6源码编译测试,都存在该问题)
GNU Patch 源码下载地址:https://ftp.gnu.org/gnu/patch/
漏洞分析
Poc代码
调试过程
gdb 设置参数运行:
set args test
b do_ed_script
漏洞成因
函数原型
FILE *popen(const char *command, const char *type);
如果type是则文件指针连接到command的,会将的内容传入的输入中,是之前创建的临时文件。
函数通过创建一个管道,调用产生一个子进程,执行一个shell以运行命令来开启一个进程
启动的进程为,而在编辑器中表示后面跟的是操作系统命令,从而导致代码执行。
漏洞demo
popen处fork了父进程和子进程,父进程通过fwrite将运行的命令传入管道,子进程此时打开了/bin/ed,接受了命令,并执行。
运行结果
补丁分析
补丁是创建了临时文件来代替pipe操作,使用文件的方式会使得ed因为无效的命令而退出,而之前的pipe操作遇到无效的命令后会继续执行。但popen的内部实现其实也是通过先fork,再dup2(fd,0),最后执行execl,补丁只是模拟了这一过程,并用文件的方式代替了管道操作。
其他缓解措施:以/bin/ed -r的形式启动,而-r参数的含义是:
-r, –restricted run in restricted mode
运行在严格的模式下,它禁止从当前目录编辑文件和执行shell命令。
参考链接
https://savannah.gnu.org/bugs/index.php?53566
https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_71/com.ibm.aix.cmds2/ed.htm
好了
作为一个懒癌患者
我终于完成了我对老m的承诺
笔芯
去耍了
❤️
领取专属 10元无门槛券
私享最新 技术干货