共计 1873 个字符,预计需要花费 5 分钟才能阅读完成。
介绍
条件竞争破绽产生在多个线程同时拜访同一个共享代码、变量、文件等,但没有进行锁操作或者同步操作的场景中。这个破绽存在于操作系统、数据库、web 等多个层面,像有名的脏牛(dirty cow)。
条件竞争破绽属于服务器端破绽,因为大多服务端框架在解决不同用户的申请时是并发进行的,而开发者在进行代码开发时经常偏向于认为代码会以线性的形式执行,而漠视了并行服务器会并发执行多个线程,这就会导致意想不到的后果;
[!tip]
简略来说,就是多线程同时操作一个对象,而没有对对象进行加锁等保障一致性的操作
举例
以 python 多线程代码举一个不失当的例子
!/usr/bin/env python
from concurrent.futures import ThreadPoolExecutor
def test():
global globalNum
if globalNum >= 5:
print("globalNum >= 5 now")
globalNum -= 1
if name == ‘__main__’:
globalNum = 5
pool = ThreadPoolExecutor(max_workers=10)
for _ in range(5):
pool.submit(test)
咋一看,globalNum 初始值为 5,一个 5 次的 for 循环,每次 globalNum-1,那么按理说只有第一次调用 test 函数的时候 print 会有输入才对,然而咱们运行起来看看后果,却有 2 次 print 输入
而产生这种后果的起因,就是多线程同时操作变量 globalNum,globalNum 还没来得及实现批改就被带入到另一个 test()函数中,也就是对并发操作的敏感变量没有加锁爱护等。
利用场景
[!note]
联合参数在后端的处理过程,所有后端应该对数据进行加锁或者同步的性能点,都可能存在此破绽,如购买、签到、转账、兑换等
总的来说有如下几类:
1. 购买 / 兑换操作
2. 绕过次数限度
3. 绕过多过程解决
上面举几个例子抛砖引玉
购买
假如:用户 A 有 100 元,要买一件 100 元的商品
且后端解决流程:判断 A 的余额是否 >=100 ==> A 的余额 -100,商品数量 +1(没有对 A 的余额进行加锁操作)
失常状况下,A 购买完一件商品余额就清零了,但攻击者通过并发发动 20 个申请,后端接管到后,也会并发发动 20 次上述的解决流程,而在同一时间(A 的余额 -100 之前)去判断 A 的余额是否 >=100,必定都是满足的,那么商品数量就会屡次 +1,也就达到了 100 元购买多件 100 元商品的目标
[!tip]
这个破绽具备偶现性,很受环境因素的影响,比方网络提早、服务器的解决能力等,所以只执行一次可能并不会胜利,尽量多尝试几次
绕过次数操作
最容易想到的就是绕过签到次数限度,大多数平台都是一天只容许签到一次,如果后端对是否签到的判断不严,那么咱们就能够通过并发达到一天签到屡次的目标。这里举一个之前相似的挖到的某网环绕过大小限度的操作。
前提:该云盘普通用户只容许上传 10G 空间,想要取得更大的空间就须要开会员
猜想后端处理过程:辨认上传文件大小 ==> 以后已用空间 + 上传文件大小是否 >=10G ==> <=10G,上传胜利 / >10G,上传失败
我的测试过程:狐疑上传过程中,后端可能没有对已用空间做加锁机制来避免并发操作带来的条件竞争问题,因而我先上传了 1G 的文件,而后 50 个线程并发复制这 1 个文件,最终胜利上传了超过 10G 的文件到服务器中。
绕过多过程解决
这个也是大家据说过最多的,罕用的场景:上传 webshell 时,服务端会先存储该文件,而后判断文件内容是否蕴含歹意内容,如果蕴含就删除;
咱们能够通过并发不停的向服务器上传 webshell,尽管服务器会一直的查看并删除咱们上传的文件,但因为咱们在始终不间断的上传,服务器可能会还没来得及删除 webshell,咱们就曾经执行了相干的命令达到目标了。
修复倡议
1. 对于业务端条件竞争的防备,个别的办法是给对象加锁;
2. 对于文件上传,肯定要通过充沛残缺的查看之后再上传;
3. 在操作系统的角度,共享数据要进行上锁爱护。
扩大
后面始终在说加锁加锁,到底什么是加锁?
线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保障临界区代码的平安。通过锁机制,可能保障在多核多线程环境中,在某一个工夫点上,只能有一个线程进入临界区代码,从而保障临界区中操作数据的一致性。
临界区指的是一个拜访共用资源(例如:共用设施或是共用存储器)的程序片段,而这些共用资源又无奈同时被多个线程拜访的个性。
参考
•条件竞争(Race condition)破绽开掘技巧及实战案例