
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の研究者は認証不要で攻撃可能な脆弱性チェーンを特定しました。このリポジトリの2つのスクリプトは以下を示します:
gocd_rce_noauth.py — 認証なしでRCE(リモートコード実行)に至るまでのチェーン全体のエクスプロイト。gocd_urldns.py — URLDNSガジェットチェーンとDNSコールバックを用いたJavaデシリアライズのアウトオブバンド検出(登録済みエージェントの一覧表示には有効な認証情報が必要)。[EN] GoCDはThoughtWorksが維持するCI/CDプラットフォームです。21.3.0以前のバージョンにおいて、SonarSourceの研究者は認証ゼロで攻撃可能な脆弱性チェーンを特定しました。このリポジトリの2つのスクリプトは以下を示します:
gocd_rce_noauth.py — 認証なしでRCE(リモートコード実行)に至るまでのチェーン全体のエクスプロイト。gocd_urldns.py — URLDNSガジェットチェーンとDNSコールバックを用いたJavaデシリアライズのアウトオブバンド検出(登録済みエージェントの一覧表示には有効な認証情報が必要)。[PT] GoCDは組織のソフトウェア配信チェーンにおいて中核的な位置を占めています:ビルド、テスト、アーティファクト生成、本番環境へのデプロイをオーケストレーションします。gocd_rce_noauth.pyによって示されているように、RCEを通じてGoCDサーバーを侵害すると、攻撃者はそのプロセスのすべての段階に対する制御権を取得し、バイナリへのバックドア挿入、アーティファクトの改ざん、または最終ユーザーに製品が届く前にソースコードや認証情報を外部へ漏洩させることが可能になります。このシナリオは、ビルドパイプラインへのアクセスが数千の顧客へのマルウェア配布につながったSolarWinds攻撃(2020年)に類似しています。
[EN] GoCDは組織のソフトウェア配信チェーンにおいて中核的な位置を占めています:ビルド、テスト、アーティファクト生成、本番環境へのデプロイをオーケストレーションします。gocd_rce_noauth.pyによって示されているように、RCEを通じてGoCDサーバーを侵害すると、攻撃者はそのプロセスのすべての段階に対する制御権を取得し、バイナリへのバックドア挿入、アーティファクトの改ざん、または最終ユーザーに製品が届く前にソースコードや認証情報を外部へ漏洩させることが可能になります。このシナリオは、ビルドパイプラインへのアクセスが数千の顧客へのマルウェア配布につながった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 が含まれます — これはエージェントを登録し、認証済みリクエストに署名するために必要な2つのキーです。さらに、プラグインエンドポイントの pluginName パラメータはパストラバーサルシーケンス(../../../../../../)を受け入れ、/proc/self/environ や /etc/go/jetty.xml などのシステム上の任意のファイルを読み取ることができます。
[EN] /go/add-on/business-continuity/api/cruise_config エンドポイントは、認証を要求せずにサーバー設定の完全な XML を返します。この XML には <server> 要素の属性が含まれており、agentAutoRegisterKey と tokenGenerationKey が含まれます — これはエージェントを登録し、認証済みリクエストに署名するために必要な2つのキーです。さらに、プラグインエンドポイントの 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 は、ヘッダー Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)) のみで認証された Java シリアライズオブジェクト(Content-Type: application/x-java-serialized-object)を受け入れます。tokenGenerationKey は CVE-2021-43287 を介して取得されるため、認証情報を持たない攻撃者が悪意のあるガジェットチェーンを送信できます。スクリプトは AspectJWeaver に基づく 2 つのカスタム ysoserial ガジェットを使用します:
AspectJWeaverFileUpload1 — サーバーのファイルシステムに任意のファイルを書き込みます(悪意のあるバージョンで /etc/go/jetty.xml を上書きするために使用)。AspectJWeaverFileRead1 — /dev/random を読み取り、Jetty に再起動を強制して変更された jetty.xml をロードさせ、java.lang.Runtime.exec() を介して注入されたコマンドをトリガーします。[EN] エンドポイント /go/remoting/remoteBuildRepository は、ヘッダー Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)) のみで認証された Java シリアライズオブジェクト(Content-Type: application/x-java-serialized-object)を受け入れます。tokenGenerationKey は CVE-2021-43287 を介して取得されるため、認証されていない攻撃者が悪意のあるガジェットチェーンを送信できます。スクリプトは AspectJWeaver に基づく 2 つのカスタム ysoserial ガジェットを使用します:
AspectJWeaverFileUpload1 — サーバーのファイルシステムに任意のファイルを書き込みます(悪意のあるバージョンで /etc/go/jetty.xml を上書きするために使用)。AspectJWeaverFileRead1 — /dev/random を読み取り、Jetty に再起動を強制して変更された jetty.xml をロードさせ、java.lang.Runtime.exec() を介して注入されたコマンドをトリガーします。gocd_rce_noauth.py — 認証不要の完全チェーン / Full unauthenticated chain