Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
servu-cve-2026-28318-poc — SolarWinds Serv-U CVE-2026-28318: 未認証のContent-Encoding: deflateによるクラッシュ。根本原因分析(内部ポインタの無効な解放によるヒープ破損)+ DoS専用のPoC。15.5.4 Hotfix 1で修正済み。 | Kitploit
ツール/GitHubGitHub/eaea0001/servu-cve-2026-28318-poc
メモリフォレンジック脆弱性分析エクスプロイトペネトレーションテストバイナリ解析
GitHubeaea0001/servu-cve-2026-28318-poc

servu-cve-2026-28318-poc

SolarWinds Serv-U CVE-2026-28318: 未認証のContent-Encoding: deflateによるクラッシュ。根本原因分析(内部ポインタの無効な解放によるヒープ破損)+ DoS専用のPoC。15.5.4 Hotfix 1で修正済み。

リポジトリを見る
12ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-28318 — SolarWinds Serv-U "Content-Encoding: deflate" 事前認証クラッシュ

根本原因分析 + DoS 概念実証。 公開アドバイザリでは、これを認証不要の denial-of-service / uncontrolled resource consumption として分類しています。バイナリ解析の結果、根本的な欠陥は メモリ安全性 に関わるもので、HTTP deflate デコードパスにおける 無効な free() による内部ポインタの解放 であり、プロセスヒープを破壊します (STATUS_HEAP_CORRUPTION, 0xC0000374)。これは 解凍爆弾 ではなく、クラッシュは 展開後のサイズに依存しません。


⚠️ 免責事項 / 対象範囲

  • これは、すでにパッチが適用され、公開されている脆弱性に対する 防御的なセキュリティ研究 です(修正は 2026-06-04 に Serv-U 15.5.4 Hotfix 1 で出荷され、CISA KEV にリストされています)。
  • ここにある PoC は、あなたが所有するか、明示的にテストを許可された Serv-U インスタンスを クラッシュさせる だけです。これは DoS のみ であり、リモートコード実行は含まれていません(深刻度を参照)。
  • 自身のシステムで パッチの状態と検出を検証する ために使用してください。制御していないシステムには向けないでください。適用される法律を遵守する責任はあなたにあります。

影響を受けるバージョン / 修正バージョン

影響を受けるのは HTTP/HTTPS リスナーのみです(Web/管理パス)。FTP/FTPS/SFTP はこのコードパスに含まれません。


概要

Content-Encoding: deflate を含む HTTP リクエストで、有効な deflate ボディがある場合、サービスがクラッシュします。ハンドラはボディを展開した後、圧縮されたボディへのポインタを解放 し、展開されたバッファに入れ替えます。しかし、そのポインタは HTTP 受信バッファへの内部ポインタ (\r\n\r\n の直後のボディを指している)であり、ヒープ割り当てのベースではありません。非ベースでアライメントされていないポインタに対して free() を呼び出すと、ヒープが破損し、プロセスが終了します。

バグは ボディポインタの解放方法 にあり、生成されるデータ量 にはないため、約 25 バイトの圧縮ボディ(数 KB に展開される)でも確実にクラッシュします。メモリ使用量は増加しません。「zip/deflate 爆弾」ではありません。


根本原因

deflate デコードルーチンは RhinoNET.dll (Serv-U のネットワークライブラリ) にあり、HTTP 受信パス (ProcessReceive) から、ヘッダーパーサーが Content-Encoding: deflate を認識して "deflate" フラグを設定した後に呼び出されます。

簡略化すると、ルーチンは decode(this, &bodyPtr, &bodyLen) として呼び出され、以下の処理を行います:

root@kitploit:~
1. inflate bodyPtr[0..bodyLen]  -> grows an accumulator buffer `acc`   (stock zlib, bounded, correct)
2. free(*bodyPtr)                <-- *bodyPtr is an INTERIOR pointer into the receive buffer
3. *bodyPtr = acc                // replace compressed body with decompressed buffer
4. *bodyLen = total

ステップ 2 がバグです。*bodyPtr は独立して割り当てられたブロックではありません。これは、単一の HTTP 受信バッファ 内 のリクエストボディを指しています。すなわち、receive_buffer + header_length です。内部(かつ 16 バイトアライメントされていない)ポインタを解放すると、アロケータは攻撃者が制御する領域をヒープチャンクヘッダとして解析し、ヒープメタデータの破損 → 0xC0000374 が発生します。

除外された原因(誤った方向に進まないように)

「明白な」仮説はどちらも 間違い であり、ランタイムで確認済みです:

  • inflate/展開オーバーフローではない。 展開器は標準の zlib1.dll!inflate であり、毎回の呼び出しで avail_out を尊重します(100 以上のチャンクで観測、ゼロの範囲外書き込み)。
  • アキュムレータオーバーフローではない。 増加する出力バッファは毎回 prev_total + produced + 1 として割り当てられ、その正確な量だけ書き込まれます — タイトで、オーバーフローはありません。

破損はステップ 2 の無効な free() のみによるものです。


証拠

Serv-U 15.5.4.108 に対して、ボディが "A" * 8192 に展開される Content-Encoding: deflate リクエストを送信中に、ランタイム(Frida)で取得しました:

  • 解放されたポインタは …ce — mod 16 == 14 です。 ヒープ割り当てベースは 16 バイトアライメントされているため、これは割り当てベースではなく、内部ポインタです。
  • 解放されたポインタの 前 の 48 バイトは HTTP ヘッダテール であり、\r\n\r\n で終わります:
    root@kitploit:~
    …tream\r\nContent-Length: 26\r\nConnection: close\r\n\r\n
    
  • 解放されたポインタの位置のバイトは raw deflate ストリーム です(ed c1 01 0d 00 …)。
  • クラッシュシグネチャ: 障害モジュール ntdll.dll、例外 0xC0000374 (STATUS_HEAP_CORRUPTION)、呼び出しは RhinoNET.dll の deflate ハンドラ内の free から発生。クラッシュ前の最後のヒープ操作はまさにこの free(bodyPtr) です。
  • サイズ非依存性: 約 4 KB にしか展開されないボディ(圧縮時は数十バイト)でも同様にクラッシュします。ワーキングセットメモリは増加しません。

深刻度

  • 確認済み: Serv-U サービスの信頼性の高い 認証不要のリモートクラッシュ (DoS)。サービスは自動再起動する可能性がありますが、リクエストを繰り返すとダウンし続け、Windows のサービス回復機能を消耗させる可能性があります。
  • DoS を超える可能性 — 未確認。 解放された「チャンクヘッダ」は 攻撃者が制御する HTTP ヘッダバイト と重なっており、原理的には単なる DoS よりも強力なプリミティブです。ただし、最新の Windows (Segment Heap) では、無効な free はテストにおいて 高速失敗 (0xC0000374) し、コード実行は達成できませんでした。 これは メモリ安全性の根本原因を持つ事前認証ヒープ破損 DoS として扱ってください。RCE を想定しないでください。

再現方法

Python 3 (標準ライブラリのみ) が必要です。テストを許可された Serv-U HTTP リスナーを指定してください。Windows では、Get-NetTCPConnection 呼び出しを使用してリスナーの PID を読み取り、Application イベントログでヒープ破損クラッシュを確認します。

root@kitploit:~
python poc_verify.py                       # default 127.0.0.1:80, tiny packet, 1 shot
python poc_verify.py --host <ip> --port 80
python poc_verify.py --big                 # body decompresses to 8192 bytes
python poc_verify.py --shots 3
python poc_verify.py --no-events           # skip event-log check (no privileges needed)

PoC は最小限のリクエストを構築します:

root@kitploit:~
POST / HTTP/1.1
Host: <target>
Content-Encoding: deflate
Content-Type: application/octet-stream
Content-Length: <n>
Connection: close

<raw-deflate body — even a few dozen bytes is enough>

サービスがクラッシュした場合(リスナー PID が変更された / 0xC0000374 イベントが発生した)は PASS を報告し、サービスが生き残った場合(既にパッチ済み、影響を受けない、またはボディが deflate として処理されなかった)は FAIL を報告します。


緩和策

  1. Serv-U 15.5.4 Hotfix 1(またはそれ以降)を適用する。
  2. 一時的な対策: Serv-U の前段で、HTTP/HTTPS リスナー上の受信 Content-Encoding を削除または拒否します。例:リバースプロキシ上で:
    root@kitploit:~
    if ($http_content_encoding) { return 400; }
    
  3. Serv-U の Web/管理ポートへのネットワーク露出を制限する。

方法論(分析手法)

  • 静的解析: RhinoNET.dll / Serv-U.exe (イメージベース 0x180000000) のパラメータ化された PE 逆アセンブルにより、受信 → ヘッダーパース → deflate デコードパスをマッピングし、誤った free の位置を特定。
  • 動的解析: ライブサービスへの Frida インストルメンテーション — 展開器をフックして zlib が avail_out を尊重していることを証明し、デコード呼び出しのすべての alloc/free/memcpy をディスクにトレースし、プロセス例外ハンドラで破損時の障害命令と 0xC0000374 スタックをキャプチャ。その後、解放されたポインタ周辺のバイト(HTTP ヘッダテール + raw deflate ボディ、16 バイトミスアライメント)をダンプすることで、内部ポインタの解放が確認されました。

分析で参照されたオフセットはビルド 15.5.4.108 に固有であり、異なるビルドでは異なります。


参考文献

  • SolarWinds — Serv-U 15.5.4 Hotfix 1 リリースノート
  • NVD — CVE-2026-28318
  • CISA KEV catalog — CVE-2026-28318

ベンダーのパッチ提供後に防御的研究として公開。PoC は DoS のみであり、許可されたテストを目的としています。

ツールをダウンロード
ProductSolarWinds Serv-U (FTP / MFT / ファイルサーバー)
Vulnerable15.5.4 およびそれ以前で、Hotfix 1 が適用されていない もの(解析はビルド 15.5.4.108 で実施)
FixedServ-U 15.5.4 Hotfix 1 (2026-06-04 リリース)
Vector認証不要、ネットワーク (HTTP/HTTPS 管理/Web ポート)
Public classCWE-400 制御不能なリソース消費 · DoS · CVSS 7.5 · CISA KEV
Actual classCWE-763 無効なポインタの解放 / CWE-590 ヒープ外メモリの解放 → ヒープ破損