`

如何利用“竞态条件”进行攻击

阅读更多

高质量程序设计艺术》样章连载——3.3 竞态条件


原书名:Code Quality: The Open Source Perspective

<o:p></o:p>

<!---->1.         <!---->深入剖析著名开源软件的质量问题<o:p></o:p>

<!---->2.         <!---->全面阐述CC++Java代码中的常见编程错误<o:p></o:p>

<!---->3.         <!---->指导你编写优秀代码的圣经<o:p></o:p>

<o:p> </o:p>

更多详细信息http://www.china-pub.com/37661<o:p></o:p>

----------------------------------------------------------------------------------------------------------------------<o:p></o:p>

<o:p> </o:p> 3.3  竞态条件

<!----><!----><!---->在安全领域,当一个原本应该是原子操作的<!---->[1]<!---->操作分两步进行时,我们就说这里出现了竞态条件(race condition)。第一步通常是获取对象的某个数据,而第二步则使用该数据对该对象做某种操作。这种类型的竞态条件通常被称为检查与使用时差time-of-check-to-time-of-useTOCTTOU)错误。<o:p></o:p>

     利用竞态条件进行攻击的一般方式是,特权代码代表非特权用户检查文件的访问权限,然后在该特权代码对文件做进一步的操作时,假设仍然是可以访问的。攻击者通常是在权限检查与其他文件操作之间改变目标文件,以利用竞态条件进行攻击。由于值得攻击的文件通常位于攻击者没有权限读或写的目录中,常用的手段是建立一个符号链接,指向攻击者被允许处理的文件,激活有漏洞的程序对该链接进行操作,然后在这个过程中修改链接,让它指向攻击者想要访问的文件。<o:p></o:p>

<!----><!----><!----><!----><!----><!----><!----><!---->例如,考虑图3-2<!---->[2]<!---->所示的代码片断。这段代码是pppd点对点协议守护程序的一部分,它首先禁止对该守护程序所用的端口写入广播消息(例如“UPS:系统当前使用电池操作”),端口上出现这种消息将搞乱PPP协议处理程序。在文件被打开之后(图3-2:1),该段代码使用获得的文件描述符(ttyfd)来获取并改变对应文件的访问模式(图3-2:2)。到此为止这段代码都是正确的,它使用了fstatfchmod系统调用来直接操作文件句柄。但是,在将文件访问模式恢复到原来值的时候,该代码错误地使用了chmod系统调用。

<!---->

<!---->

<!---->[1]<!----> 原子操作是不能再分割的操作。

<!---->[2]<!----> netbsdsrc/usr.sbin/pppd/pppd/main.c:435-763


<!----><!---->恶意    用户可以执行一个程序(图3-3中的cracker),该程序在pppd调用chmod之前已经将指向原来文件的链接改为指向另一个文件,欺骗pppd去修改该文件的访问权限。在我们的例子中,攻击者可以让符号链接(图3-4中的slink-file)在一开始指向他或者她具有完全访问权限的文件(rw-file),然后将其修改为指向他或者她想要获得完全访问权限的文件(passwd)。事实上,我们所检查的漏洞的确曾经是一个安全建议的主题。<!---->[1]<!---->与指定文件相关的竞态条件是可以避免的,只要在相应的系统调用中使用一个文件句柄即可:fchdirfchflagsfchmodfchownfstatfstatfsftruncate以及futimes。在上述例子中,将最后一个调用改成fchmod(ttyfd, tty_mode)即可解决问题。

<!---->

<!---->

<!---->[1]<!----> ftp://ftp.NetBSD.org/pub/NetBSD/security/advisories/NetBSD-SA2002-010.txt.asc


<!----><!----><!----><!----><!----><!---->在阅读代码的时候如果曾遇到了access系统调用,可能就意味着遇到了一个安全问题。对于以提升了的权限运行的应用程序,系统会记录是哪个用户执行了这个应用,即真实用户real user),以及该应用程序是以哪个用户的权限在运行,即有效用户effective user)。对于某些任务(例如,写入某个系统文件),应用需要使用有效用户的高权限,而对于其他操作(例如,读取某个用户指定的文件),应用只应该使用真实用户的权限。这种“精神分裂”式的运行行为是需要小心谨慎才能不出乱子的,否则非常容易出安全问题。在此类应用中,调用access被认为可以验证某个进程对应的真实用户(而不是有效用户)是否可以读、写或者执行某个文件。当然,在access调用返回之后,恶意攻击者完全可以利用访问检查与实际使用某个底层对象的间隙来将通过检查的对象替换。验证进程的真实用户是否具有适当访问权限的正确方法是,放弃提升的权限(通过调用seteuidsetegid以及setgroups),然后去执行对应的操作(例如,open或者exec)。例如,如下代码中对access调用是多余的,后续对open调用已经足够了:<!---->[1]<!---->


<!---->

<!---->[1]<!----> netbsdsrc/usr.sbin/lpr/lpr/lpr.c:136-620


本文仅供学习交流使用,严禁抄袭和转载,如果将本文内容用于商业用途,将追究法律责任!<o:p></o:p>

好书推荐,精彩明天继续······<o:p></o:p>

 对于一位Developer而言,如何编写高质量的代码也许是一个永恒的话题,这是一门艺术,需要从实践中总结经验。下面我向朋友们推荐两本集大成之作,希望能对您有所启发!<o:p></o:p>

1.修改代码的艺术》(原书名:Working Effectively with Legacy Code<o:p></o:p>

<o:p> </o:p>

<!---->(1)       <!---->修改代码的集大成之作<o:p></o:p>

<!---->(2)       <!---->Amazon全五星图书<o:p></o:p>

<!---->(3)       <!---->适用于各种语言或平台<o:p></o:p>

<!---->(4)       <!---->著译双馨的佳作<o:p></o:p>

更多详细信息:http://www.china-pub.com/36363

<o:p></o:p>

2.《重构——改善既有代码的设计》(原书名:Refactoring: Improving the Design of Existing Code<o:p></o:p>

<!---->(1)       <!---->修改代码的集大成之作软件开发的不朽经典<o:p></o:p>

<!---->(2)       <!---->生动阐述重构原理和具体做法<o:p></o:p>

<!---->(3)       <!---->新添大量重构方法,使你与时俱进<o:p></o:p>

<!---->(4)       <!---->丰富的词汇和背景注释,助你轻松读经典<o:p></o:p>

<o:p> </o:p>

更多详细信息:http://www.china-pub.com/37793

 
分享到:
评论

相关推荐

    网络游戏如何做竞态测试.pdf

    这种测试方法的核心在于识别和分析不同的操作序列对游戏状态的影响,从而发现潜在的竞态条件。例如,当两个玩家几乎同时尝试修改同一游戏资源时,系统可能会表现出不可预测的行为,如数据不一致、操作失败或不公平的...

    57119101_王晨阳_RaceCondition1

    通过这次实验,参与者深入理解了竞态条件的概念,学会了如何构造和实施竞态条件攻击,以及如何应用安全策略来防止此类攻击。这对于理解和增强系统的安全性至关重要,特别是在多线程和并发编程的环境中。 总的来说,...

    Ipc漏洞简单攻击.

    5. **竞态条件**:在多线程或多进程环境下,如果对Ipc资源的访问控制不当,可能导致竞态条件,使得攻击者有机会获取不应有的访问权限。 针对Ipc漏洞的防护措施包括: 1. **安全编程**:开发者应遵循安全编码原则,...

    华中科技大学信息系统安全实验报告

    实验报告由华中科技大学网络空间安全学院的学生罗南清完成,涉及的实验包括缓冲区溢出、Return-to-libc攻击、ROP(Return-Oriented Programming)技术、竞态条件以及Meltdown漏洞。 1. **缓冲区溢出实验** 缓冲区...

    Java 安全编码.pdf

    竞态条件是一种常见的安全漏洞,攻击者可以通过预测竞态条件来攻击用户。 防止竞态条件的方法: * 使用锁机制:使用锁机制来防止竞态条件的发生。 * 使用事务机制:使用事务机制来防止竞态条件的发生。 11. 错误...

    东南大学操作系统实验——RaceConditionAttack实验

    利用竞态条件漏洞发起攻击,并思考防御措施(SEED实验) 此资源包含完整实验报告(加上你的学号姓名即可提交)

    补丁 重视Linux内核的安全漏洞.pdf

    在执行setsid0时,由于没有适当的同步机制,可能导致并发操作时出现竞态条件,进而影响系统的正常运行,比如造成程序崩溃或数据错误。 【应对策略与补丁】 对于上述提到的安全漏洞,开发者和系统管理员应保持对...

    Attacking the Core.txt

    - **AMD64 和竞态条件利用**:介绍了一种针对 AMD64 架构下的竞态条件进行攻击的方法。 #### 四、高级场景 ##### 4.1 PaX KERNEXEC & 内核/用户空间分离 PaX KERNEXEC 是一种用于增强内核安全性的技术。它通过将...

    内核漏洞利用技术文章集合

    常见的内核漏洞类型有缓冲区溢出、整数溢出、类型混淆、竞态条件等。 缓冲区溢出是其中最经典的一种,它发生在程序尝试写入超过分配内存空间的数据时。在内核层,这种溢出可能导致攻击者覆盖关键数据,比如函数指针...

    华中科技大学网安学院信息系统安全实验报告

    - DirtyCOW(Dirty Copy-on-Write)漏洞:利用了Linux内核中的一个竞态条件漏洞,允许攻击者修改受保护的文件。 - Meltdown攻击:是2017年发现的漏洞,允许用户级程序绕过CPU硬件保护机制,读取内核内存中的数据。...

    CCS&amp;NDSS内核漏洞相关论文

    4. 竞态条件:在多线程环境中,当两个或多个线程对共享资源的访问顺序依赖于线程调度,就可能出现竞态条件。这可能导致数据不一致或安全问题。解决方案包括使用锁、信号量或其他同步机制,以及设计无锁的数据结构。 ...

    linux提权工具利用2.6内核漏洞

    1. **漏洞分析**:这些工具首先会寻找和分析内核中的漏洞,比如缓冲区溢出、竞态条件、权限绕过等。在2.6内核中,可能存在如 CVE-2007-3899、CVE-2008-1678 等已知漏洞,它们可能被用于提权。 2. **exploit开发**:...

    Exploit-Exercises Nebula全攻略——Linux平台下的漏洞分析入门

    竞态条件是一种常见的安全问题,本关卡将指导用户如何识别和利用这类漏洞。 #### Level11——又一可执行任意文件漏洞 这一关卡继续探讨了可执行任意文件的漏洞,并提供了更深入的学习机会。 #### Level12——攻击...

    基于gdb的Android软件漏洞挖掘系统.pdf

    3. **竞态条件**:在多线程环境中,不当的同步可能导致竞态条件,进而引发不可预测的行为。GDB可以用于观察和调试线程间的交互,识别潜在的竞态条件。 4. **SQL注入**:如果应用的数据库操作不安全,可能会受到SQL...

    信息安全_数据安全_eu-16-Shen-Rooting-Every-Android.pdf

    而Broadcom WEXT的Use-After-Free漏洞(CVE-2016-2475,Android-ID-24739315)可以通过竞态条件和对象重新填充来触发。这些漏洞的挖掘过程涉及到深入的数据分析,包括识别漏洞触发条件、理解内存管理机制以及制定...

    macOS 从运行库劫持到内核提权.pdf

    另一个CVE-2015-3709案例中,不良的路径检查和时间-时间竞态条件允许普通用户加载未经签名的内核扩展。还有CVE-2018-4139中提到的,由于没有遵守MIG所有权规则,在kextd中发生了mach_port双重释放的错误。这些问题...

    Computer Vulnerabilities

    - **临时文件竞态条件**:创建临时文件的过程中可能出现的竞态条件问题。 - **序列化错误**:对象序列化过程中发生的错误,可能导致数据损坏或安全问题。 以上是对计算机漏洞的基础概念及其分类的一个较为全面的...

    linux 2.6.17 提权

    在2.6.17这个版本中,可能存在如缓冲区溢出、整数溢出、权限混淆、race condition(竞态条件)等类型的漏洞。 缓冲区溢出漏洞是最常见的提权手段之一,当程序处理输入数据时没有正确检查边界,攻击者可以通过构造...

    华为C/C++语言编程与安全编程规范

    - **防止竞态条件**:在多线程编程中,合理使用锁或其他同步机制,避免竞态条件。 - **避免悬挂指针**:确保在删除对象后,所有指向该对象的指针都失效。 - **防止整数溢出**:进行算术运算时,注意整数溢出问题...

Global site tag (gtag.js) - Google Analytics