CVE-2026-55200

CVE-2026-55200

NVD 詳細

概要

libssh2に深刻なRCE脆弱性(CVE-2026-55200)、全バージョンに影響

脆弱性情報(NVD)

影響を受けるバージョン:

原文: libssh2 through 1.11.1, fixed in commit 7acf3df contains an out-of-bounds write vulnerability in ssh2_transport_read() that fails to enforce upper bounds on packet_length field. Remote attackers can send crafted SSH packets with excessively large packet_length values to corrupt heap memory and achieve remote code execution.

技術詳細

脆弱性の概要

libssh2のssh2_transport_read()関数において、SSHパケットのpacket_lengthフィールドに対する上限チェックが欠落している。攻撃者が過大な値を設定したパケットを送信すると、内部的なバッファサイズ計算で整数オーバーフロー(CWE-680)が発生し、ヒープ領域に範囲外書き込みが行われる。認証前の段階で攻撃が成立するため、リモートからのコード実行に繋がる深刻な脆弱性である。

根本原因

src/transport.c等に実装されるssh2_transport_read()が、受信パケットのpacket_lengthを検証する際に最大許容サイズを強制していない。packet_lengthをそのままmalloc等のサイズ計算に使用した結果、過大な値によって確保すべき領域が実際より小さく見積もられ、後続のmemcpyやデータ展開処理でヒープバッファオーバーフローを引き起こす。

攻撃シナリオ

  1. 攻撃者は悪意のあるSSHサーバを用意し、クライアントからの接続を待ち受ける(あるいは中間者攻撃で正規サーバ応答を改ざんする)。
  2. SSHハンドシェイク後、クライアントがSSH_MSG_KEXINITSSH_MSG_NEWKEYS等のパケットを期待する段階で、攻撃者はpacket_lengthフィールドに極端に大きな値(例: 0xFFFFFFFF)を設定した応答パケットを送信する。
  3. クライアントのlibssh2はssh2_transport_read()でこのパケットを処理し、整数オーバーフローを誘発させて本来より小さいヒープバッファを確保する。
  4. 受信データの書き込みが確保済み領域を超過し、ヒープメモリが破壊される。最終的に任意コード実行に至る可能性がある。

検出方法

ブラックボックステスト

パケット長を自由に操作可能なSSHサーバをシミュレートするスクリプトを用いてクライアントの挙動を確認する。以下はPythonによる簡易的なテストサーバの概念であり、実際のエクスプロイトコードが公開されている場合にはそれを参考にすること。

# テスト用のSSHサーバを起動(仮想的なコード)
python3 fake_ssh_server.py --packet-length 0xFFFFFFFF

クライアント側から接続を実行し、クラッシュやメモリ破壊の兆候(AddressSanitizerのレポートや異常終了)を監視する。

# クライアント接続例(libssh2利用の実装を想定)
./vuln_client ssh://attacker-server:22

確認ポイント: クライアントプロセスがSIGABRTやセグメンテーション違反で停止する、またはAddressSanitizerがheap-buffer-overflowを報告する。

ホワイトボックステスト

libssh2のソースコード(バージョン1.11.1以前)において、パケット長の上限チェックが行われていない箇所を特定する。

# transport.c内のpacket_length使用箇所を抽出
grep -n 'packet_length' src/transport.c

明らかに、受信したpacket_lengthがそのままtotal_num = p->packet_length + ...のようにバッファサイズ計算に利用されており、事前にp->packet_length > MAX_PACKET_SIZEのような比較が存在しないことを確認する。修正コミット7acf3dfとの差分を確認し、導入された上限チェック(例: if(packet_length > MAX_PACKET_LEN) return _libssh2_error(...))の欠落を検証する。

対策

恒久的対策

修正コミット7acf3dfを含むバージョンにアップデートする。当該コミットではpacket_lengthに対して明示的な上限チェックが追加されている。

# ソースからのビルド例
git clone https://github.com/libssh2/libssh2.git
cd libssh2
git checkout 7acf3df   # または当該コミットを含むタグ(例: libssh2-1.11.2 等、情報不足)
mkdir build && cd build
cmake .. && make && sudo make install

パッケージ管理システムを使用している場合は、ベンダーが提供する修正済みバージョンへ更新する(該当バージョン番号は情報不足)。

暫定対策

参考リンク

言及日