近日,安全研究人员披露了Spring框架中Spring LDAP模块的一个高危时序漏洞(TOCTOU,Time-of-check Time-of-use),漏洞编号暂未公开。该漏洞涉及LdapClient类在调用.modify().unbind()方法时与AssertionRequestControl联合使用所引发的条件竞争问题,可能导致攻击者绕过LDAP目录的访问控制,执行未授权的修改或删除操作。受影响的版本包括Spring LDAP 2.x系列的部分版本,官方已发布紧急修复补丁。

漏洞核心:TOCTOU与断言控制机制

TOCTOU漏洞是一种经典的并发安全缺陷,指程序在“检查资源状态”与“使用资源”之间存在时间窗口,攻击者可利用该窗口改变资源状态,从而使基于检查结果的操作被误导。在LDAP场景中,AssertionRequestControl(断言请求控制)允许客户端在发送修改或删除请求时附加一个条件断言(例如“仅当条目的status属性值为active时才执行操作”)。LDAP服务器收到请求后会先评估断言是否成立,若成立则执行操作,否则拒绝。

然而,Spring LDAP的LdapClient在实现.modify().unbind()方法时,并未在单个LDAP请求内原子性地完成断言检查与操作执行。具体而言,客户端先通过一次独立的LDAP搜索(或读取)操作来验证断言条件,若通过则再发起修改/删除请求。两次操作之间完全非原子,攻击者如果拥有对同一LDAP条目的写入权限(例如能修改该条目的某个属性),就可以在检查后、操作前微妙的时间窗口内篡改条件属性,使断言失效,从而绕过安全管控。

攻击场景举例

假设一个企业LDAP目录管理员工离职流程:系统仅允许在员工状态为“待离职”时删除其账号。管理员使用LdapClient配合AssertionRequestControl执行.unbind(),伪代码如下:

LdapClient client = ...;
String dn = "uid=john,ou=people,dc=example,dc=com";
AssertionRequestControl control = new AssertionRequestControl("(status=pending)");
client.unbind(dn, control);

理想情况下,LDAP服务器应拒绝删除status不为pending的条目。但由于Spring LDAP的实现缺陷,实际流程变成:客户端先查询该条目的status属性,若等于pending则发送unbind请求(不带断言控制,或使用内置的弱控制)。此时,一个恶意内部用户(或已获得某普通账号权限的攻击者)可以在查询完成后、删除请求到达前,迅速将该条目的status改为active。LDAP服务器收到删除请求时,status已为active,但unbind本身不再校验断言,于是条目被误删。类似的,.modify()操作也会因同样的TOCTOU问题而面临数据被非法篡改的风险。

影响范围与修复

该漏洞影响Spring LDAP 2.3.4及更早版本(具体以官方公告为准)。由于LdapClient是Spring LDAP在2.x版本中推荐使用的流式API,许多使用LDAP进行用户管理、配置中心的Spring Boot应用均可能受影响。官方已在2.3.5版本中修复该问题,修复方式为:将断言检查与操作合并为一个原子LDAP请求,利用ModifyRequestDeleteRequest本身携带的Control,而非分两步执行。同时建议开发者避免在LdapClient.modify().unbind()中使用AssertionRequestControl,转而使用底层LdapTemplateexecuteReadWrite方法,或自行封装原子操作。

安全建议

  1. 立即升级:Spring LDAP用户应尽快将spring-ldap-core依赖升级至2.3.5或更高版本。若使用Maven或Gradle,需同步更新spring-ldap BOM。
  2. 检查业务逻辑:审视所有使用了.modify().unbind()并传递AssertionRequestControl的代码,评估是否存在TOCTOU暴露路径。对于高敏感操作(如删除、修改权限属性),建议引入额外的服务端完整性校验(如LDAP操作日志、二次确认)。
  3. 启用审计追踪:在LDAP服务器端开启详细的操作审计日志,以便在发生异常时追溯时间窗口内的并行操作。
  4. 最小权限原则:严格限制LDAP目录中普通账号的写入权限,减少攻击者可利用的篡改机会。

该漏洞的披露再次提醒开发者,在分布式系统或并发环境中,依赖客户端侧的“检查-使用”模式需格外谨慎。原子操作与服务器端条件控制才是保障数据一致性的根本。Spring团队已发布官方安全公告,建议所有受影响用户立即采取行动。