CVE-2021-43287 CVE-2021-43288 CVE-2021-43289 CVE-2021-43290
作者 / Author: Higor Farias — PRIDE Security
⚠️ 法律声明 / LEGAL DISCLAIMER
[PT] 本材料仅供教育及攻击性安全研究之用。仅在获得明确授权的受控环境中使用。不当使用由使用者自行承担全部责任。
[EN] 本材料仅供教育及经授权的攻击性安全研究之用。仅在获得明确书面许可的受控环境中使用。不当使用由使用者自行承担全部责任。
[PT] GoCD 是由 ThoughtWorks 维护的 CI/CD 平台。在 21.3.0 之前的版本中,SonarSource 的研究人员发现了一条无需任何身份验证即可利用的漏洞链。本仓库中的两个脚本演示了:
gocd_rce_noauth.py — 完整利用漏洞链直至 RCE(远程代码执行),无需凭据。gocd_urldns.py — 通过 URLDNS gadget chain 和 DNS 回调对 Java 反序列化进行带外检测(需要有效凭据以列出已注册的 agent)。[EN] GoCD 是由 ThoughtWorks 维护的 CI/CD 平台。在 21.3.0 之前的版本中,SonarSource 的研究人员发现了一条无需任何身份验证即可利用的漏洞链。本仓库中的两个脚本演示了:
gocd_rce_noauth.py — 完整利用漏洞链直至 RCE(远程代码执行),无需凭据。gocd_urldns.py — 通过 URLDNS gadget chain 和 DNS 回调对 Java 反序列化进行带外检测(需要有效凭据以列出已注册的 agent)。[PT] GoCD 在组织的软件交付链中占据核心位置:它编排构建、测试、制品生成以及生产环境部署。通过 RCE 攻陷 GoCD 服务器(如 gocd_rce_noauth.py 所演示),攻击者即可控制该流程的每一个阶段——能够在任何产品到达最终用户之前,向二进制文件中植入后门、篡改制品,或窃取源代码和凭据。该场景与 SolarWinds 攻击(2020 年)类似,当时对构建流水线的访问导致恶意软件被分发至数千名客户。
[EN] GoCD 在组织的软件交付链中占据核心位置:它编排构建、测试、制品生成以及生产环境部署。通过 RCE 攻陷 GoCD 服务器(如 gocd_rce_noauth.py 所演示),攻击者即可控制该流程的每一个阶段——能够在任何产品到达最终用户之前,向二进制文件中植入后门、篡改制品,或窃取源代码和凭据。该场景与 SolarWinds 攻击(2020 年)类似,当时对构建流水线的访问导致恶意软件被分发至数千名客户。
flowchart TD
ATK(["🕵️ Atacante / Attacker\n(não autenticado / unauthenticated)"])
subgraph EXPLOIT ["Exploração / Exploitation"]
E1["CVE-2021-43287\nLeitura do cruise_config\n(tokenGenerationKey + agentAutoRegisterKey)"]
E2["Path Traversal\nLeitura de /etc/go/jetty.xml\ne /proc/self/environ"]
E3["Registro de agente falso\nFake agent registration"]
E4["Desserialização Java\n(AspectJWeaver gadget chains)\nSobrescreve jetty.xml + restart"]
E5["💥 RCE no servidor GoCD\nRCE on GoCD server"]
E1 --> E2 --> E3 --> E4 --> E5
end
subgraph PIPELINE ["Pipeline CI/CD comprometido / Compromised CI/CD Pipeline"]
P1["📦 Build de artefatos\nBinary/artifact build"]
P2["🧪 Execução de testes\nTest execution"]
P3["📤 Publicação de pacotes\nPackage publication\n(npm, PyPI, Docker Hub...)"]
P4["🚀 Deploy em produção\nProduction deployment"]
P1 --> P2 --> P3 --> P4
end
subgraph IMPACT ["Impacto / Impact"]
I1["🔑 Vazamento de credenciais\nCredential leak\n(tokens, SSH keys, API keys)"]
I2["🦠 Backdoor em artefatos\nBackdoor in build artifacts"]
I3["📂 Exfiltração de código-fonte\nSource code exfiltration"]
I4["☠️ Ataque à cadeia de suprimentos\nSupply chain attack\n(usuários finais afetados / end users impacted)"]
I1 & I2 & I3 --> I4
end
ATK --> EXPLOIT
E5 -->|"Controle total do runner\nFull runner control"| PIPELINE
P1 -->|"Artefatos envenenados\nPoisoned artifacts"| I2
P3 -->|"Pacotes maliciosos\nMalicious packages"| I4
P4 -->|"Produção comprometida\nCompromised production"| I4
E5 -->|"Leitura de secrets\nSecrets read"| I1
E5 -->|"Acesso ao repositório\nRepository access"| I3
| CVE | 类型 / Type | CVSS 3.1 | CWE | 认证 |
|---|---|---|---|---|
| CVE-2021-43287 | 信息泄露 | 7.5 HIGH | CWE-200 | ❌ 无 / None |
| CVE-2021-43288 | 存储型 XSS | 6.1 MEDIUM | CWE-79 | Agent |
| CVE-2021-43289 | 路径遍历 — PUT | 8.1 HIGH | CWE-22 | Agent |
| CVE-2021-43290 | 路径遍历 — GET | 8.1 HIGH | CWE-22 | Agent |
[PT] 端点 /go/add-on/business-continuity/api/cruise_config 在无需认证的情况下返回完整的服务器配置 XML。该 XML 包含 <server> 元素的属性,包括 agentAutoRegisterKey 和 tokenGenerationKey —— 注册 agent 和签名认证请求所需的两个密钥。此外,插件端点的 pluginName 参数接受路径遍历序列(../../../../../../),允许读取系统任意文件 —— 例如 /proc/self/environ 和 /etc/go/jetty.xml。
[EN] /go/add-on/business-continuity/api/cruise_config 端点在无需认证的情况下返回完整的服务器配置 XML。该 XML 包含 <server> 元素的属性,包括 agentAutoRegisterKey 和 tokenGenerationKey —— 注册 agent 和签名认证请求所需的两个密钥。此外,插件端点的 pluginName 参数接受路径遍历序列(../../../../../../),允许读取系统任意文件 —— 例如 /proc/self/environ 和 /etc/go/jetty.xml。
脚本利用的端点 / Endpoints used by the scripts:
GET /go/add-on/business-continuity/api/cruise_config
GET /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../proc/self/environ
GET /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../etc/go/jetty.xml
remoteBuildRepository 的 Java 反序列化[PT] 端点 /go/remoting/remoteBuildRepository 接受 Java 序列化对象(Content-Type: application/x-java-serialized-object),仅使用请求头 Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)) 进行身份验证。由于 tokenGenerationKey 可通过 CVE-2021-43287 获取,未认证的攻击者可以发送恶意 gadget 链。这些脚本使用了两个基于 AspectJWeaver 的自定义 ysoserial gadget:
AspectJWeaverFileUpload1 — 在服务器文件系统上写入任意文件(用于用恶意版本覆盖 /etc/go/jetty.xml)。AspectJWeaverFileRead1 — 读取 /dev/random,迫使 Jetty 重启并加载被修改的 jetty.xml,从而触发通过 java.lang.Runtime.exec() 注入的命令。[EN] 端点 /go/remoting/remoteBuildRepository 接受 Java 序列化对象(Content-Type: application/x-java-serialized-object),仅使用请求头 Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)) 进行身份验证。由于 tokenGenerationKey 可通过 CVE-2021-43287 获取,未认证的攻击者可以发送恶意 gadget 链。这些脚本使用了两个基于 AspectJWeaver 的自定义 ysoserial gadget:
AspectJWeaverFileUpload1 — 在服务器文件系统上写入任意文件(用于用恶意版本覆盖 /etc/go/jetty.xml)。AspectJWeaverFileRead1 — 读取 /dev/random,迫使 Jetty 重启并加载被修改的 jetty.xml,从而触发通过 java.lang.Runtime.exec() 注入的命令。gocd_rce_noauth.py — 完整的未认证攻击链 / Full unauthenticated chain