Traccar:空密码绕过 LDAP 认证(CVE-2026-126777)
Traccar 3.15 至 6.16.0 接受 LDAP 登录的空密码,知道用户名的攻击者可以登录任意账户,包括管理员。
TL;DR
- Traccar 把空 LDAP 密码发送给目录,并把由此产生的未认证绑定当作成功登录。VulnCheck 于 2026 年 11 月 11 日以 CVE-2026-126777 公开。
- 当启用 LDAP 认证且目录接受未认证绑定时,Traccar 3.15 到 6.16.0 的所有版本都受影响。
- 评分为 CVSS v4.0 9.1 严重和 CVSS v3.1 7.4 高。截至 2026 年 11 月 12 日,没有已知利用,该 CVE 不在 CISA 的 KEV 目录中。
- 请升级到 2026 年 11 月 1 日发布的 6.17.0。如果无法升级,请停用 LDAP 认证,或在升级前阻止访问会话端点。
我受影响吗?
如果以下四个条件全部成立,您就受影响:
- 您运行 Traccar 3.15 到 6.16.0。
- 已配置 LDAP 认证。当存在
ldap.url设置时,Traccar 会创建 LDAP 提供程序。 - LDAP 目录对已知账户名接受未认证绑定。拒绝零长度密码的目录不能通过这种方式利用。
- 攻击者知道一个有效账户名,例如电子邮件地址或登录名。
漏洞位于登录路径,因此影响 Web API 和任何使用 HTTP Basic 认证的客户端。它不依赖 Traccar Web 界面。管理员账户与其他账户一样暴露。
ldap.force 设置决定是所有登录都使用 LDAP,还是 LDAP 与本地账户并行尝试。即使 ldap.force 关闭,只要账户名存在于目录中,部署仍可能通过 LDAP 路径受到攻击。
| 分支 | 受影响版本 | 修复版本 |
|---|---|---|
| 所有版本 | 3.15 到 6.16.0 | 6.17.0,2026-11-01 发布 |
Traccar 的服务器端点无需认证即可报告运行版本:
curl -s https://<traccar-host>/api/server | python3 -c "import json,sys; print(json.load(sys.stdin)['version'])"
在容器或安装目录的配置文件中确认 LDAP 已启用:
docker exec traccar sh -c 'grep -n "ldap\." /opt/traccar/conf/traccar.xml'
软件包安装的 traccar.xml 中也有相同设置。没有 ldap.url 的部署不会使用有漏洞的提供程序。
如何修复?
请升级到 Traccar 6.17.0。该版本包含三行检查,在开始目录绑定之前拒绝 null 或空密码。
- 将 compose 文件中的镜像标签改为
traccar/traccar:6.17.0,然后拉取镜像并重新创建容器。仍引用其他标签的 compose 文件会让易受攻击的镜像继续运行:docker pull traccar/traccar:6.17.0 docker compose up -d - 确认运行版本:
curl -s https://<traccar-host>/api/server | python3 -c "import json,sys; print(json.load(sys.stdin)['version'])" - 对于软件包安装,下载 6.17.0 版本,停止服务,替换程序文件并重新启动。
- 用正确密码测试一次 LDAP 登录,再用空密码测试一次。空密码尝试现在必须失败。
如果无法立即更新,请用以下措施降低暴露。它们都不能替代补丁。
- 删除
ldap.url设置以停用 LDAP 认证,并保留至少一个可用的本地管理员账户。Traccar 会回退到本地用户存储。 - 在代理层把
/api/session和 HTTP Basic 认证限制到受信任网络。这会关闭远程登录路径,但不会修复缺失的密码检查。 - 如果窗口期内不需要,请停用 LDAP 会认证的账户。攻击者仍需要有效账户名,因此移除名称就移除了路径。
根本原因是什么?
LdapProvider.login() 接受任何密码,包括空字符串,并把目录的响应当作密码正确的证明。
该方法先查找账户,然后以该账户和提供的密码进行绑定:
public boolean login(String username, String password) {
try {
SearchResult ldapUser = lookupUser(username);
if (ldapUser != null) {
auth(ldapUser.getNameInNamespace(), password).close();
return true;
}
} catch (NamingException e) {
return false;
}
return false;
}
lookupUser 使用服务账户运行。它返回所请求账户的专有名称。随后绑定使用攻击者提供的密码:
private InitialDirContext auth(String accountName, String password) throws NamingException {
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, accountName);
env.put(Context.SECURITY_CREDENTIALS, password);
return new InitialDirContext(env);
}
Java 的 JNDI 发送带有专有名称和密码的简单绑定。当密码为空时,请求携带零长度凭据。RFC 4513 将其定义为未认证绑定,目录可以接受并返回成功结果。Traccar 从不检查结果是否来自密码认证绑定,因此返回 true。
查找使攻击精确:攻击者不需要猜测密码或专有名称,只需要有效的账户名。
如何被利用?
- 攻击者向
POST /api/session发送登录请求,使用有效账户名和空密码。 - Traccar 用该名称和空密码调用
LdapProvider.login()。 lookupUser()使用服务账户在目录中查找该账户的专有名称。auth()用该专有名称和零长度密码发送简单绑定。- 允许未认证绑定的目录返回上下文。Traccar 把该上下文当作密码检查成功。
- Traccar 为该账户创建会话,如果名称属于管理员账户,则创建管理员会话。
同一路径也可通过 HTTP Basic 认证到达,因为两者使用相同的登录服务。没有公开的概念验证代码,该请求也不需要特殊工具。
攻击如何展开?
有效账户名和空密码到达一个目录不检查密码就应答的 LDAP 绑定,Traccar 把该应答当作登录。
发送 POST /api/session"] --> B["LdapProvider.login()"] B --> C["lookupUser() 找到账户
专有名称"] C --> D["JNDI 简单绑定
不检查密码"] D --> E["目录执行未认证
绑定"] E --> F["为目标账户
签发会话"]
攻击者能做什么?
知道管理员账户名的攻击者无需密码即可获得管理员会话。Traccar 管理员可以查看所有设备的实时位置、路线历史、事件报告和维护记录,并可以列出和管理所有用户、设备、地理围栏、通知和已保存报告。管理员还可以向支持的设备发送命令,这可能使车辆停驶或更改其配置。
非管理员账户的会话可访问该账户的设备和位置。在车队部署中,这仍可能暴露许多车辆的实时位置。只读操作员账户也会暴露其可见设备的相同位置历史,这仍是敏感的车队数据。
该漏洞本身不会在服务器上执行代码。影响是账户权限,而管理员账户是关键。攻击者需要网络访问登录端点和一个有效账户名。不需要用户交互。
为什么修复有效?
修复在任何查找或绑定之前拒绝 null 或空密码:
public boolean login(String username, String password) {
+ if (password == null || password.isEmpty()) {
+ return false;
+ }
try {
SearchResult ldapUser = lookupUser(username);
if (ldapUser != null) {
检查在 lookupUser 之前运行,因此空密码不会到达目录。非空密码仍走正常的简单绑定路径。目录随后判断凭据是否正确,Traccar 只接受目录为该凭据返回的上下文。
修复对该路径是完整的。Traccar 对服务账户查找也使用相同的 auth(),这些调用会传入配置的服务密码。如果把服务密码设为空,部署仍会执行未认证的服务绑定,因此也要保持该设置非空。
如何检查是否已遭入侵?
该 CVE 没有公开指标。请检查目录和 Traccar 访问日志中的模式:
- 来自 Traccar 服务主机、使用零长度密码的简单绑定。
- 来自不符合运维人员常用位置的地址的管理员账户成功会话。
- 反向代理访问日志中来自可信范围之外客户端地址的
POST /api/session请求。访问日志记录路径和客户端地址,而不记录请求正文,因此看不到密码字段本身。
接受未认证绑定的目录可能根据配置将其记录为匿名或普通绑定。失败的尝试可能不留下任何记录。请把意外的管理员会话视为入侵,并轮换该账户的密码及其可访问的 API 令牌。
时间线
- 2026-10-31:修复提交
552c31f2添加空密码检查。 - 2026-11-01:包含修复的 Traccar 6.17.0 发布。
- 2026-11-11:VulnCheck 于 18:41 UTC 发布 CVE-2026-126777。
修复提交比 CVE 记录早 11 天:从提交到版本为 1 天,从版本到公开为 10 天。
常见问题
所有 Traccar 部署都受影响吗?
不是。部署必须使用 LDAP 认证,并且目录必须对该账户名接受未认证绑定。只有本地账户的 Traccar 实例不受影响。
我可以安全地测试目录吗?
可以,使用测试账户和受控客户端。用有效专有名称和零长度密码发送简单绑定,检查目录是否返回成功。不要用生产管理员账户测试。
为什么空密码算作登录?
LDAP 把带名称和零长度密码的绑定定义为未认证绑定。某些目录接受它以支持匿名式访问。Traccar 没有把该结果与密码认证绑定区分开。
需要 Web 界面吗?
不需要。同一登录服务处理 Web 界面、POST /api/session 和 HTTP Basic 认证。任何能访问登录端点的客户端都可以利用该漏洞。
ldap.force 设置会改变暴露吗?
不会。该设置改变哪些账户使用 LDAP,而不改变空密码绑定是否被接受。即使同时启用了本地登录,目录中存在的账户仍可通过 LDAP 路径使用。
6.17.0 还改变了什么?
6.17.0 包含空密码检查及其常规功能和修复。与安全相关的变更是 LdapProvider.login() 中的三行保护。
修复会破坏正常的 LDAP 登录吗?
不会。非空密码仍会对目录执行相同的简单绑定。修复只是在绑定前拒绝 null 或空密码,因此输入密码的用户不会看到变化。
我应该轮换密码吗?
应该,如果可能在没有密码的情况下创建了管理员会话。轮换受影响账户的密码并检查其最近操作。接受未认证绑定的目录没有验证攻击者,因此密码本身没有暴露,但会话暴露了。
参考文献
- CVE-2026-126777 的 VulnCheck 公告,https://www.vulncheck.com/advisories/traccar-3.15-before-6.17.0-authentication-bypass-via-empty-ldap-password(2026 年 11 月 12 日检查)。
- CVE-2026-126777 记录,https://www.cve.org/CVERecord?id=CVE-2026-126777(2026 年 11 月 12 日检查)。
- Traccar 修复提交 552c31f2,https://github.com/traccar/traccar/commit/552c31f2097dbed9edef7cfe174c50b16febdc21(2026 年 11 月 12 日检查)。
- Traccar 6.17.0 版本,https://github.com/traccar/traccar/releases/tag/v6.17.0(2026 年 11 月 12 日检查)。
- Traccar v6.16.0 的
LdapProvider.java,https://github.com/traccar/traccar/blob/v6.16.0/src/main/java/org/traccar/database/LdapProvider.java(2026 年 11 月 12 日检查)。 - Traccar v6.17.0 的
LdapProvider.java,https://github.com/traccar/traccar/blob/v6.17.0/src/main/java/org/traccar/database/LdapProvider.java(2026 年 11 月 12 日检查)。 - RFC 4513 第 5.1.2 节,Unauthenticated Bind Operation,https://www.rfc-editor.org/rfc/rfc4513#section-5.1.2(2026 年 11 月 12 日检查)。
- Traccar 代码仓库,https://github.com/traccar/traccar(2026 年 11 月 12 日检查)。
- CISA 已知被利用漏洞目录,https://www.cisa.gov/known-exploited-vulnerabilities-catalog(2026 年 11 月 12 日检查)。