欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][09] HEVD 内核漏洞之DoubleFetch(竞争条件)

[原创][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元
但是如果银行没有很好的同步处理机制,那么可能造成下面的情况,造成最终存款余额为1500元,丢失200元,这是很严重的问题。 
  用户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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功