//csdn博客目前暂时不再更新了,有兴趣请访问我的技术博客-晓的博客:zhangxiaolong.org
今天做了第二个实验,是条件竞争实验。首先呢,先思考以下两个问题:
1、linux下用open函数打开文件时,要是采用O_WRONLY模式为何容易产生竞争条件漏洞?换成O_WRONLY | O_CREAT | O_EXCL 模式后情况会如何?
解答:open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值, 参考格式>
int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;
打开的操作类型有如下几种
1) O_RDONLY 只读打开
2) O_WRONLY 只写打开
3) O_RDWR 读、写打开
采用O_WRONLY模式用open函数打开文件时,root总是可以创建文件,即便锁文件已经存在,这意味着该锁不能为root正常工作。换成O_WRONLY | O_CREAT | O_EXCL 模式后,就将权限设置为0,使同一用户的其他进程无法获得锁。
2、阅读一篇文章“从一个漏洞谈到ptrace的漏洞发现及利用方法”,地址为http://www.xfocus.net/articles/200304/503.html。描述其中的竞争条件漏洞出现的原因。
解答:代码是在内核线程exec_modprobe()的上下文运行的,程序的current指向这个内核线程的task_struct结构,而与创建这个线程时的current不同,那时候的current指向当时的当前进程,即exec_modprobe()的父进程。内核线程exec_modprobe()从其父进程继承了绝大部分资源和特性,包括它的fs_struct的内容和打开的所有文件,以及它的进程号、组号,还有所有的特权。但是这些特性在这个函数里大多被拚弃了(见源码的19行到42行,这里设置了该内核线程的信号、euid 、egid等,使之变成超级用户),不过在拚弃这些特性之前之前,我们的父进程,或同组进程是应该可以调试该内核线程的。漏洞也就在这里。
在学习完这两个问题之后,我们开始做这个实验。
1.竞争漏洞程序
下面的这个程序,表面上看起

本文介绍了Linux环境下关于条件竞争漏洞的实验,探讨了open函数在不同模式下如何引发竞争条件,并解释了一篇关于ptrace漏洞的文章。通过示例程序,解释了如何利用竞争漏洞向敏感文件如/etc/passwd追加内容,从而获取root权限。实验过程包括建立符号链接、运行攻击脚本以及验证攻击结果。

4454

被折叠的 条评论
为什么被折叠?



