
CakePHP 5.4.2 - Alto - Remoto - Proxy - trustedProxies honra X-Forwarded-* de qualquer REMOTE_ADDR
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-trusted-proxies
Classe: Bypass de redirecionamento HTTPS / spoof de IP-host Alcance: Remoto
CakePHP 5.4.2 (887b641) - Cake Software Foundation
HttpsEnforcerMiddleware com trustedProxies => ['10.0.0.1'] chama setTrustedProxies, que define trustProxy = true e nunca compara a lista com REMOTE_ADDR. Depois disso, scheme(), host() e clientIp() honram X-Forwarded-Proto / X-Forwarded-For / X-Forwarded-Host / X-Real-IP do atacante.
O middleware padrão tem trustedProxies nulo e não habilita isso. A configuração documentada de load-balancer é o caso exposto. Um cliente HTTP não autenticado que não é o proxy listado pode pular o redirecionamento HTTPS e falsificar o IP do cliente e o Host.
| ID | sem CVE ainda |
| Classe | Bypass de redirecionamento HTTPS / spoof de IP-host |
| Alcance | Remoto (HTTP não autenticado; app definiu trustedProxies) |
| CWE | CWE-441, CWE-346 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N |
| Produto | CakePHP |
| Afetado | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | nenhuma. App definiu HttpsEnforcerMiddleware trustedProxies |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Precisa de um app que tenha habilitado trustedProxies (típico de enforce de HTTPS por reverse-proxy). Não precisa conectar de um IP de proxy listado.
| Privilégio | Método / sink | Comprovado em lab ou inferido |
|---|---|---|
| Pular redirecionamento HTTPS / caminho HSTS | GET / HTTP com X-Forwarded-Proto: https | Comprovado em lab. 200, scheme=https, witness em JSON |
Falsificar clientIp() | X-Forwarded-For: 203.0.113.50 | Comprovado em lab. client_ip=203.0.113.50 |
Falsificar host() | X-Forwarded-Host: spoof.invalid | Comprovado em lab. host=spoof.invalid |
Falsificar via X-Real-IP | X-Real-IP: 198.51.100.9 | Comprovado em lab. client_ip=198.51.100.9 |
Burlar ACL de IP / rate limit baseado em clientIp() | Mesmo spoof | Inferido. O padrão remote_addr do RateLimitMiddleware não é este bug |
| Controle negativo | Mesmos cabeçalhos encaminhados em /control (sem trustedProxies) | Comprovado em lab. Ainda 301 para https |
Fechado neste resíduo: padrão trustedProxies => null; o próprio REMOTE_ADDR ainda é o IP da bridge do Docker no lab (192.168.208.1, não o listado 10.0.0.1). Não é RCE. Não é bug de cookie-jar.
Fixe em cakephp/cakephp 5.4.2. ServerRequest::setTrustedProxies():
public function setTrustedProxies(array $proxies): void
{
$this->trustedProxies = $proxies;
$this->trustProxy = true;
$this->uri = $this->uri->withScheme($this->scheme());
}
HttpsEnforcerMiddleware chama isso sempre que trustedProxies é não nulo. Os IPs listados são usados depois como um array_diff na cadeia XFF, não como uma verificação do peer que conecta.
Caminhos errados já registrados: tratar o middleware padrão como este resíduo (não é); chamar o x-forwarded-for do RateLimitMiddleware do mesmo bug (a bakery 5.4.1 já moveu esse padrão para remote_addr); afirmar que o próprio REMOTE_ADDR foi falsificado. Teatro: um reverse shell.
python3 cakephp-trusted-proxies-Abraxas-Labs.py
ou
cd lab
./run.sh
Composer cakephp/cakephp 5.4.2 em PHP 8.3. App mínimo: / usa trustedProxies => ['10.0.0.1']; /control não. HTTP em loopback em 127.0.0.1:19430.
/ sem cabeçalhos encaminhados -> 301 https./control com proto/for/host/real-ip -> 301 https./ com X-Forwarded-Proto: https -> 200, scheme https, trust_proxy=true, REMOTE_ADDR não é 10.0.0.1./ com XFF + Host -> client_ip=203.0.113.50, host=spoof.invalid./ com X-Real-IP -> client_ip=198.51.100.9.SUCCESS cakephp-trusted-proxies pin=5.4.2 how=app remote-addr=192.168.208.1 listed-proxy=10.0.0.1 proto-bypass=200 control-redirect=301 client-ip=203.0.113.50 host=spoof.invalid x-real-ip=198.51.100.9 CAKEPHP-TRUSTED-PROXIES-WITNESS
Só honrar cabeçalhos encaminhados quando REMOTE_ADDR estiver na lista de trusted-proxy (Symfony isFromTrustedProxy()). Lista vazia não deve habilitar a confiança.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/ServerRequest.php · src/Http/Middleware/HttpsEnforcerMiddleware.phpGNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.