
Lab-Erkennungsübung für DirtyFrag (CVE-2026-43284) - Linux-Kernel-Privilegieneskalation mittels xfrm-ESP-Seitencache-Korruption. Vollständige Abhandlung über die Ausführung des Exploits, Erkennungslücken und korrigierte EQL-Regeln unter Verwendung des Elastic Stack.
Klassifikation: Internes Lab – CyberLAB
Datum: 24. Mai 2026
Plattform: Elastic Stack v9.4.1
Status: Erkennung bestätigt
Eine kontrollierte Exploitation-Übung, die einen Gegner nach dem ersten Zugriff simuliert, der DirtyFrag (CVE-2026-43284), eine Linux-Kernel-Privilegieneskalations-Schwachstelle, einsetzt. Das simulierte Angreiferszenario: ein niedrig privilegierter Benutzer (saskia, uid=1001), der über Phishing-Anmeldedaten erlangt wurde, versucht, auf Root zu eskalieren auf einem internen Linux-Host. Das Labor verwendete eine absichtlich anfällige Ubuntu-Maschine (ubuntu-vuln, Kernel 6.0.0-22-generic), isoliert von Produktionsnetzwerken.
Der Angreifer erlangte vollen Root-Zugriff (uid=0) in der Laborumgebung. Der Elastic Security Erkennungsstack generierte 3 Alarmmeldungen mit hohem Schweregrad (Risikoscore 73) und identifizierte korrekt die Exploitation-Kette. Allerdings erforderte die Erkennung manuelle Anpassungen – die Standardkonfiguration hatte Lücken, die zu verpassten Alarmen geführt hätten.
Fazit: Nicht gepatchte Linux-Hosts mit Kernel <= 6.x sind angreifbar. Wenn ein Angreifer bereits einen niedrig privilegierten Zugang hat, verschafft dieser Exploit ihnen schnell und lautlos vollen Root-Zugriff, ohne dass eine on-disk Spur für Dateiintegritätstools sichtbar ist.
auditd-Regeln erzeugen keine Beweise. Ohne explizite Syscall-Regeln für socket, splice und unshare läuft der Exploit lautlos ab – keine Logs, keine Alarme. Die Standard-Bereitstellung des Elastic Agents fügt diese Regeln nicht automatisch hinzu.process.parent.pid als Korrelationsschlüssel. In der Praxis erzeugt DirtyFrag Zwischenprozesse, was diese Korrelation aufhebt. Die Lösung – Korrelation über auditd.session – wurde während dieser Übung identifiziert und implementiert./etc/shadow aus, griff auf SSH-Authorized-Keys zu, schrieb einen Persistenz-Marker (/root/pwned.txt) und leitete Netzwerkerkundung über nc ein. All dies geschah innerhalb von 30 Minuten nach dem ersten Zugriff.Zielsetzung: Validierung der Erkennungsabdeckung für DirtyFrag-Exploitation im Heimlabor-SOC, Identifizierung von Erkennungslücken und Erstellung einer korrigierten Erkennungsregel basierend auf beobachtetem Angreiferverhalten.
Bedrohungsmodell: Simulierter Gegner nach erstem Zugriff mit Phishing-Anmeldedaten für ein niedrig privilegiertes Benutzerkonto (saskia, uid=1001). Ziel: Privilegieneskalation zu Root über DirtyFrag unter Verwendung des xfrm-ESP-Empfangspfads. Die Laborausführung erfolgte über die Proxmox-Konsole – funktional äquivalent zu SSH nach Zugriff.
Es wurden zwei Fähigkeitsstufen des Angreifers betrachtet:
Diese Übung deckte die Vanilla-Stufe ab.
DirtyFrag ist der dritte in einer Familie verwandter Linux-Kernel-Fehler, die alle die gleiche Grundursache missbrauchen:
Grundursache: IPv4/IPv6-Datagramm-Anhängepfade setzten SKBFL_SHARED_FRAG nicht, nachdem skb_splice_from_iter() eine Page-Cache-Seite in einen Socket-Puffer (sk_buff) eingefügt hatte. Der ESP-Eingangspfad führte dann In-Place-Kryptografie auf vom Angreifer kontrollierten Page-Cache-Seiten durch und behandelte sie als gewöhnliche ungeklonte nicht-lineare skbs.
Exploit-Primitive: Kontrollierter 4- oder 8-Byte-Schreibzugriff in den Page-Cache. Deterministisch – keine Race-Condition erforderlich.
Exploit-Kette:
/usr/bin/su) in den Page-Cachesplice(), sodass die Seite der Datei in frag[0] von struct sk_buff liegtxfrm-ESP-Entschlüsselungspfadexecve() – geben korrupte Bytes zurückKritische Ausweicheigenschaft: Die Datei auf der Festplatte wird nie verändert. Dateiintegritätsüberwachungstools (AIDE, Tripwire, Hash-Prüfungen) melden alle die Zieldatei als sauber.
Bestätigte anfällige Distributionen: Ubuntu 24.04.4, RHEL 10.1, AlmaLinux 10, openSUSE Tumbleweed, CentOS Stream 10, Fedora 44.
Aktive Telemetrie zum Zeitpunkt der Übung:
Lab-Netzwerk vor der Übung isoliert. Firewall-Alias Cyber_escape_door als deaktiviert bestätigt – verhindert seitliche Reichweite zu anderen VLANs oder dem Internet.

Bestätigt anfälligen Kernel und niedrig privilegierten Account auf ubuntu-vuln:```
saskia@ubuntu-vuln:$ uname -r
6.0.0-22-generic
saskia@ubuntu-vuln:$ whoami
saskia
saskia@ubuntu-vuln:~$ id
uid=1001(saskia) gid=1001(saskia) groups=1001(saskia),27(sudo),100(users)

#### 4.3 Stack Health Check
**Suricata: läuft und erfasst (systemctl status)**

**Kibana/Elasticsearch: grün/gesund (API-Überprüfung)**

**VM-Snapshots vor jeglichen Änderungen erstellt**



#### 4.4 Netzwerk-Erfassung
tcpdump auf Suricata-Host gestartet (`emp6s19`, Snapshot-Länge 262144 Bytes) zur vollständigen Paketerfassung des Verkehrs von `172.66.66.27`.


---
### 5. Phase 2 – Exploit-Ausführung
#### 5.1 Staging
Exploit-Quellcode (`exp.c`) aus dem V4bel/dirtyfrag PoC auf dem Opfer-Host bereitgestellt.```bash
ubuntu-vuln@ubuntu-vuln:~/dirtyfrag$ ls
exp exp.c README.md
ubuntu-vuln@ubuntu-vuln:~/dirtyfrag$ cp exp.c /tmp/exp/
Das rechte Terminal zeigt die bereitgestellte Kopie, die für Benutzer saskia sichtbar ist.

Kompiliert als root mit sudo gcc (Benutzer saskia ist in sudoers):```
saskia@ubuntu-vuln:$ sudo gcc -o /tmp/exp/clean_frag /tmp/exp/exp.c
saskia@ubuntu-vuln:$ ls -la /tmp/exp/
-rwxr-xr-x 1 root root 62320 May 24 12:18 clean_frag
-rw-rw-r-- 1 ubuntu-vuln ubuntu-vuln 67803 May 24 12:13 exp.c
saskia@ubuntu-vuln:~$ id
uid=1001(saskia) gid=1001(saskia) groups=1001(saskia),27(sudo),100(users)
Binary: ELF 64-bit LSB executable, x86-64, dynamically linked.

#### 5.3 Ausführung - Root erlangt
Exploit ausgeführt als `saskia` (uid=1001). Der Prozess (`clean_frag`, pid=4326) öffnete `AF_RXRPC`- und `AF_ALG`-Sockets und rief dann `splice()` auf, um die Page-Cache-Seite in den Netzwerkpuffer zu pflanzen. Die In-Place-Verschlüsselung auf dem ESP-Pfad schrieb vom Angreifer kontrollierte Bytes in den Page-Cache. Ein Kindprozess (pid=4327) rief `unshare` mit `a0=50000000` (CLONE_NEWUSER | CLONE_NEWNET) auf, um namespace-begrenzte Capabilities zu erlangen.```
saskia@ubuntu-vuln:~$ /tmp/exp/clean_frag
...
root@ubuntu-vuln:~# id
uid=0(root) gid=0(root) groups=0(root)
root@ubuntu-vuln:~# ls
Vollständige Root-Shell erlangt um 12:22 MESZ (10:22 UTC), 24. Mai 2026.
Erfasste Auditd-Syscall-Sequenz (UTC):
Alle Ereignisse teilen sich auditd.session=2.

Alle Aktionen als root auf ubuntu-vuln ab etwa 12:22 MESZ ausgeführt.
root@ubuntu-vuln:# echo "Dirty Frag PoC executed at $(date)" > /root/pwned.txt
root@ubuntu-vuln:# cat /root/pwned.txt
Dirty Frag PoC executed at Sun May 24 12:28:05 PM CEST 2026

#### 6.2 Zugriff auf Anmeldeinformationen```bash
root@ubuntu-vuln:~# cat /etc/shadow | head -2
root:*:19823:0:99999:7:::
daemon:*:19823:0:99999:7:::
root@ubuntu-vuln:~# cat /home/ubuntu-vuln/.ssh/authorized_keys
ssh-ed25519 AAAA[...]
Shadow-Datei und SSH-authorisierte Schlüssel abgerufen. Im Falle einer echten Kompromittierung ermöglicht dies Offline-Passwort-Cracking und dauerhaften SSH-Backdoor-Zugriff.

root@ubuntu-vuln:~# nc -vz 172.66.66.1 100-8000
Portscan des Lab-Gateways (`172.66.66.1`, Ports 100-8000), ausgeführt aus dem Root-Kontext um 12:51 MESZ. Dies demonstriert die Fähigkeit zur lateralen Bewegung und Netzwerkkartierung von einer eskalierten Sitzung aus.

#### 6.4 Suricata-Netzwerksichtbarkeit
Suricata erfasste **105 Ereignisse** im Zusammenhang mit `172.66.66.27` während des Übungszeitraums (88 mdns, 17 flow). Zum Zeitpunkt der Aufnahme des Screenshots (während des nc-Scans um ~12:53 MESZ) waren 29 Ereignisse im Dashboard sichtbar.
Der DirtyFrag-Exploit selbst ist kernel-intern und erzeugt keine Netzwerksignatur – die Eskalationsprimitive generiert keinen anomalen Datenverkehr auf der Leitung. Suricata wurde eingesetzt, um PCAPs des Post-Exploitation-Traffics und von Aufklärungsversuchen zu sammeln, anstatt den Exploit selbst zu erkennen.
| Ereignistyp | Anzahl |
| ----------- | ------ |
| mdns | 88 |
| flow | 17 |
| **Gesamt** | **105** |
Die Flow-Ereignisse häufen sich um das nc-Portscan-Fenster (10:50-11:10 UTC / 12:50-13:10 MESZ).

---
### 7. Phase 4 - Detection Engineering
#### 7.1 Bereitgestellte Erkennungsregeln
Es wurden zwei EQL-Sequenzregeln in der Kibana-Detection-Engine basierend auf dem Artikel von Elastic Security Labs erstellt.
**Regel 1 - AF_RXRPC oder AF_ALG Socket mit Splice gefolgt von Execution** (hat nicht ausgelöst - siehe Lücke unten)```eql
sequence with maxspan=60s
[any where host.os.type == "linux" and
(
(event.category == "process" and auditd.data.syscall == "socket"
and auditd.data.a0 in ("26", "21")) or
(event.category == "process" and auditd.data.syscall == "splice") or
(event.category == "network" and event.action == "bound-socket"
and data_stream.dataset == "auditd_manager.auditd"
and auditd.data.socket.family == "38")
)
and user.id != "0"] by process.pid, host.id, user.id with runs=10
[process where host.os.type == "linux" and event.action == "executed" and
(
(user.effective.id == "0" and user.id != "0") or
(process.name in ("bash", "sh", "zsh", "dash", "fish", "ksh", "busybox")
and process.args in ("-c", "--command", "-ic", "-ci", "-cl", "-lc",
"-bash", "-sh", "-zsh", "-dash", "-fish", "-ksh"))
)] by process.parent.pid, host.id, user.id
Regel 2 - Namespace-Manipulation gefolgt von Privilege-Eskalation (nach Fix ausgelöst)```eql sequence by host.id, auditd.session with maxspan=30s [process where host.os.type == "linux" and auditd.data.syscall == "unshare" and auditd.data.a0 in ("10000000", "50000000", "70000000", "10020000", "50020000", "70020000") and user.id != "0" and user.id != null] [process where host.os.type == "linux" and user.id == "0" and user.id != null and (process.name in ("bash", "sh", "zsh", "dash", "fish", "ksh", "su", "sudo", "pkexec", "busybox", "mksh") or process.name like ("python*", "perl*", "ruby*", "php*", "lua*"))]
#### 7.2 Erkennungslücke initial - Fehlende Syscall-Abdeckung
Regel 1 lieferte null Ergebnisse. Die Standard-Auditd-Konfiguration auf `ubuntu-vuln` erfasste nur: `write`, `bpf`, `openat`, `unshare`.
Fehlend: `socket`, `splice`, `bind` - die zentralen Exploit-Primitiven.
**Abhilfe:** Hinzugefügt zu `/etc/audit/rules.d/dirtyfrag.rules`:```
-a always,exit -F arch=b64 -S socket -k socket_syscall
-a always,exit -F arch=b32 -S socketcall -k socket_syscall
-a always,exit -F arch=b64 -S splice -k splice-syscall
-a always,exit -F arch=b32 -S splice -k splice-syscall
-a always,exit -F arch=b64 -S unshare -k unshare-syscall
-a always,exit -F arch=b32 -S unshare -k unshare-syscall
272 neue auditd-Ereignisse landeten innerhalb von Sekunden nach der Exploit-Ausführung in Elasticsearch.
Obwohl Ereignisse erfasst wurden, lieferte Regel 2 0 Treffer.
Grundursache - tatsächlicher Prozessbaum (aus Elasticsearch):
Die ursprüngliche Regel korrelierte anhand von process.parent.pid. Das unshare-Ereignis hatte ppid=4326, aber die Root-Shell hatte einen anderen Elternprozess – DirtyFrag forkt Zwischenprozesse, was die Korrelation unterbricht.
Behebung: Korrelation anhand von auditd.session. Alle Ereignisse in der Exploit-Kette teilten session=2, was die Sequenz unabhängig von der Fork-Tiefe korrekt verknüpft.
3 Alarme mit hohem Schweregrad, Risikoscore 73, in Kibana Security – Alarme um 2026-05-24T10:25:57Z UTC (12:25:57 MESZ).
| Alarm | Timestamp (UTC) | Signal |
|---|---|---|
| Sequenzübereinstimmung – unshare-Ereignis | 10:25:57.869 | process=clean_frag, user=saskia (uid=1001) |
| Sequenzübereinstimmung – Root-Shell | 10:25:57.881 | process=bash, user=root (uid=0) |
DirtyFrag - Namespace Manipulation Followed by Privilege Escalationubuntu-vuln

Alle dirtyfrag-bezogenen auditd-Ereignisse:```kql data_stream.dataset: "auditd_manager.auditd" and auditd.summary.how: dirtyfrag
**Namespace-Manipulation durch Nicht-Root:**```kql
data_stream.dataset: "auditd_manager.auditd" and auditd.data.syscall: "unshare" and auditd.data.a0: "50000000"
Root-Aktivität nach Eskalation in derselben Sitzung:```kql data_stream.dataset: "auditd_manager.auditd" and user.id: "0" and auditd.session: "2"
**Alle auditd-Ereignisse während des Exploit-Fensters:**```kql
data_stream.dataset: "auditd_manager.auditd" and @timestamp >= "2026-05-24T10:20:00Z" and @timestamp <= "2026-05-24T10:30:00Z"
Socket- und Splice-Systemaufrufe vom Exploit-Prozess:```kql data_stream.dataset: "auditd_manager.auditd" and auditd.summary.how: "/tmp/exp/clean_frag"
---
### 9. Zusammenfassung der wichtigsten Erkenntnisse
| # | Erkenntnis | Schweregrad | Behoben |
| - | ---------- | ----------- | ------- |
| 1 | Standard-auditd-Regeln übersehen `socket`, `splice`, `unshare` – keine Beweise ohne explizite Regeln | Kritisch | Ja – benutzerdefinierte Regeln in `/etc/audit/rules.d/dirtyfrag.rules` bereitgestellt |
| 2 | EQL-Korrelation mittels `process.parent.pid` schlägt bei gegabelten Exploit-Ketten fehl | Hoch | Ja – geändert auf `auditd.session` |
| 3 | Dateiintegritätsüberwachung blind gegenüber DirtyFrag – Dateien auf der Festplatte bleiben während des gesamten Vorgangs unverändert | Hoch | Keine Behebung im Rahmen – Kernel-Patch ist die Lösung |
| 4 | Post-Exploitation: shadow-Datei, SSH-Schlüssel und Netzwerkerkundung – alles als root ausgeführt, bevor eine alarmgesteuerte Reaktion erfolgte | Hoch | Erkannt über auditd-Protokolle; keine spezielle Regel für Zugriff auf Anmeldedaten oder Aufklärungsphase ausgelöst |
---
### 10. Referenzen
- Elastic Security Labs: [Copy Fail und DirtyFrag: Linux-Seitenfehler in freier Wildbahn](https://www.elastic.co/security-labs/copy-fail-dirtyfrag-linux-page-bugs-in-the-wild)
- Öffentlicher PoC: [V4bel/dirtyfrag auf GitHub](https://github.com/V4bel/dirtyfrag)
- MITRE ATT&CK: [T1068 – Ausnutzung zur Rechteausweitung](https://attack.mitre.org/techniques/T1068/)
- MITRE ATT&CK: [TA0004 – Rechteausweitung](https://attack.mitre.org/tactics/TA0004/)
- MITRE ATT&CK: [T1003.008 – /etc/passwd und /etc/shadow](https://attack.mitre.org/techniques/T1003/008/)
| Punkt | Detail |
|---|
| Schwachstelle | DirtyFrag – CVE-2026-43284 (xfrm-ESP-Pfad), CVE-2026-43500 (RxRPC-Pfad) |
| CVSS-Auswirkung | Vollständige lokale Privilegieneskalation zu Root |
| Betroffene Kernel | Linux-Kernel >= Januar 2017 (9 Jahre Lebensdauer) |
| Betroffene Distributionen | Ubuntu 24.04.4, RHEL 10.1, AlmaLinux 10, openSUSE, CentOS Stream 10, Fedora 44 |
| Umgehung der Dateiintegritätsprüfung | On-disk Dateien unverändert – AIDE, Tripwire, Hash-Überwachung melden alle sauber |
| Öffentlicher PoC | Verfügbar (V4bel/dirtyfrag auf GitHub) |
| Zeit bis Root | < 10 Minuten ab niedrig privilegiertem Zugang |
| Priorität | Maßnahme |
|---|
| Sofort | Linux-Kernel auf allen Hosts auf eine behobene Version patchen. Sicherheitshinweise der Anbieter für Ubuntu, RHEL, AlmaLinux, openSUSE, CentOS, Fedora anwenden. |
| Kurzfristig | Explizite auditd-Syscall-Regeln für socket, splice und unshare auf allen Linux-Hosts bereitstellen, die vom Elastic Agent überwacht werden. |
| Kurzfristig | EQL-Erkennungsregeln aktualisieren, sodass sie nach auditd.session anstelle von process.parent.pid für Sequenzen von Namespace-Manipulationen korrelieren. |
| Fortlaufend | Privilegieneskalations-Alarme mit einem Risikoscore >= 73 als hochprioritäre Triage behandeln. Die aktuelle Regel feuert innerhalb von Sekunden nach der Eskalation. |
| CVE | Spitzname | Eingeführt | Pfad |
|---|
| CVE-2022-0847 | Dirty Pipe | - | pipe |
| CVE-2026-31431 | Copy Fail | - | splice |
| CVE-2026-43284 | DirtyFrag | Jan. 2017 (Commit cac2661c53f3) | xfrm-ESP |
| CVE-2026-43500 | DirtyFrag | Juni 2023 (Commit 2dc334f1a63a) | RxRPC |
| Komponente | Details |
|---|
| Fleet Server / ELK-Host | ubuntu-tm / elk-docker – 172.66.66.30 (laborintern) |
| Elastic Stack | v9.4.1 (Elasticsearch, Kibana, Logstash – Docker) |
| Ziel (Opfer)-Host | ubuntu-vuln – 172.66.66.27 |
| Opfer-Kernel | 6.0.0-22-generic (anfällig) |
| Opfer-Benutzer | saskia – uid=1001, groups=1001(saskia),27(sudo),100(users) |
| Elastic Agent | v9.4.1 mit auditbeat |
| Netzwerk-IDS | Suricata 8.0.5 auf dediziertem Sensor |
| Kibana | http://172.66.66.30:5601 (laborintern) |
| Datensatz | Anteil |
|---|
suricata.eve | 75,2 % |
elastic_agent.fleet_server | 10,8 % |
elastic_agent | 9,1 % |
elastic_agent.filebeat | 1,9 % |
elastic_agent.auditbeat | 1,4 % |
auditd_manager.auditd | 0,5 % |
system.auth | 0,2 % |
system.syslog | 0,1 % |
| Timestamp (UTC) | Syscall | Argument | Process (pid) | User |
|---|
| 10:21:11.054 | unshare | a0=50000000 | clean_frag (4327) | saskia (1001) |
| 10:21:11.055 | socket | a0=21 (AF_RXRPC) | clean_frag (4326) | saskia (1001) |
| 10:21:17.403 | socket | a0=26 (AF_ALG) | clean_frag (4326) | saskia (1001) |
| 10:21:17.419 | splice | a0=4 | clean_frag (4326) | saskia (1001) |
| 10:21:17.419 | splice | a0=7 | clean_frag (4326) | saskia (1001) |
| Prozess | PID | PPID | UID | auditd.session |
|---|
| shell (saskia) | 4182 | - | 1001 | 2 |
clean_frag (main) | 4326 | 4182 | 1001 | 2 |
clean_frag (unshare child) | 4327 | 4326 | 1001 | 2 |
bash (root) | - | 4451 | 0 | 2 |
| Zusammengesetzter Sequenzalarm | 10:25:57.893 | host=ubuntu-vuln |
| Taktik | Technik | ID |
|---|
| Privilege Escalation | Exploitation for Privilege Escalation | T1068 |
| Privilege Escalation | Escape to Host | T1611 |
| Credential Access | OS Credential Dumping: /etc/passwd and /etc/shadow | T1003.008 |
| Discovery | Network Service Discovery | T1046 |
| Syscall | Argument | Bedeutung |
|---|
unshare | a0=50000000 | CLONE_NEWUSER | CLONE_NEWNET |
socket | a0=26 | AF_ALG (Kernel-Krypto-Subsystem) |
socket | a0=21 | AF_RXRPC (RxRPC-Pfad) |
bind | socket.family=38 | AF_ALG bind |
splice | - | Seiteneinschleusung in Netzwerkpuffer |