
CakePHP 5.4.2 - Hoch - Remote - Cookie - Http Client Cookie Jar gleicht Domains als Regex-Suffix ab
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
Klasse: Cookie-Leak / Plant Reichweite: Remote
CakePHP 5.4.2 (887b641) - Cake Software Foundation
CookieCollection::findMatchingCookies verwendet preg_match('/' . preg_quote($domain) . '$/', $host). Das ist ein String-Suffix, kein RFC-6265-Domain-Match. Ein Cookie für api.partner.com wird an evilapi.partner.com gesendet. Ein Cookie für bank.com wird an notbank.com gesendet.
Cookie::createFromHeaderString() kopiert außerdem Set-Cookie Domain= ohne Prüfung gegen den Response-Host. addFromResponse von attacker.test mit Domain=victim.internal speichert dieses Cookie und hängt es später an victim.internal an.
Eine App, die Cake\Http\Client mit dem Standard-Jar über mehr als einen Host verwendet, kann ein Partner-Session-Cookie an ein suffix-verwechseltes Geschwister leaken oder ein Cookie auf einem internen Host platzieren, nachdem eine Angreifer-URL abgerufen wurde. other.com stimmt nicht überein. Dies ist kein Browser-Cookie-Bug. Das Standard-cakephp/app ruft nicht von sich aus einen zweiten Host auf.
| ID | noch keine CVE |
| Klasse | Cookie-Leak / Plant (Regex-Suffix-Domain-Match) |
| Reichweite | Remote (App verwendet Http-Client-Jar über Hosts hinweg) |
| CWE | CWE-565, CWE-201 |
| CVSS | Hoch: 8.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N |
| Produkt | CakePHP |
| Betroffen | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| Auth | App verwendet Cake\Http\Client mit dem Standard-Cookie-Jar über Hosts hinweg |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Erfordert eine Anwendung, die Cake\Http\Client-Cookies über mehr als einen Host hinweg beibehält (OAuth, Webhooks, eine benutzergelieferte URL, eine zweite API).
| Privileg | Methode / Sink | Lab-bewiesen oder abgeleitet |
|---|---|---|
| Ein gespeichertes Cookie an ein suffix-verwechseltes Geschwister leaken | CookieCollection::addToRequest für https://evilapi.partner.com/ nach einem Cookie mit Domain api.partner.com | Lab-bewiesen. Request-Cookie ist sid=SECRET. RFC 6265 würde nicht übereinstimmen |
| Derselbe Leak für ein registrierbares Suffix | Cookie-Domain bank.com, Request-Host notbank.com | Lab-bewiesen. Request-Cookie ist sid=SECRET |
| Negativkontrolle | Request-Host other.com | Lab-bewiesen. Kein Cookie-Header |
| Ein Cookie für einen internen Host platzieren | addFromResponse von Set-Cookie: sid=x; Domain=victim.internal von https://attacker.test/ | Lab-bewiesen. Gespeicherte Domain ist victim.internal; der nächste Request an diesen Host sendet sid=x |
| Session-Fixation / gestohlene Partner-Session beim nächsten Client-Aufruf | Platziertes oder geleaktes sid, das als API-Session verwendet wird | Abgeleitet. Das Lab endet beim Cookie-Header-Oracle |
| Same-Host-Send funktioniert weiterhin | Cookie-Domain api.partner.com an Host api.partner.com | Lab-bewiesen. Erwartet, kein Bug |
Ausgeschlossen bei diesem Überbleibsel: other.com stimmt nicht überein. Browser-Cookie-Jars sind nicht dieser Bug. Keine Shell. Kein unauthentifiziertes RCE auf einer Skeleton-App.
Ich habe cakephp/cakephp 5.4.2 nach GHSA-2qh5, GHSA-fxf7, GHSA-vjqc und der 5.4.2-filename=-Notiz gepinnt. Das Http-Client-Cookie-Matching ist ein Regex-Suffix:
$pattern = '/' . preg_quote($domain, '/') . '$/';
if (!preg_match($pattern, $host)) {
continue;
}
addFromResponse übergibt den Request-Host nur als Standardwert. Ein Domain=-Attribut aus Set-Cookie überschreibt ihn und wird gespeichert.
Bereits festgehaltene Irrwege: dies als Browser-Cookie-Bug zu behandeln; zu behaupten, other.com stimme ebenfalls überein; ein Cookie-Header-Oracle ohne eine App, die den Jar über Hosts hinweg verwendet, zu ATO aufzublähen. Theater: eine Reverse Shell.
python3 cakephp-cookie-suffix-Abraxas-Labs.py
oder
cd lab
./run.sh
Git-Clone-Tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) in PHP 8.3. Loopback-Oracle-HTTP unter 127.0.0.1:19420. Kein zusätzlicher HTTP-Origin erforderlich; das Oracle führt CookieCollection aus dem Pin aus.
sid=SECRET Domain api.partner.com hinzufügen. addToRequest https://evilapi.partner.com/ -> Cookie: sid=SECRET.https://other.com/ -> kein Cookie-Header.https://api.partner.com/ sendet weiterhin sid=SECRET.bank.com -> https://notbank.com/ sendet sid=SECRET.addFromResponse von https://attacker.test/ mit Set-Cookie: sid=x; Domain=victim.internal; Path=/. Der nächste Aufruf von https://victim.internal/ sendet sid=x.SUCCESS cakephp-cookie-suffix suffix-leak=yes control-other=yes plant-domain=yes how=cakephp-5.4.2 CAKEPHP-COOKIE-SUFFIX-WITNESS
RFC-6265-Domain-Match (host === domain || str_ends_with($host, '.' . $domain)). Host-only-Cookies, wenn Domain weggelassen wird. Domain ablehnen, das nicht mit dem Request-Host domain-matcht. Öffentliche Suffixe ablehnen.
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/Cookie/CookieCollection.php · src/Http/Cookie/Cookie.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.