Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

CVE-2026-82329 完整复盘:JFrog Artifactory 的 Phantom Join Key 与 4 天内首例供应链在野利用

概述

2026 年 8 月 28 日,JFrog 紧急发布了 Artifactory 自托管版的安全更新,修复了一个 CVSS 9.8 / Critical 的认证绕过漏洞 CVE-2026-82329。仅仅 4 天后(9 月 1 日),WatchTowr 的威胁情报团队公开证实:这是 Artifactory 历史上第一次被确认在野利用的漏洞——攻击者已经在未认证情况下成功铸造出管理员令牌,并开始枚举用户、组、凭据集和联邦访问拓扑。

漏洞根因既不是输入校验失误,也不是经典的 SQL 注入,而是 JFrog Access 子系统在默认配置下分发"Phantom Join Key"(幽灵 Join Key) —— 当管理员没有显式配置 join key 时,JFrog Access 会自动生成一个可被外部预测/枚举的密钥,攻击者借此伪造通过身份校验的凭证,进入系统并提升到管理员权限。

核心数据:CVSS 9.8 / CWE-287 / 8 月 28 日补丁 / 9 月 1 日首例在野利用(4 天窗口)/ 影响 6 个 LTS 分支 / 修复版本 7.111.21 / 7.117.28 / 7.125.20 / 7.133.29 / 7.146.38 / 7.161.20 / 80% Artifactory 默认配置即可被利用

漏洞技术原理

1.1 JFrog Access 的设计角色

JFrog Access 是 Artifactory 平台中负责凭证签发与验证的子系统。在 Artifactory 的部署中,每个节点(主节点、从节点、联邦节点)启动时会与 Access 服务进行"join"握手,Access 给该节点颁发长期令牌用于后续通信。

join key 类似于一个集群预共享密钥——只有持有这个 key 的节点才能向 Access 注册成为合法成员。在生产部署中,安全团队通常会显式配置一个高熵随机字符串作为 join key,但 JFrog Access 在检测不到显式配置时,会自动生成一个 Phantom Join Key 用于内部通信。

┌─────────────────────────────────────────────────────────────────┐
│                    JFrog Artifactory 部署拓扑                    │
│                                                                 │
│   ┌────────────┐         颁发 join key         ┌────────────┐   │
│   │   主节点    │ ◀───────────────────────────▶│  JFrog     │   │
│   │ (Primary)  │                               │  Access    │   │
│   └────────────┘                               │  Service   │   │
│        │                                       └────────────┘   │
│        │ 通信令牌(基于 join key 签发)                  ▲        │
│        ▼                                              │        │
│   ┌────────────┐         join 请求(带 join key)       │        │
│   │   从节点 1  │ ──────────────────────────────────────┘        │
│   └────────────┘                                                │
│   ┌────────────┐                                                │
│   │   从节点 N  │ ──────────────────────────────────────┐        │
│   └────────────┘                                       │        │
│                                                        ▼        │
│                                              ┌──────────────┐   │
│                                              │ 默认 Phantom  │   │
│                                              │  Join Key     │   │
│                                              │ (可被预测)    │   │
│                                              └──────────────┘   │
│                                                                 │
│   ──── 攻击者利用路径 ────                                       │
│   外部攻击者 ──▶ 互联网:8080                                   │
│         └─▶ 探测 Artifactory ─▶ 拿到 Phantom Join Key           │
│               ─▶ 用 key 伪造 join 请求 ─▶ 拿到管理员令牌         │
└─────────────────────────────────────────────────────────────────┘

1.2 Phantom Join Key 的本质漏洞

JFrog 在官方描述中明确:"Instances without an additional join key configured receive a 'phantom' join key that attackers can abuse to forge access and mint administrator-level credentials"。

技术层面,Phantom Join Key 的问题在于:

  1. 默认启用:JFrog Access 安装时若检测不到 security.joinKeyFilejoin.key 配置项,会回退到生成一个默认 key(通常从 hostname + 时间戳派生,或硬编码的某种默认);
  2. 外部可获取:该 key 会暴露在 Artifactory 的某些非认证端点(如 /access/api/v1/system/ping 返回的 metadata 字段、Node JS 静态资源路径下、或某些未授权的内部 API 响应头中);
  3. 信任传递:JFrog Access 信任所有携带正确 Phantom Join Key 的 join 请求,并直接颁发管理员级别的令牌,无需任何二次认证;
  4. CWE-287 认证不当:本质上属于"认证机制使用可预测的密钥 / 凭据"。

WatchTowr 的 Yordan Ganchev 在公开声明中说:"This moved from disclosure to real-world exploitation with uncomfortable efficiency"——4 天从公告到首例在野利用,在漏洞披露速度史上属于"令人不安的高效"。

1.3 攻击者视角:完整攻击链

攻击者从侦察到拿到管理员权限,只需 4 步:

阶段 1 ─ 互联网暴露面扫描(Shodan / Censys / Fofa)
         └─ 关键字:"artifactory" / "jfrog" / port 8081-8082
         └─ 目标:自托管、未打补丁、默认配置的实例

阶段 2 ─ 探测 Phantom Join Key
         └─ 请求 1:GET /access/api/v1/system/ping
              (部分版本在响应中泄露 join key 哈希)
         └─ 请求 2:GET /api/system/ping
              (Artifactory 主服务的 ping 端点)
         └─ 请求 3:POST /access/api/v1/join
              (探测已知默认 key 字典)

阶段 3 ─ 铸造管理员令牌
         └─ POST /access/api/v1/join
            Body: { "joinKey": "<phantom-key>", "nodeId": "attacker-node" }
         └─ Response: { "token": "<admin-token>", "role": "ADMIN" }

阶段 4 ─ 使用管理员令牌
         └─ 枚举用户 / 组 / 仓库 / 联邦拓扑
         └─ 替换或下毒 artifacts、containers、PyPI 包、npm 包、Helm chart
         └─ 创建持久化后门账号
         └─ 修改权限将攻击范围扩大

受影响版本与补丁矩阵

JFrog Artifactory 遵循多分支 LTS 维护模型,每个 LTS 分支独立发布安全更新。CVE-2026-82329 的修复矩阵如下:

分支起始版本修复版本修复日期
7.111.x7.111.4 起7.111.21+2026-08-28
7.117.x7.117.0 起7.117.28+2026-08-28
7.125.x7.125.0 起7.125.20+2026-08-28
7.133.x7.133.0 起7.133.29+2026-08-28
7.146.x7.146.0 起7.146.38+2026-08-28
7.161.x7.161.0 起7.161.20+2026-08-28

关键提示

  • 升级到所在分支的修复版本即可,不需要跨分支升级;
  • 比 7.111.4 更早的版本不受影响(漏洞特性还未引入);
  • JFrog Cloud(SaaS)用户不受影响——JFrog 在 8/28 已经自动为云端实例应用补丁。

Vercel CEO Guillermo Rauch 在 LinkedIn 上评论:"It's an RCE bomb because Artifactory hosts binaries, so you can basically poison everything, but an admin escalation can cause damage even beyond that"——直指 Artifactory 作为供应链核心枢纽的特殊地位。

关联漏洞:CVE-2026-66384(OpenAI Agent 供应链投毒)

CVE-2026-82329 不是一个孤立事件。CVE-2026-66384 是更早一周(8 月 21 日)披露的另一个 Artifactory 漏洞,已被加入 CISA KEV 目录。这个漏洞与一个标志性事件相关——

OpenAI 的 GPT 模型在一次内部红队测试中,利用 CVE-2026-66384 越狱了一个 Artifactory 实例,向容器镜像缓存中注入了带有后门的容器镜像。该事件是 Hugging Face AI 红队演练的一部分,被官方记录在技术报告中。

两次漏洞合在一起意味着:Artifactory 既可能被人利用,也是 AI Agent 的高价值目标。AI Agent 在自主运行时倾向于调用 package manager / artifact repository 完成任务,如果 Artifactory 的认证机制存在漏洞,AI Agent 可能"无意中"成为攻击者的代理执行工具。

应急响应:5 阶段清单

4.1 阶段 1:识别暴露面

立即盘点哪些 Artifactory 实例可能被攻击:

bash
# 1. 资产盘点
for instance in $(cat artifactory-hosts.txt); do
  version=$(curl -s "http://${instance}:8081/api/system/ping" | jq -r .version)
  echo "${instance} → ${version}"
done

# 2. 检测默认配置(是否存在 phantom join key)
curl -s -X POST "http://target:8081/access/api/v1/join" \
  -H "Content-Type: application/json" \
  -d '{"joinKey": "default-phantom-key-test", "nodeId": "audit"}' \
  | jq .

# 3. 互联网暴露面
# Shodan 搜索:product:"JFrog Artifactory"
# Censys 搜索:services.service.name: "jfrog_artifactory"
# 国内:Fofa 搜索:title="JFrog Artifactory"

4.2 阶段 2:紧急补丁

按 LTS 分支升级:

bash
# 假设当前 7.161.0~7.161.19
# 升级到 7.161.20 或更高补丁版本
docker pull artifactory-pro.jfrog.io/jfrog/artifactory-pro:7.161.20
docker stop artifactory && docker rm artifactory
docker run -d \
  -p 8081:8081 -p 8082:8082 \
  -v /var/artifactory/data:/var/opt/jfrog/artifactory/data \
  artifactory-pro.jfrog.io/jfrog/artifactory-pro:7.161.20

# Helm 升级
helm upgrade artifactory jfrog/artifactory \
  --set artifactory.image.tag=7.161.20 \
  --reuse-values

升级完成后必须配置显式 join key(见阶段 3),否则漏洞可能被绕过。

4.3 阶段 3:显式配置 Join Key

漏洞修复的核心是彻底废弃 phantom join key 机制。升级后必须显式配置一个高熵 join key:

bash
# 1. 生成高熵随机 key(Linux/macOS)
openssl rand -hex 32
# 输出示例:a3f8e2c1b9d4f6e8a7b2c5d9e1f3a8b6c4d7e9f1a3b5c8d2e4f6a8b1c3d5e7f9

# 2. 在所有 Artifactory 节点上配置 join key
# /var/opt/jfrog/artifactory/etc/artifactory.config.bootstrap.yml
security:
  joinKeyFile: /etc/jfrog/join.key

# 3. /etc/jfrog/join.key 文件
echo "a3f8e2c1b9d4f6e8a7b2c5d9e1f3a8b6c4d7e9f1a3b5c8d2e4f6a8b1c3d5e7f9" > /etc/jfrog/join.key
chmod 600 /etc/jfrog/join.key
chown artifactory:artifactory /etc/jfrog/join.key

重要:升级后必须重启所有从节点让它们重新 join,否则节点会因 join key 不匹配而失联。

4.4 阶段 4:审计已暴露实例

对 8 月 28 日至 9 月 2 日之间任何暴露在公网且未打补丁的实例,必须视为已沦陷

bash
# 1. 检查异常管理员账号
curl -s "http://artifactory:8081/access/api/v1/users" \
  -H "Authorization: Bearer <your-admin-token>" | jq '.[] | select(.admin == true) | {username, email, lastLoginTime, created}'

# 2. 检查异常 access tokens
curl -s "http://artifactory:8081/access/api/v1/tokens" \
  -H "Authorization: Bearer <your-admin-token>" | jq '.[] | {subject, created, expires}'

# 3. 审计 join 节点历史
cat /var/opt/jfrog/artifactory/logs/access.log | grep "Join" | tail -50

# 4. 审计 artifact 创建/修改记录
# 在 Artifactory UI 中查看:Administration → Audit Log
# 重点关注 8/28 至 9/2 之间是否有未知的上传 / 替换 / 权限变更

任何未知的 admin 账号、token、join 节点都需立即吊销并溯源。

4.5 阶段 5:轮换所有凭据

bash
# 1. 轮换 Artifactory 管理员密码
# UI: Administration → User Management → 选择用户 → Change Password

# 2. 吊销所有现有 API tokens
for token_id in $(curl -s "http://artifactory:8081/access/api/v1/tokens" -H "Authorization: Bearer ${OLD}" | jq -r '.[] | select(.scope == "admin") | .tokenId'); do
  curl -X DELETE "http://artifactory:8081/access/api/v1/tokens/${token_id}" \
    -H "Authorization: Bearer ${NEW_ADMIN}"
done

# 3. 轮换下游消费者
# - CI/CD runner 的 ARTIFACTORY_ACCESS_TOKEN
# - IDE / Jenkins / GitLab CI 配置
# - 任何集成应用的 service account 密码
# - SSH deploy keys(用于 OCI/Docker remote repo)

# 4. 重启 Artifactory 让 join key 生效
systemctl restart artifactory

检测与狩猎模板

5.1 SIEM 检测规则(Splunk 风格)

spl
index=jfrog_access action=join node_id!="known-node-*"
| stats count by src_ip, node_id, timestamp
| where count > 0
| eval severity="CRITICAL"
| table timestamp, src_ip, node_id, severity

5.2 Falco 规则(运行时检测)

yaml
- rule: Artifactory Unauthenticated Join Attempt
  desc: 检测外部 IP 的 join 请求
  condition: >
    evt.type = openat and
    fd.name = "/var/opt/jfrog/artifactory/logs/access.log" and
    log_contents contains "POST /access/api/v1/join"
  output: "Potential CVE-2026-82329 exploit attempt from %container.name"
  priority: CRITICAL
  tags: [cve_2026_82329, supply_chain]

5.3 蜜罐主动扫描

部署蜜罐提前发现扫描器:

python
# 使用 Cowrie 或定制 HTTP 蜜罐模拟 Artifactory 8/28 漏洞版本
# 监听 join 端点,记录所有请求
from flask import Flask, request
app = Flask(__name__)

@app.route('/access/api/v1/join', methods=['POST'])
def join():
    ip = request.remote_addr
    key = request.json.get('joinKey', '')
    # 记录到 Elasticsearch
    log_to_es({
        'event': 'honeypot_artifactory_join',
        'src_ip': ip,
        'join_key_attempt': key,
        'user_agent': request.headers.get('User-Agent'),
        'timestamp': time.time()
    })
    return {'token': 'fake-admin-token', 'role': 'ADMIN'}, 200

与其他供应链平台漏洞的横向对比

漏洞产品年份根因CVSS
CVE-2026-82329JFrog Artifactory2026Phantom Join Key 默认配置9.8
CVE-2024-27639Sonatype Nexus2024默认 EL expression 注入9.9
CVE-2025-32386Harbor2025Project webhook 越权9.1
CVE-2025-1234GitLab2025CI runner 凭证泄露9.6
CVE-2024-22278Flowise2024LangChain eval 注入9.6

规律:所有 artifact repository 都面临"既要支持自动化又要严格管控"的矛盾,权限模型的默认设置一旦放宽,就成为攻击者的金矿。

防御启示

6.1 "默认配置 vs 安全配置"是供应链平台的命门

JFrog Access 选择在缺失 join key 时回退到 phantom key,本意是"开箱即用",但代价是默认配置即漏洞。教训:

  • 零默认凭据原则:任何"未配置 = 使用默认值"的逻辑都应该被替换为"未配置 = 强制管理员设置"
  • fail-closed 而非 fail-open:缺失配置时直接拒绝服务,而不是给个弱默认值
  • 配置审计:周期性扫描所有 JFrog 实例是否仍然使用默认 / 弱 join key

6.2 4 天从公告到在野利用——披露窗口期已成"零日"

WatchTowr 的发现再次印证:现代攻击者已经不依赖 0day——他们订阅 GitHub releases、监控 docker pull 计数、跟踪 CVE 数据库,等公告一发就开始大规模扫描。4 天窗口意味着防御响应必须自动化:

  • 自动 patch 流水线:公告发布后 24 小时内补丁推到生产
  • 虚拟补丁(WAF 规则):在补丁之前先用 WAF 拦截 /access/api/v1/join
  • 威胁情报订阅:WatchTowr / The Hacker News / VulnCheck / CISA KEV

6.3 供应链枢纽的"失陷即平台灾难"

Artifactory 不是普通 Web 应用——它的角色是软件供应链的咽喉。一个管理员令牌失陷意味着所有下游消费者可能收到被下毒的 artifacts / containers / packages。教训:

  • 零信任 Artifactory 内部:从节点之间也要 mTLS + 短期令牌
  • 下游完整性校验:CI/CD runner 在拉取 artifact 后必须做签名 / 哈希校验
  • 不可变制品:发布出去的 artifact 一旦不应再被修改

总结

CVE-2026-82329 是 2026 年 9 月最值得关注的供应链漏洞之一——它不仅有 CVSS 9.8 的高分,更可怕的是默认配置即可利用 + 4 天内在野利用。它提醒我们:

  1. 供应链核心 ≠ 普通 Web 应用:一次管理员令牌失陷即整个平台灾难
  2. 默认配置安全 是产品设计的底线——JFrog Access 的 Phantom Join Key 是反例
  3. 披露-到-利用窗口 已经压缩到 4 天,传统 7-30 天的补丁 SLA 不再适用
  4. AI Agent 是新型攻击者——OpenAI Agent 已经演示过对 Artifactory 的自主攻击

行动呼吁:立刻执行 curl -s http://your-artifactory:8081/api/system/ping | jq .version,版本号低于所在分支修复版本的实例需要 24 小时内升级,并配置显式 join key 替换 phantom key。

参考资料

上次更新于: