PoC — Ursprungsvalidierungsfehler ermöglicht die Exfiltration von Entra ID PRT SSO-Cookies in linux-entra-sso (GHSA-g9vc-5j77-f2cm, CVE-2026-87005, CVSS 5.3).
CVE-Status: beantragt, Zuweisung ausstehend. Dieser Fund wird als GHSA-g9vc-5j77-f2cm veröffentlicht. Bei der CVE-Zuweisung wird dieses Repository in
CVE-YYYY-NNNNN-linux-entra-sso-PoCumbenannt und dieses Banner durch den CVE-Link ersetzt.
| Forscher | Dostxodjayev Abdullox (@squeeze440) |
| Advisory | GHSA-g9vc-5j77-f2cm |
| CVSS 3.1 | 5.3 (Mittel) |
| Schwachstelle | CWE-346, CWE-20 |
Platform.SSO_URL in linux-entra-sso fehlt ein abschließendes Pfadtrennzeichen, sodass die Firefox/Thunderbird-Schutzprüfung onBeforeSendHeaders (e.url.startsWith(Platform.SSO_URL)) durch jede vom Angreifer registrierte Domain der Form login.microsoftonline.com.<angreifer-domain> umgangen wird. Dadurch erwirbt und injiziert die Erweiterung ein aktives Entra ID Primary Refresh Token (PRT) SSO-Cookie in Anfragen, die an den eigenen Host des Angreifers gesendet werden.
siemens/linux-entra-sso — Browser-Plugin für Linux zum SSO bei Microsoft Entra ID über den lokalen Microsoft Identity Broker (Intune). Der Firefox-Build ist praktisch ausnutzbar; Thunderbird teilt den identischen verwundbaren Codepfad, ist aber derzeit nicht über diesen Vektor erreichbar (siehe Details); Chrome/Chromium ist nicht betroffen (siehe Details).
v1.10.0 (Commit 676854c, aktueller main-Stand vom 2026-08-03). Im aktuellen Release bestätigt vorhanden, d. h. nicht behoben durch GHSA-52rj-42vh-2rxc / CVE-2026-42177 (dieser Fix betraf nur den Chrome-declarativeNetRequest-Adapter).
5.3 (Mittel) — CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N
AC:H — die Ausnutzung erfordert, dass die Erweiterung eine gewährte Host-Berechtigung besitzt, die den vom Angreifer konstruierten Hostnamen abdeckt. In der Praxis muss der Angreifer das Opfer dazu bringen, auf der Seite des Angreifers auf den Link „Background SSO (enable)“ der Erweiterung zu klicken — eine Bedingung außerhalb der direkten Kontrolle des Angreifers, was der Komplexitätsbegründung des verwandten GHSA-52rj-42vh-2rxc entspricht.UI:R — die Berechtigungserteilung ist ein expliziter Benutzerklick.C:H — ein gestohlenes PRT SSO-Cookie ist direkt gegen login.microsoftonline.com wiederverwendbar, um Access-/ID-Token für jede App auszustellen, der das Opfer zugestimmt hat (vollständige SSO-Sitzungsübernahme).I:N/A:N — der Fehler offenbart ein Credential, verändert aber selbst keine Daten und beeinträchtigt nicht die Verfügbarkeit.Ursache — src/platform.js:9:
static SSO_URL = "https://login.microsoftonline.com";
Kein abschließendes /.
Verwundbare Prüfung — platform/firefox/js/platform-firefox.js:55-59:
async #onBeforeSendHeaders(e) {
// filter out requests that are not part of the OAuth2.0 flow
if (!e.url.startsWith(Platform.SSO_URL)) {
return { requestHeaders: e.requestHeaders };
}
...
String.prototype.startsWith führt einen rohen Zeichenpräfix-Vergleich durch, keinen Hostnamen-/Origin-Vergleich. Da Platform.SSO_URL kein abschließendes Trennzeichen hat, erfüllt jede URL, deren Host login.microsoftonline.com.<irgendetwas> ist — ein syntaktisch gültiger DNS-Name, den der Angreifer vollständig kontrolliert — ebenfalls die Prüfung, z. B.:
"https://login.microsoftonline.com.attacker.example/phish".startsWith("https://login.microsoftonline.com")
=> true
Dies ist dieselbe Schutzprüfung, die die Beschreibung von GHSA-52rj-42vh-2rxc selbst als „the canonical defensive check ... absent from the Chrome adapter“ bezeichnete — sie existiert hier, ist aber selbst umgehbar, sodass der Fix des Advisories (der nur Chromes declarativeNetRequest-Regel gehärtet hat) diesen Pfad offen ließ. platform/thunderbird/js/platform-thunderbird.js erweitert PlatformFirefox, ohne update_request_handlers() oder #onBeforeSendHeaders zu überschreiben, sodass Thunderbird denselben Fehler erbt.
Auslösepfad (update_request_handlers, platform/firefox/js/platform-firefox.js:36-53): Der Listener wird mit urls: this.well_known_app_filters registriert, das aus chrome.permissions.getAll().origins (src/platform.js:78-79, update_host_permissions()) befüllt wird. Jede vom Benutzer gewährte Host-Berechtigung — einschließlich einer Einzelseiten-Gewährung über den Link „Background SSO (enable)“ im Popup (popup/menu.js:171-260, unter Verwendung von current_filter = "https://" + tab_hostname + "/*", abgeleitet aus dem aktiven Tab) — reicht aus, um den Listener für genau diesen Host zu registrieren. Es ist keine Catch-all-Berechtigung https://*/* erforderlich, anders als die in GHSA-52rj-42vh-2rxc beschriebene Ausnutzungsvoraussetzung; eine einzelne gezielte Gewährung auf der eigenen Look-alike-Domain des Angreifers genügt hier, was eine niedrigere Hürde als der PoC des vorherigen Advisories ist.
Sink — dieselbe Datei, Zeilen 60-70:
let prt = await this.#broker.acquirePrtSsoCookie(this.account, e.url);
ssoLog("inject PRT SSO into request headers");
e.requestHeaders.push({ name: prt.cookieName, value: prt.cookieContent });
e.url (die vollständige Angreifer-URL) wird direkt als ssoUrl an den nativen Broker durchgereicht. linux-entra-sso.py:27-30 dokumentiert, dass das Microsoft-Broker-Backend ssoUrl serverseitig nicht validiert („the correct value is not checked ... by the authorization backend“), sodass unabhängig davon ein Cookie ausgestellt und in die Header der Anfrage injiziert wird, die tatsächlich an den eigenen Host des Angreifers geht — eine direkte Exfiltration, nicht bloß ein Header auf einer an Microsoft gerichteten Anfrage.
Chrome ist nicht betroffen: platform/chrome/js/platform-chrome.js:96-99 (nach dem Fix für GHSA-52rj-42vh-2rxc, Commit 8183759) verankert mit "|" + Platform.SSO_URL + "/" (Anker am Stringanfang + abschließender Schrägstrich) und fügt eine explizite Allow-List requestDomains: [URL.parse(Platform.SSO_URL).hostname] hinzu — beides lehnt einen Host login.microsoftonline.com.attacker.example korrekt ab.
Thunderbird — derselbe verwundbare Code, derzeit nicht über diesen Vektor erreichbar: platform/thunderbird/js/platform-thunderbird.js erweitert PlatformFirefox unverändert, sodass die identische startsWith-Umgehung im Binary des Thunderbird-Builds existiert. Allerdings deklariert platform/thunderbird/manifest.json nur ein festes "host_permissions": ["https://login.microsoftonline.com/*"] mit keinem optional_host_permissions-Schlüssel. WebExtensions erlaubt chrome.permissions.request() nur, Origins zu gewähren, die vorab in optional_permissions/optional_host_permissions deklariert sind; da Thunderbird keine deklariert, kann der „Background SSO (enable)“-Ablauf im Popup (popup/menu.js:259-261) heute unter Thunderbird keine Berechtigung für eine vom Angreifer gewählte Domain erhalten. Der Fehler ist dort latent, derzeit nicht angreiferseitig erreichbar, und sollte dennoch behoben werden zur Defense-in-Depth / für den Fall, dass optional_host_permissions jemals zu diesem Manifest hinzugefügt wird.
Das verwundbare Prädikat wurde dynamisch gegen die tatsächlich ausgelieferte Konstante bestätigt (direkt aus src/platform.js des Ziels importiert, nicht manuell kopiert). Das Skript liegt unter ~/engagements/linux-entra-sso/evidence/prt_bypass_poc.mjs.
$ node prt_bypass_poc.mjs
Real Platform.SSO_URL from src/platform.js: "https://login.microsoftonline.com"
Legit MS URL passes filter (expected true): true
Attacker domain-suffix URL: https://login.microsoftonline.com.attacker.example/phish
Attacker URL passes filter (SHOULD be false, is): true