CVE-2026-55200
CVE-2026-55200
概要
libssh2に深刻なRCE脆弱性(CVE-2026-55200)、全バージョンに影響
脆弱性情報(NVD)
- 深刻度: 重要(CVSS 8.1)
- CVSSベクター:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H - CWE: CWE-680
- EPSS: 0.92%(上位 44.2%)
影響を受けるバージョン:
- Libssh2 Libssh2: <= 1.11.1
原文: 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やデータ展開処理でヒープバッファオーバーフローを引き起こす。
攻撃シナリオ
- 攻撃者は悪意のあるSSHサーバを用意し、クライアントからの接続を待ち受ける(あるいは中間者攻撃で正規サーバ応答を改ざんする)。
- SSHハンドシェイク後、クライアントが
SSH_MSG_KEXINITやSSH_MSG_NEWKEYS等のパケットを期待する段階で、攻撃者はpacket_lengthフィールドに極端に大きな値(例: 0xFFFFFFFF)を設定した応答パケットを送信する。 - クライアントのlibssh2は
ssh2_transport_read()でこのパケットを処理し、整数オーバーフローを誘発させて本来より小さいヒープバッファを確保する。 - 受信データの書き込みが確保済み領域を超過し、ヒープメモリが破壊される。最終的に任意コード実行に至る可能性がある。
検出方法
ブラックボックステスト
パケット長を自由に操作可能な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
パッケージ管理システムを使用している場合は、ベンダーが提供する修正済みバージョンへ更新する(該当バージョン番号は情報不足)。
暫定対策
- クライアントが接続するSSHサーバを信頼できるホストに厳格に制限する(ファイアウォールで送信先ポート22への通信をホワイトリスト化する)。
- SSHプロトコルを透過的に監視するWAFやIPSが存在する場合、異常に大きな
packet_lengthを検知するシグネチャを適用する(SSHプロトコル解析が可能な製品に限る)。 - クライアントプロセスにAddressSanitizerやControl Flow Integrityなどのエクスプロイト緩和技術を適用し、攻撃成功時の影響を低減する。
- 利用が必須でない場合、対象のlibssh2クライアントの使用を一時的に停止する。
参考リンク
- github.com
Patch - github.com
Patch - github.com
Patch - www.vulncheck.com
Third Party Advisory