Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
WHS4_CVE-2021-4034 — # Bildungs-PoC und Analyse der lokalen Privilege-Escalation-Schwachstelle CVE-2021-4034 (PwnKit) in polkits pkexec, mit einem Docker-basierten Labor für praktische Übungen zu Exploitation und Defense. | Kitploit
Tools/GitHubGitHub/krleejihyeong/whs4_cve-2021-4034
Privilege EscalationSchwachstellenanalyseExploitationCTFPenetrationstestsLernen & BildungBinary-ExploitationLabs & Praxis

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
GitHub
krleejihyeong/whs4_cve-2021-4034

WHS4_CVE-2021-4034

# Bildungs-PoC und Analyse der lokalen Privilege-Escalation-Schwachstelle CVE-2021-4034 (PwnKit) in polkits pkexec, mit einem Docker-basierten Labor für praktische Übungen zu Exploitation und Defense.

Repository anzeigen
13vor 2 MonatenNoch nicht geprüft

CVE-2021-4034 (PwnKit) – PoC zur lokalen Rechteausweitung

🔗 Originalprojekt: berdav/CVE-2021-4034
Dieses Projekt ist eine auf Basis des Originals für Bildungszwecke analysierte und modifizierte Version.
MIT-Lizenz konform | White Hat School Bildungsaufgabe


📋 Überblick

CVE-2021-4034 ist eine Schwachstelle zur lokalen Rechteausweitung im Linux-policykit-1 (PolicyKit). Ein normaler Benutzer kann pkexec ohne Argumente ausführen und dabei eine Schwachstelle in der Prozessspeicherstruktur ausnutzen. Dadurch wird glib dazu gebracht, Umgebungsvariablen-Strings, die eigentlich hätten herausgefiltert werden müssen, erneut zu referenzieren und eine bösartige .so-Datei zu laden – auf diese Weise können root-Rechte erlangt werden.

⚠️ Nur für Bildungszwecke: Dieser Code darf ausschließlich auf modifizierten Systemen verwendet werden.
Ein Einsatz zum Angriff auf reale Systeme kann rechtliche Konsequenzen haben.


🎯 Zusammenfassung der Schwachstelle

KategorieInhalt
CVE-IDCVE-2021-4034
Name der SchwachstellePwnKit
Betroffene VersionenAlle Versionen von polkit vor 0.105, auf die kein Patch angewendet wurde (Testumgebung: policykit-1 0.105-26ubuntu1 unter Ubuntu 20.04)
SchwachstellentypLocal Privilege Escalation (LPE)
SchweregradCritical (CVSS 7.8)
Patch-Versionpolicykit-1 >= 0.105-26ubuntu1.1
EntdeckungsdatumJuni 2021 (veröffentlicht im Januar 2022)

Man könnte leicht annehmen, es handle sich um ein reines Ubuntu-Problem, doch da es sich um einen Logikfehler in pkexec selbst handelt, sind die meisten Distributionen betroffen, die polkit verwenden. Da die Docker-Testumgebung Ubuntu 20.04 ist, wurde diese Version in der obigen Tabelle mit aufgeführt.


🔴 Kern der Schwachstelle

Bei der ersten Analyse dachte ich, es sei ein Problem, das dadurch entsteht, dass Umgebungsvariablen nicht validiert werden. Als ich mir jedoch den Quellcode zusammen mit dem Patch-Commit ansah, wurde klar, dass die Reihenfolge eine etwas andere ist. Die eigentliche Ursache liegt woanders; das Umgebungsvariablen-Problem ist eher eine Folge dieser Ursache. Im Folgenden ist dieser Ablauf in der Reihenfolge der Ursachen zusammengefasst.

1. Was ist pkexec?

pkexec ist ein SUID-root-Programm, das über PolicyKit eine Rechteausweitung anfordert.

# Beispiel: Befehl mit root-Rechten ausführen
pkexec /bin/id
pkexec systemctl restart service

Es wird verwendet, wenn ein normaler Benutzer bestimmte Aufgaben mit Administratorrechten ausführen möchte.


2. Die eigentliche Grundursache: pkexec behandelt den Fall argc == 0 nicht als Sonderfall

Die main()-Funktion von pkexec validiert in dem Teil, der die Befehlszeilenargumente verarbeitet, den Fall, dass das Programm ohne ein einziges Argument ausgeführt wird (argc == 0), nicht. Das ist der eigentliche Ausgangspunkt dieser Schwachstelle.

  • Normaler Ablauf: argv = {"pkexec", "Befehl", NULL} → argc >= 1
  • Angriffsszenario: execve("/usr/bin/pkexec", {NULL}, env) → argc == 0

Wenn argc 0 ist, bleibt in der argv-Liste nur ein NULL als Abschluss übrig. Die interne Logik von pkexec versucht jedoch auch in dieser Situation, auf das nicht vorhandene argv[1] lesend und schreibend zuzugreifen. Das Problem ist, dass Linux beim Ausführen eines Prozesses das argv-Array und das envp-Array (Umgebungsvariablen) im Speicher direkt nebeneinander platziert. Dadurch zeigt das außerhalb des gültigen Bereichs liegende argv[1] tatsächlich auf envp[0], also auf die erste Umgebungsvariable.

Normale Situation:  argv = [ "pkexec" | NULL ]
Angriffssituation:  argv = [ NULL ]               ← argc = 0
                    ↑
             Zugriff auf nicht vorhandenes argv[1]
                    ↓
      liest und schreibt envp[0] direkt dahinter im Speicher (out-of-bounds)

Warum ist das gefährlich?

  • Normalerweise entfernt ld.so vor der Ausführung des SUID-Programms (pkexec) gefährliche Umgebungsvariablen wie GCONV_PATH oder LD_PRELOAD, da diese als unsicher eingestuft werden.
  • Doch durch die oben beschriebene OOB-Operation wird der bereits entfernte String nicht „als Umgebungsvariable wiederhergestellt", sondern über den argv-Zeiger wird der String wieder referenzierbar. Der Wert wird also nicht wiederbelebt; vielmehr entsteht erneut eine Zeigerverbindung, die auf diesen Wert zeigt.
  • Auch der eigentliche Patch-Commit hat diesen Teil behoben, indem eine Validierungslogik ergänzt wurde, die bei argc < 1 sofort beendet. (Entspricht CWE-125 Out-of-Bounds Read und CWE-787 Out-of-Bounds Write)

📌 Zusammengefasst: Die fehlende Validierung der Umgebungsvariablen ist die „Bedingung, unter der der Angriff funktioniert"; die eigentliche Schwachstelle (Root Cause) ist, dass pkexec den Fall argc == 0 nicht behandelt. Punkt 3 unten ist die Folge dieser Ursache.


3. Ergebnis: Ein String, der hätte herausgefiltert werden müssen, wird wieder referenzierbar

Dank der unter Punkt 2 beschriebenen OOB-Operation wird dieser String beim Initialisierungsprozess von glib durch pkexec unvalidiert erneut verwendet.

// CVE-2021-4034_exploit.c
char * const env[] = {
    "GCONV_PATH=.",      // hätte eigentlich von ld.so herausgefiltert werden müssen
    "CHARSET=PWNKIT",    // nicht existierende Kodierung
};

execve("/usr/bin/pkexec", args, env);  // argv wird leer gelassen, um argc=0 zu erzeugen

Problem:

  • Durch die OOB-Operation aus Punkt 2 wird dieser String wieder referenzierbar und gelangt ungefiltert bis in die glib-Initialisierungsphase
  • Aus Sicht von glib gibt es keine Möglichkeit zu unterscheiden, ob es sich um eine ursprünglich vorhandene, normale Umgebungsvariable handelt oder ob der Angreifer sie wiederbelebt hat

4. Ausnutzung des Lademechanismus von glib-Convertern

Wichtig hierbei ist, dass glib selbst nichts falsch gemacht hat. Wenn GCONV_PATH gesetzt ist, ist die Suche nach dem Converter in diesem Pfad das normale Verhalten von glib. Das Problem ist, dass pkexec den Secure-Execution-Zustand (den Zustand, in dem gefährliche Umgebungsvariablen entfernt wurden) bereits zerstört hat – glib hat lediglich normal funktioniert, und genau dieses normale Verhalten wird ausgenutzt.

  1. CHARSET-Umgebungsvariable prüfen

    CHARSET=PWNKIT
    
  2. Converter-Definition in der Datei gconv-modules suchen

    module UTF-8// PWNKIT// pwnkit 1
    
  3. .so-Datei über GCONV_PATH laden

    GCONV_PATH=. → pwnkit.so im aktuellen Verzeichnis suchen
    
  4. Initialisierungsfunktion der .so-Datei wird automatisch ausgeführt

    // pwnkit.c – wird beim Laden der .so-Datei automatisch ausgeführt
    void gconv_init(void *step)
    {
        setuid(0);           // root-Rechte erlangen
        setgid(0);
        execve("/bin/sh");   // root-Shell starten!
    }
    

    Man ist versucht, gconv_init als „Konstruktorfunktion" zu bezeichnen, doch streng genommen unterscheidet sie sich von __attribute__((constructor)) in C. Genauer gesagt handelt es sich um eine im gconv-Modulinterface definierte Initialisierungsfunktion, die glib nach dem Laden der .so-Datei per dlopen explizit aufruft.


5. Gesamter Angriffsablauf

Tool herunterladen