3.3.1 受影响的编程语言

3.3.1 受影响的编程语言

1.C/C++

在UNIX或Windows中关闭竞争窗口时,都不可以忽视信号[Rochkind 04]。C/C++中的信号处理有很多攻击者可利用的特性:

(1)信号可以在任何时候中断正常的执行流;

(2)未处理的信号通常默认导致程序终止;

(3)可以在任何时候调用信号处理器,甚至是在一个互斥的代码段中间;

(4)如果攻击者在竞争窗口内向某个进程发送信号,那么就有可能利用信号处理来有效地延长竞争窗口。

当然,程序员应该检查潜在的竞争窗口的信号处理器,正如代码的其他部分一样。另外,伪竞争条件的反常可能性是通过这样的事实引入的:信号处理器可以在竞争窗口中改变对象,这意味着,一个线程有可能让它自身拥有某些类似于竞争条件的东西,只要代码的临界区位于一个信号处理器中就可以了。

2.Java

在Java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生“竞争条件”的现象。这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作是非“原子化”的,可能前一个线程对数据的操作还没有结束,后一个线程又开始对同样的数据进行操作,这就可能会造成数据结果的变化未知。

这时候需要通过对线程的操作进行加锁来解决多线程操作一个数据时可能产生问题。加锁方式有两种,一个是申明Lock对象来对语句快进行加锁,另一种是通过synchronized关键字来对方法进行加锁。以上两种方法都可以有效解决Java多线程中存在的竞争条件的问题。

3.PHP

以相关操作逻辑顺序设计得不合理为例,具体讨论一下成因。在很多系统中都会包含上传文件或者从远端获取文件保存在服务器的功能(如允许用户使用网络上的图片作为自己的头像的功能),下面是一段简单的上传文件释义代码:

这段代码看似一切正常,先通过将文件从源地址复制到目的地址,然后检查的安全性,如果发现不安全就马上通过将其删除。但是,当程序在服务端并发处理用户请求时问题就来了。如果在文件上传成功后但是在相关安全检查发现它是不安全文件删除它以前,这个文件就被执行了那么会怎样呢?

假设攻击者上传了一个用来生成恶意shell的文件,在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意shell的文件。至此,该文件的任务就已全部完成,至于后面发现它是一个不安全的文件并把它删除的问题都已经不重要了,因为攻击者已经成功地在服务器中植入了一个shell文件,后续的一切就都不是问题了。

由上述过程我们可以看到这种“先将猛兽放进屋,再杀之”的处理逻辑在并发的情况下是十分危险的,极易导致条件竞争漏洞的发生。