代码审计--12--竞争条件漏洞

1、漏洞描述

漏洞描述:

Web 应用程序可以同时处理很多HTTP 请求。开发人员经常在不考虑线程安全的情况下使用变量。从而导致对有些共享资源进行混乱操作,整个业务处理流程改变。

在java中比较容易出现条件竞争的问题,很多Servlet开发者常常会忽视一些问题,那就是Servlet实际上是一个单件,除非Servlet实现SingleThreadModel接口。当多线程访问时(即多个用户一起访问时),每个线程得到的实际上是同一个Servlet实例,这样的话,他们对实例的成员变量的修改其实会影响到别人。下面是Servlet的多线程机制:

当客户端第一次请求某个Servlet时,Servlet容器将会根据 web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行,如下图:

代码审计--12--竞争条件漏洞_第1张图片

漏洞案例:

浦发信用卡中心当时一个临时活动,业务类似限时限名额抢购活动,最后实际名额超过了预设名额,导致的原因是因为共享资源没有同步好,对名额进行限制时,服务端会到数据库中查询当前抢购人员数量。

金融行业会比较多出现多线程并发提现、转账等严重问题,大部分原因可能在余额等这样的共享资源没有控制好。

2、漏洞场景复现

漏洞场景一:

定义成员变量userName属于Servlet整个类中共享的资源,在方法体中定义的局部变量name,成员变量(也就是全局变量)随着对象的存在而

你可能感兴趣的:(代码审计)