[原创][09] HEVD 内核漏洞之DoubleFetch(竞争条件)
0x00 前言
这一篇介绍一种比较特殊的漏洞,DoubleFetch,本质上说,这也是条件竞争(Racing Condition)漏洞的一种。
实验环境:Win10专业版+VMware Workstation 15 Pro+Win7 x86 sp1
实验工具:VS2015+Windbg+KmdManager+DbgViewer
0x01 概念
竞争条件(Race condition)是由于多个对象(线程、进程)同时操作同一资源,导致系统执行违背原有逻辑设定的行为。此类漏洞在Linux或者内核层面比较常见,当然在Windows或者Web层面也存在。尤其是一些电商网站,加入购物的竞争条件漏洞存在,则可能导致以低价购买多个商品。
了解同步知识的小伙伴应该不难理解,类比操作系统的RAW/WAR/WAW。
下面引用泉哥《漏洞战争》中的小例子:A、B两人同时向一个银行账户存款,此时卡上余额为1000元,其中A存款200元,B存款500元,正常的存款流程如下,两人存款后余额应为1700元。
| 用户A | 用户B | 余额 |
| 检查余额 |
| 1000元 |
|
存入200元 | 1200元 | |
| 检查余额 | 1200元· | |
| 存入500元 | 1700元 |
|
用户A | 用户B | 余额 | 注释 |
|
检查余额
| 1000元 | Time of Check(A) | |
| 检查余额 | 1000元 | Time of Check(B) | |
|
存入200元(丢失) | 1200元 | TIme of Use(A) | |
| 存入500元 | 1500元 | Time of Use(B) |
检查余额的时间可以称为“Time of Check”,存款的时间可以称为“Time of Use”,则该问题可为“TOCTOU”或者“TOTTTOU”,属于竞争条件漏洞。
此类漏洞常见于各类IO操作,如文件操作、网络访问等。
如果攻击者能在某个对象的Time of Check和Time of Use之间争得时间,在此时间内获得操作的机会,那么就有可能破坏程序原定的处理逻辑。比如相对用户B来说,TOU(A)就是对其的破坏行为,使得本应存入的200元被丢弃;同理相当于与用户A,TOU(B)就是对其的破坏行为,只是检查余额是个无害行为,假如它刚好也是个存款行为,那么这笔钱也会被“无效掉”,如下所示,我们将用户B的行为互换,存入的500元也会丢失。
| 用户A | 用户B | 余额 | 注释 |
| 检查余额 | 1000元 | Time of Check(A) | |
| 存入500元(丢失) | 1500元 | Time of Use(B) | |
| 存入200元 | 1200元 | Time of Use(A) | |
| 检查余额 | 1200元 | Time of Check(B) |
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
