
CakePHP 5.4.2 - Alto - Remoto - Cookie - Il cookie jar del client Http confronta i domini come suffisso regex
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
Classe: Cookie leak / plant Reach: Remoto
CakePHP 5.4.2 (887b641) - Cake Software Foundation
CookieCollection::findMatchingCookies usa preg_match('/' . preg_quote($domain) . '$/', $host). Si tratta di un suffisso di stringa, non di un domain-match RFC 6265. Un cookie per api.partner.com viene inviato a evilapi.partner.com. Un cookie per bank.com viene inviato a notbank.com.
Cookie::createFromHeaderString() copia anche Set-Cookie Domain= senza alcun controllo rispetto all'host della risposta. addFromResponse da attacker.test con Domain=victim.internal memorizza quel cookie e successivamente lo allega a victim.internal.
Un'applicazione che utilizza Cake\Http\Client con il jar predefinito su più di un host può far trapelare un cookie di sessione di un partner verso un sibling confuso per suffisso, oppure piantare un cookie su un host interno dopo aver recuperato un URL dell'attaccante. other.com non corrisponde. Non è un bug dei cookie del browser. Lo cakephp/app standard non contatta da solo un secondo host.
| ID | nessuna CVE al momento |
| Classe | Cookie leak / plant (regex suffix domain match) |
| Reach | Remoto (l'app usa Http Client jar tra host) |
| CWE | CWE-565, CWE-201 |
| CVSS | Alto: 8.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N |
| Prodotto | CakePHP |
| Affetto | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | l'app usa Cake\Http\Client con il cookie jar predefinito tra host |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Richiede un'applicazione che mantenga i cookie di Cake\Http\Client su più di un host (OAuth, webhook, un URL fornito dall'utente, una seconda API).
| Privilegio | Metodo / sink | Provato in lab o dedotto |
|---|---|---|
| Far trapelare un cookie memorizzato verso un sibling confuso per suffisso | CookieCollection::addToRequest per https://evilapi.partner.com/ dopo un cookie con dominio api.partner.com | Provato in lab. La richiesta Cookie è sid=SECRET. RFC 6265 non corrisponderebbe |
| Stesso leak per un suffisso registrabile | Dominio cookie bank.com, host richiesta notbank.com | Provato in lab. La richiesta Cookie è sid=SECRET |
| Controllo negativo | Host richiesta other.com | Provato in lab. Nessun header Cookie |
| Piantare un cookie per un host interno | addFromResponse di Set-Cookie: sid=x; Domain=victim.internal da https://attacker.test/ | Provato in lab. Il dominio memorizzato è victim.internal; la richiesta successiva a quell'host invia sid=x |
| Session fixation / sessione partner rubata alla successiva chiamata Client | sid piantato o trapelato usato come sessione API | Dedotto. Il lab si ferma all'oracolo dell'header Cookie |
| L'invio same-host funziona ancora | Dominio cookie api.partner.com verso host api.partner.com | Provato in lab. Atteso, non un bug |
Chiuso su questo residuo: other.com non corrisponde. I cookie jar dei browser non sono questo bug. Nessuna shell. Non è RCE non autenticata su un'app skeleton.
Ho fissato cakephp/cakephp 5.4.2 dopo GHSA-2qh5, GHSA-fxf7, GHSA-vjqc e la nota filename= della 5.4.2. Il matching dei cookie di Http Client è un suffisso regex:
$pattern = '/' . preg_quote($domain, '/') . '$/';
if (!preg_match($pattern, $host)) {
continue;
}
addFromResponse passa l'host della richiesta solo come default. Un attributo Domain= da Set-Cookie lo sovrascrive e viene memorizzato.
Vicoli ciechi già registrati: trattare questo come un bug dei cookie del browser; affermare che anche other.com corrisponde; gonfiare un oracolo dell'header Cookie fino a ATO senza un'app che usi il jar tra host. Teatro: una reverse shell.
python3 cakephp-cookie-suffix-Abraxas-Labs.py
oppure
cd lab
./run.sh
Git clone del tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) in PHP 8.3. Oracolo HTTP loopback su 127.0.0.1:19420. Non è richiesta alcuna origine HTTP aggiuntiva; l'oracolo esegue CookieCollection dal pin.
sid=SECRET dominio api.partner.com. addToRequest https://evilapi.partner.com/ -> Cookie: sid=SECRET.https://other.com/ -> nessun header Cookie.https://api.partner.com/ invia ancora sid=SECRET.bank.com -> https://notbank.com/ invia sid=SECRET.addFromResponse da https://attacker.test/ con Set-Cookie: sid=x; Domain=victim.internal; Path=/. La successiva https://victim.internal/ invia sid=x.SUCCESS cakephp-cookie-suffix suffix-leak=yes control-other=yes plant-domain=yes how=cakephp-5.4.2 CAKEPHP-COOKIE-SUFFIX-WITNESS
Domain-match RFC 6265 (host === domain || str_ends_with($host, '.' . $domain)). Cookie host-only quando Domain è omesso. Rifiutare Domain che non corrisponde per domain-match all'host della richiesta. Rifiutare i suffissi pubblici.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/Cookie/CookieCollection.php · src/Http/Cookie/Cookie.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo lab loopback. Nessuna garanzia.