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.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Linux-Kernel-Dirty-Pipe-Exploitation-Logic-Bug- — Ausnutzung von CVE-2022-0847 - geschrieben von: Antonius (w1sdom) | Kitploit
Tools/GitHubGitHub/bluedragonsecurity/linux-kernel-dirty-pipe-exploitation-logic-bug-
Privilege EscalationSchwachstellenanalyseCode-AnalyseExploitationCTFLernen & 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
bluedragonsecurity/linux-kernel-dirty-pipe-exploitation-logic-bug-

Linux-Kernel-Dirty-Pipe-Exploitation-Logic-Bug-

Ausnutzung von CVE-2022-0847 - geschrieben von: Antonius (w1sdom)

Repository anzeigen
3117vor 8 MonatenNoch nicht geprüft

Linux-Kernel Dirty Pipe Ausnutzung (Logikfehler)


von: Antonius (w1sdom)
https://www.bluedragonsec.com
https://github.com/bluedragonsecurity

Dirty Pipe (CVE-2022-0847) ist eine der bedeutendsten Sicherheitslücken im Linux-Kernel 5.8 – 5.15.24, entdeckt von Max Kellermann im Jahr 2022. Diese Schwachstelle erlaubt es normalen Benutzern (ohne besondere Berechtigungen), Daten in Dateien zu überschreiben, die schreibgeschützt sein sollten. Verständnis der Kernkonzepte

Bevor wir Dirty Pipe im Detail besprechen, müssen einige interne Konzepte des Linux-Kernels verstanden werden:

1. Paging
Paging ist ein Speicherverwaltungsmechanismus im Linux-Kernel, bei dem das Speichersystem den physischen Speicher in kleine Blöcke fester Größe, sogenannte Seitenrahmen (Page Frames), und den virtuellen Speicher in Blöcke gleicher Größe, sogenannte Seiten (Pages), unterteilt. Dieser Mechanismus erlaubt dem Kernel, den virtuellen Adressraum von Prozessen auf nicht-sequenzielle Weise auf den physischen Speicher abzubilden, was für Effizienz und Sicherheit in modernen Systemen entscheidend ist.

2. Seite (Virtueller Speicher)
In Linux ist eine Seite die kleinste Einheit der physischen Speicherverwaltung, die vom Kernel gehandhabt wird. Analogie: RAM ist wie ein riesiges Buch. Eine Seite ist ein Blatt Papier in diesem Buch. Der Kernel bewegt Daten nicht Bit für Bit, sondern Blatt für Blatt (Seite für Seite). Im Allgemeinen beträgt die Standardgröße einer Seite auf modernen Systemarchitekturen (wie x86_64) 4 KB (4096 Bytes).

3. Page Cache
Dies ist ein entscheidender Teil. Linux liest Dateien nicht jedes Mal direkt von der Festplatte, da dies langsam ist. Der Kernel kopiert Dateiinhalte in den RAM, der als Page Cache bezeichnet wird.

  • Wenn wir eine Datei lesen, lädt der Kernel sie in den Page Cache.
  • Wenn ein anderer Prozess dieselbe Datei lesen möchte, gibt der Kernel nur einen Verweis auf die Seite, die bereits in diesem Speicher vorhanden ist.
Der Page Cache befindet sich im Kernelspace.

4. Pipe Buffer
Pipe ist ein Mechanismus zur Interprozesskommunikation (IPC). Intern verwaltet der Kernel Pipes mithilfe der pipe_inode_info-Datenstruktur. Daten innerhalb einer Pipe werden in einem "Puffer" namens Pipe Buffer gespeichert.

  • Ringbuffer: Der Kernel verwendet eine zirkuläre (Ring-)Struktur zur Verwaltung dieses Puffers. Ein Ringbuffer ist eine Datenstruktur, die ein einzelnes Array fester Größe verwendet, als ob sein Ende wieder mit seinem Anfang verbunden wäre. Dadurch entsteht ein Datenfluss, der sich endlos "dreht".
  • Flags: Jeder Puffer hat Attribute oder "Flags", die sein Verhalten bestimmen (z. B. ob der Puffer zusammengeführt werden kann).
Der Pipe Buffer befindet sich im Kernelspace.

5. Pipe Buffer Flag (PIPE_BUF_FLAG_CAN_MERGE)
Das Flag PIPE_BUF_FLAG_CAN_MERGE wurde mit Linux-Kernel Version 5.8 eingeführt. Hier liegt die Hauptschwachstelle. Das Flag heißt PIPE_BUF_FLAG_CAN_MERGE.

  • Seine Funktion: Teilt dem Kernel mit, dass neue Daten, die in die Pipe geschrieben werden, mit einem vorhandenen Puffer zusammengeführt werden können.
  • Das Problem: Vor dem Dirty-Pipe-Fix hat der Kernel dieses Flag bei splice() nicht ordnungsgemäß gelöscht (zurückgesetzt).

6. Splice
splice() ist ein Syscall zum Verschieben von Daten zwischen zwei Dateideskriptoren, ohne die Daten zwischen Kernelspace und Userspace zu kopieren. Dies wird oft als Zero-Copy-Mechanismus bezeichnet. Der splice()-Syscall ist der "Hauptakteur" bei Dirty Pipe:

  • Anstatt Daten physisch zu kopieren, führt splice() eine Optimierung durch, indem es den Pipe Buffer direkt auf die Seite im Page Cache zeigen lässt.
  • Das bedeutet, die Pipe enthält keine Kopie der Dateidaten, sondern nur einen "Zeiger" auf den physischen Speicher der Datei.

7. Copy on Write (CoW)
Der Copy-on-Write (CoW)-Mechanismus ist eine Optimierungsstrategie der Speicherverwaltung, die vom Linux-Kernel verwendet wird, um das Kopieren von Daten so lange wie möglich hinauszuzögern. Die Beziehung zwischen Copy-on-Write (CoW) und dem Dirty-Pipe-Exploit (CVE-2022-0847) besteht darin, wie ein kleiner Fehler im Linux-Kernel den CoW-Mechanismus erfolgreich "austrickst", sodass Daten in Dateien geschrieben werden können, die schreibgeschützt sein sollten.

8. Dirty Page
Eine Dirty Page ist eine Speicherseite im RAM, die von einer Anwendung geändert wurde, deren Änderungen jedoch noch nicht zurück auf den Sekundärspeicher (wie SSD oder Festplatte) geschrieben wurden.

Analyse der Dirty Pipe Sicherheitslücke

Dirty Pipe ist eine Art Logikfehler in der Pipe-Puffer-Verarbeitung im Linux-Kernel 5.8 bis Linux-Kernel 5.15.24. Das Hauptproblem liegt im Pipe-Mechanismus (Interprozesskommunikationskanal) und darin, wie der Kernel den Page Cache (Speicher, der Kopien von Dateidaten von der Festplatte speichert) verwaltet. Der Kernfehler ist ein Fehler im Flag PIPE_BUF_FLAG_CAN_MERGE.

Das Hauptproblem liegt darin, dass der Kernel dieses Flag nicht ordnungsgemäß neu initialisiert (Logikfehler). Hier ist die Codeanalyse: In den Funktionen copy_page_to_iter_pipe und push_to_pipe im Linux-Kernel vor Version 5.16.11 bereitet der Kernel bei splice-Operationen die pipe_buffer-Struktur vor, vergisst jedoch, das .flags-Mitglied zu bereinigen.

Anfällige Codestruktur:

// Ort des Problems: fs/pipe.c oder include/linux/pipe_fs_i.h
struct pipe_buffer {
    struct page *page;
    unsigned int offset, len;
    const struct pipe_buf_operations *ops;
    unsigned int flags; // <--- DIESES FLAG WIRD NICHT ZURÜCKGESETZT
    unsigned long private;
};

Code vor dem Patch (anfällig):

// lib/iov_iter.c - Vor CVE-2022-0847 Patch
static size_t copy_page_to_iter_pipe(struct page *page,
    size_t offset, size_t bytes, struct iov_iter *i) {
    // ---------snip-----------
    struct pipe_buffer *buf = &pipe->bufs[head & mask];
Tool herunterladen