
CakePHP 5.4.2 - Élevé - À distance - Proxy - trustedProxies honore X-Forwarded-* depuis n'importe quel REMOTE_ADDR
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-trusted-proxies
Classe : contournement de redirection HTTPS / usurpation IP-hôte Portée : distante
CakePHP 5.4.2 (887b641) - Cake Software Foundation
HttpsEnforcerMiddleware avec trustedProxies => ['10.0.0.1'] appelle setTrustedProxies, ce qui définit trustProxy = true et ne compare jamais la liste à REMOTE_ADDR. Ensuite, scheme(), host() et clientIp() honorent les en-têtes attaquants X-Forwarded-Proto / X-Forwarded-For / X-Forwarded-Host / X-Real-IP.
Le middleware par défaut a trustedProxies à null et n'active pas ce comportement. La configuration documentée pour répartiteur de charge est le cas exposé. Un client HTTP non authentifié qui n'est pas le proxy listé peut contourner la redirection HTTPS et usurper l'IP client et l'hôte.
| ID | pas encore de CVE |
| Classe | contournement de redirection HTTPS / usurpation IP-hôte |
| Portée | distante (HTTP non authentifié ; application avec trustedProxies défini) |
| CWE | CWE-441, CWE-346 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N |
| Produit | CakePHP |
| Affecté | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | aucune. Application avec HttpsEnforcerMiddleware trustedProxies défini |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1 uniquement |
Nécessite une application ayant activé trustedProxies (application typique de redirection HTTPS via proxy inverse). Pas besoin de se connecter depuis une IP de proxy listée.
| Privilège | Méthode / cible | Prouvé en labo ou déduit |
|---|---|---|
| Contourner la redirection HTTPS / le chemin HSTS | GET / HTTP avec X-Forwarded-Proto: https | Prouvé en labo. 200, scheme=https, témoin dans le JSON |
Usurper clientIp() | X-Forwarded-For: 203.0.113.50 | Prouvé en labo. client_ip=203.0.113.50 |
Usurper host() | X-Forwarded-Host: spoof.invalid | Prouvé en labo. host=spoof.invalid |
Usurper via X-Real-IP | X-Real-IP: 198.51.100.9 | Prouvé en labo. client_ip=198.51.100.9 |
Contourner une ACL IP / limitation de débit basée sur clientIp() | Même usurpation | Déduit. Le remote_addr par défaut de RateLimitMiddleware n'est pas ce bug |
| Contrôle négatif | Mêmes en-têtes forwarded sur /control (sans trustedProxies) | Prouvé en labo. Toujours 301 vers https |
Fermé sur ce point restant : trustedProxies => null par défaut ; REMOTE_ADDR lui-même reste l'IP du bridge Docker dans le labo (192.168.208.1, pas le 10.0.0.1 listé). Pas de RCE. Pas un bug de cookie-jar.
J'ai épinglé 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 l'appelle dès que trustedProxies est non nul. Les IP listées sont ensuite utilisées comme un array_diff sur la chaîne XFF, et non comme une vérification du pair qui se connecte.
Fausses pistes déjà consignées : traiter le middleware par défaut comme ce point restant (ce n'est pas le cas) ; qualifier le x-forwarded-for de RateLimitMiddleware du même bug (la bakery 5.4.1 a déjà déplacé ce défaut vers remote_addr) ; prétendre que REMOTE_ADDR lui-même était usurpé. Théâtre : un reverse shell.
python3 cakephp-trusted-proxies-Abraxas-Labs.py
ou
cd lab
./run.sh
Composer cakephp/cakephp 5.4.2 en PHP 8.3. Petite application : / utilise trustedProxies => ['10.0.0.1'] ; /control non. HTTP en loopback sur 127.0.0.1:19430.
/ sans en-têtes forwarded -> 301 https./control avec proto/for/host/real-ip -> 301 https./ avec X-Forwarded-Proto: https -> 200, scheme https, trust_proxy=true, REMOTE_ADDR n'est pas 10.0.0.1./ avec XFF + Host -> client_ip=203.0.113.50, host=spoof.invalid./ avec 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
N'honorer les en-têtes forwarded que lorsque REMOTE_ADDR figure dans la liste des proxys de confiance (Symfony isFromTrustedProxy()). Une liste vide ne doit pas activer la confiance.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/ServerRequest.php · src/Http/Middleware/HttpsEnforcerMiddleware.phpGNU Affero GPL v3.0. Voir LICENSE. Labo en loopback uniquement. Aucune garantie.