预备知识
1.竞态条件(race condition),从多进程间通信的角度来讲,是指两个或多个进程对共享的数据进行读或写的操作时,最终的结果取决于这些进程的执行顺序。
2.在ubuntu的11.04或者12.04版本默认配置已经开启了对竞态条件漏洞的保护策略。这个保护策略严格限制了在什么情况下可以去跟踪操作一个符号链接指向的文件。帮助文档中对这个策略是这么描述的:“在所有人都可写的目录(比如说/tmp目录)中存在的符号链接,被链接的文件与目录与符号链接的创建者不同时,被链接的文件不可以被操作”。简单举例来帮助大家理解一下:在/tmp目录下有一个软连接/tmp/abc指向/etc/shadow,而这个软连接是test用户(uid为1000)的用户创建。那么,任何情况下都无法通过这个软连接来修改/etc/shadow文件。
如果实验在ubuntu12.04版本进行,则需要关掉这个防护功能。以下两种方法都可以关闭此配置。
1)$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=0
2)$ sudo echo 0 > /proc/sys/fs/protected_symlinks
本次实验在ubuntu 16.04环境下进行,命令为:
$ sudo sysctl -w fs.protected_symlinks=0
实验目的
通过此次实验,可以熟悉竞态条件漏洞的产生原理、利用方式。除了攻击之外,还会学习到如何制定保护方案抵御竞态条件攻击。
实验环境
实验环境拓扑:
实验机:ubuntu 16.04
固定IP:10.1.1.182
账户密码:seed/dees
实验步骤一
一个看起来很正常的程序但是却存在竞态条件漏洞的程序,源码如下:
/* vulp.c */
#include <stdio.h>
#include <unistd.h>
int main()
{
char * fn = "/tmp/XYZ";
char buffer[60];
FI