
QEMU 11.1.2 - 高 - ローカル/リモート - OOB - COLO filter-rewriter 短い IPv4 L4 ヒープオーバーフロー
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · qemu-colo-l4-oob
QEMU v11.1.2 (4fc49f46dc95d4a27de2509e7fceb2931e91faeb) - COLO filter-rewriter
クラス: OOB(ヒープバッファオーバーフロー READ/WRITE)。到達範囲: ローカル(ゲスト)/ リモート(COLO ピア)。
parse_packet_early は、L2 に加えて ip_hl*4 が収まる時点で IPv4 を受け入れます。L4 ヘッダの最小長を要求することはありません。続いて fill_connection_key が transport_header から 4 バイトを読み取りますが、残り長のチェックはありません。filter-rewriter は g_malloc0(size) でフレームをコピーし、SYN によって接続が TCPS_SYN_RECEIVED に遷移した後、conn->offset != 0 の ACK が、キャプチャ長がトランスポートヘッダで終わる場合に th_ack / th_seq をそのチャンクの外へ書き込みます。
COLO はデフォルトではありません。-object filter-rewriter(および colo-compare)が設定されている場合に有効になります。その rewriter 上のゲスト TX/RX は仮想化のセキュリティモデルに含まれます。primary_in / secondary_in 上の COLO ピアはネットワークプロトコルであり、これも信頼されません。
34 バイトの IPv4/TCP フレームで、filter-rewriter における ASan ヒープバッファオーバーフロー READ を引き起こすのに十分です。
| ID | CVE 未割当 |
| CWE | CWE-125 / CWE-787 |
| CVSS | High: 8.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| 製品 | QEMU |
| 影響を受けるバージョン | v11.1.2 (4fc49f46)、COLO rewriter/compare 有効時 |
| 認証 | COLO rewriter netdev 上のゲスト、または COLO compare ピア |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18770 / 18771 ループバックソケット |
誰が: COLO 有効な NIC 上の信頼されないゲスト、または敵対的な COLO compare ピア。ゲストからホストへ / ピアからホストへ。QEMU ユーザ空間のヒープ。
| 手法 | シンク | 権限 |
|---|---|---|
| フルヘッダ SYN 後の短い IPv4/TCP ACK(34 バイトフレーム、長さがトランスポートヘッダで終わる) | filter-rewriter の handle_primary_tcp_pkt / fill_connection_key | filter-rewriter における ASan ヒープバッファオーバーフロー READ。フルヘッダ TCP を制御すると QEMU は生存したまま。 |
| 同じ L4 最小長の欠如 | parse_packet_early net/colo.c:43-98 | バッファ内に L4 ヘッダがないまま、パケットが TCP として分類される。 |
SYN 後、conn->offset != 0 のとき、rewriter は net/filter-rewriter.c:112-114 および :216-218 で th_ack / th_seq を格納します。IP オプション(ip_hl > 5)はその書き込みを隣接するヒープチャンクへずらします。ゲストがトリガー可能なホストヒープ WRITE。
colo-compare の fill_pkt_tcp_info は pkt->size に対するチェックなしで th_off<<2 から header_size を設定します。payload_size がアンダーフローします。colo_compare_packet_payload は両方のパケット割り当てを数十キロバイト超えて memcmp します。クラッシュに加えてホストヒープ READ。
rewriter の READ により ASan 下で QEMU が abort します。ASan なしでは、これはハイパーバイザプロセス内の生きたヒープ OOB です。
net_fill_rstate は packet_len > NET_BUFSIZE を拒否します)。ラボは RIP 制御やゲストからホストへのシェルを実証していません。クラスは COLO 有効な netdev 上の QEMU プロセスのヒープ OOB です。
net/colo.c を読み、L4 を含む長さの下限を探しました。その下限は Ethernet に VLAN と vnet_hdr を加えたものです。ip_hl は短い末尾から取得されます。その後 fill_connection_key が transport_header を信頼します。filter-rewriter は常に struct tcp_hdr のオフセット 13 で th_flags を読み込みます。
誤った方向性: TAP の長さを COLO の境界として扱うこと(別の経路); オーバーフローを最初のパケットとして送信すること(rewriter は conn->offset が有効になるために最初に SYN を必要とする); colo-compare の th_off アンダーフローを主要な証拠とすること(rewriter の READ が先に発火した)。
cd lab
./run.sh
のみを対象とするループバックソケット 127.0.0.1:18770(filter-rewriter netdev)および 18771(colo-compare)。Pin は github.com/qemu/QEMU タグ v11.1.2 / 4fc49f46 からクローン。ASan。COLO プロキシは configure 時に有効化。Witness-only。
SUCCESS qemu-colo-l4-oob asan=heap-buffer-overflow access=READ sink=filter-rewriter control=alive QEMU-COLO-L4-OOB-WITNESS
リプレイ: python3 qemu-colo-l4-oob-Abraxas-Labs.py。
parse_packet_early は、IP ヘッダーの後に完全な L4 ヘッダー(TCP 20、UDP 8、SCTP 12、AH 8)を要求し、size が transport_header 以前で終わる場合は拒否しなければならない。fill_connection_key とリライターの th_* ストアは、残りの長さをチェックしなければならない。colo-compare は、payload_size を計算する前に、pkt->size に収まらない th_off<<2 を拒否しなければならない。
4fc49f46dc95d4a27de2509e7fceb2931e91faebparse_packet_early · filter-rewriterGNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。