libssh2のCritical脆弱性CVE-2026-55200、SFTP/SCP利用ツールや静的リンク製品に注意──packet_length未上限チェックで悪意あるSSHサーバーからクライアント側RCE

この記事は約14分で読めます。

2026年6月17日、VulnCheckはSSH2プロトコルを実装するクライアント側Cライブラリlibssh2の重大な脆弱性CVE-2026-55200を公開しました。ssh2_transport_read()関数においてpacket_lengthフィールドの上限チェックが不十分であり、悪意あるSSHサーバーが過大な値を含む細工されたSSHパケットを返すことで、接続中のクライアント側プロセスでヒープメモリ破壊が発生し、リモートコード実行(RCE)につながる可能性があります。CNAであるVulnCheckのCVSS v4スコアは9.2(Critical)です。NVDは本稿確認時点でCVSS v4の独自評価を未提供ですが、CVSS v3.1についてはNIST評価として9.8(Critical)、CNA評価として8.1(High)を表示しています。

本脆弱性はサーバー側のOpenSSH sshdなどではなく、libssh2を組み込んでSSH/SFTP/SCP接続を行うクライアント側アプリケーションが対象です。多くのLinuxディストリビューションやアプリケーションで利用されており、curl/libcurlのSFTP/SCP機能でlibssh2バックエンドを利用しているビルド、libgit2を利用するGit関連ツール、PHPのssh2拡張、バックアップエージェント、ファームウェアアップデーター、各種ネットワークアプライアンスなどが確認対象になります。多くの製品で静的にリンクされていることから、ディストリビューションのパッケージ更新だけでは脆弱なコピーが残る場合があります。本脆弱性については、2026年6月15日以降、GitHub上のexploitariumに実証コードが掲載されており、NVDの参照情報にもこのPoCリポジトリが追加されています。CISA ADPのSSVC評価では、当初exploitationは「none」とされていましたが、2026年6月24日の更新で「poc」に変更されています。一方で、本稿確認時点で実環境での悪用が確認されたことを示す一次情報は確認できていません。

CVE-2026-55200の全体像

本脆弱性は、libssh2がSSHハンドシェイク中にパケットを解析するssh2_transport_read()関数に存在します。攻撃者が制御するpacket_lengthフィールドに極端に大きな値を仕込むと、libssh2側の32ビット算術の取り扱いにより、サイズ計算の結果が想定外に小さくなり得ます。その小さな値に基づいてバッファが確保された後、本来の大きなパケットがそのバッファへ書き込まれることで、ヒープ上のout-of-bounds writeが成立する構造です。CWE分類はCWE-680(Integer Overflow to Buffer Overflow)で、リモートコード実行につながり得る古典的なメモリ破壊プリミティブにあたります。

項目 内容
CVE CVE-2026-55200
GHSA GHSA-R8MH-X5QV-7GG2(Unreviewed)
脆弱性種別 CWE-680 Integer Overflow to Buffer Overflow、out-of-bounds heap write
影響箇所 src/transport.cssh2_transport_read()関数、packet_lengthフィールドの上限チェック不在
影響バージョン libssh2 1.11.1以下のすべてのリリース
CVSS v4スコア(CNA: VulnCheck) 9.2 Critical(CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)
CVSS v3.1スコア NIST評価9.8 Critical(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)、CNA評価(VulnCheck)8.1 High(CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H)
NVD状態 CVSS v4のNVD独自評価は本稿確認時点で未提供。一方、CVSS v3.1はNIST評価9.8 Critical、CNA評価8.1 Highを表示
Ubuntu priority Medium
NHS Digital severity Medium(内部分類、Threat ID: CC-4799)
CVE公開 2026年6月17日(VulnCheckによる)
修正コミット 97acf3dfda80c91c3a8c9f2372546301d4a1a7a8(2026年6月12日マージ、PR #2052)
発見者 Tristan Madani氏(GitHub: @TristanInSec)
公開PoC 2026年6月15日以降、GitHub bikini/exploitariumリポジトリ内に掲載(ローカル検証用のトリガーコードと、制御環境向けのRCE検証用ハーネス)。NVDの参照情報にも追加済み
CISA ADP SSVC 当初exploitation: none、2026年6月24日にexploitation: pocへ更新。automatable: no、technicalImpact: total

攻撃成立の前提

本脆弱性はlibssh2を組み込んだクライアントが対象で、攻撃のトリガーは「接続先のSSHサーバーが悪意ある応答を返すこと」です。GHSAのCVSS v4ベクトルでは「Attack Requirements: Present」となっており、これは「悪意あるSSHサーバーに接続する」または「中間者が応答を改変する」という前提条件が存在することを反映しています。一方で、認証は不要(Privileges Required: None)、ユーザー操作も不要(User Interaction: None)、ネットワーク経由で攻撃可能(Attack Vector: Network)です。CVSS v3.1ではNIST(AC:L)とVulnCheck(AC:H)で攻撃複雑度の評価が分かれており、NISTは「悪意あるサーバーへの接続が成立すれば攻撃可能」と見て9.8 Criticalを付与し、VulnCheckは「特定の条件が必要」と見て8.1 Highを付与しています。

  • クライアント側の脆弱性:libssh2はSSHのクライアント側ライブラリで、サーバー側ではありません。OpenSSHのsshdなど一般的なSSHサーバー実装は影響を受けません。SSH接続を発信する側、つまりlibssh2を組み込んだアプリケーションが攻撃対象です。
  • 悪意あるSSHサーバーが必要:攻撃者は脆弱なクライアントに対し、悪意あるSSHエンドポイントへの接続を促す必要があります。攻撃者管理下のSSHサーバーへの接続、DNSの改ざんによるリダイレクト、中間者によるレスポンス改変などが想定されるシナリオです。
  • ハンドシェイク段階での攻撃:細工は鍵交換以前のSSH transport層パケット解析中に効くため、認証情報の事前共有や有効なクレデンシャルは必要ありません。

libssh2の影響範囲

libssh2はSSH2プロトコルをC言語で実装したクライアント側ライブラリで、長年にわたって多くのソフトウェアの内部に取り込まれてきました。代表的な依存先には次のようなものがあります。

  • curl/libcurl:SFTP/SCP対応にlibssh2を使ってきた経緯がありますが、現在はlibsshなど別バックエンドも選択可能です。curlを利用しているだけで一律に影響を受けるわけではなく、SFTP/SCP機能でlibssh2バックエンドを使うビルドが影響確認の対象になります。実際のビルド設定やリンク先ライブラリの確認が必要です。
  • Git関連ツール:一般的なGit CLIはOpenSSHを使う構成が多い一方、libgit2を利用するGit関連ツール/ライブラリではSSH transport層にlibssh2を使う構成があります。
  • PHP:SSH/SFTP操作のためのlibssh2 PECL拡張(ssh2拡張)を経由した利用が広範に存在します。
  • バックアップエージェント、ファームウェアアップデーター、ネットワークアプライアンス:SSH経由でリモートに接続する各種商用・OSSツールが組み込んでいます。

影響範囲を厄介にしているのは、これらの製品の多くがlibssh2を静的リンクで取り込んでいる、もしくはアプリケーション内に個別コピーをバンドルしている点です。OSのlibssh2パッケージを更新しても、製品ごとにバンドルされたコピーは別途ベンダーがアップデートをリリースしない限り脆弱なまま残ります。一部のベンダーが数日以内にパッチを提供する一方、対応に数カ月かかる、あるいは長期間反応のないケースも珍しくありません。

根本原因──packet_lengthの上限チェック不在

SSHのバイナリパケットプロトコルでは、各パケットの先頭に4バイトのpacket_lengthフィールドがあり、後続のペイロード長を宣言します。ssh2_transport_read()はこのフィールドを読み取り、後段のメモリ確保とパケット読み込みに使う設計です。修正前のコードでは、このフィールドに対するチェックが「1未満なら拒否」という下限チェックのみで、上限値の検証が存在しませんでした。

修正コミット97acf3dの実際の差分は、わずか1行のチェックを5行のチェックに置き換える内容で、LIBSSH2_PACKET_MAXPAYLOADを超えるpacket_lengthを計算前に拒否する処理を追加しています。

p->packet_length = ssh2_ntohu32(block);
-    if(p->packet_length < 1)
+    if(p->packet_length < 1) {
        return LIBSSH2_ERROR_DECRYPT;
+    }
+    else if(p->packet_length > LIBSSH2_PACKET_MAXPAYLOAD) {
+        return LIBSSH2_ERROR_OUT_OF_BOUNDARY;
+    }

この修正がなかった旧コードでは、攻撃者がpacket_lengthに極端に大きな値を仕込むと、後段のサイズ計算で他の値が32ビット算術で加算されることにより、結果が想定外に小さくなり得ます。libssh2はその小さな値に基づいてバッファを確保しますが、後続のパケット読み込み処理は本来の大きなpacket_lengthを前提に動作し、確保したバッファの境界を超えてヒープ上にデータを書き込みます。これがCWE-680(Integer Overflow to Buffer Overflow)として分類される、リモートコード実行につながり得る典型的なプリミティブです。

同時公開された関連CVE

VulnCheckおよびlibssh2メンテナの公開タイミングに合わせて、同じlibssh2 1.11.1以下を対象とする他のCVEも整理されています。クライアント側ライブラリとしての複数の弱点が連続して可視化された形です。

  • CVE-2025-15661(High、CVSS 8.3):SFTPのsftp_symlink()関数におけるout-of-bounds heap read。SSH_FXP_NAME応答でのlink_len値が実際のパケットデータより大きい場合、ヒープバッファのover-readが発生します。修正コミットは2dae302。
  • CVE-2026-55199(High、CVSS 8.2):鍵交換時のSSH_MSG_EXT_INFOハンドラにおける認証前DoS。悪意あるサーバーがnr_extensionsを0xFFFFFFFFに設定すると、_libssh2_get_string()の戻り値が未チェックでセッションタイムアウトがCPUを消費するループに適用されないため、クライアントが60秒超のCPU消費ループに陥ります。修正コミットは1762685。
  • CVE-2026-7598:userauth_password関数(src/userauth.c)における整数オーバーフロー。修正コミットは256d04bで、DebianではDSA-6365-1に含めてtrixie向けに修正されています。

ディストリビューション別の修正状況

libssh2公式

修正コミット97acf3dは2026年6月12日にメインラインへマージされていますが、本稿確認時点でlibssh2公式サイトの最新タグ付きリリースは1.11.1(2024年10月16日リリース)のままで、1.11.2等の修正版リリースは公開されていません。oss-securityメーリングリストへの開発者からの投稿(2026年6月23日)でも「修正を含むリリースは準備中」と説明されています。当面は、ディストリビューションのバックポートか、ソースからのビルドで個別に修正を取り込む形になります。

Debian

Debianは2026年6月25日にセキュリティアドバイザリDSA-6365-1を公開し、安定版trixie(Debian 13)向けにlibssh2 1.11.1-1+deb13u1として4つのCVE(CVE-2025-15661、CVE-2026-7598、CVE-2026-55199、CVE-2026-55200)を一括修正しました。一方で、Debian Security Trackerではリリースごとに状態が異なる表示になっているため、bookwormやbullseyeなど他リリースを利用している環境では、各リリースのTracker表示やLTS/ELTSの対応状況を個別に確認する必要があります。

Ubuntu

Ubuntu公式CVEページ(本稿確認時点)によれば、CVE-2026-55200のUbuntu priorityはMediumで、対象リリース(26.04 LTS resolute、25.10 questing、24.04 LTS noble、22.04 LTS jammy、20.04 LTS focal、18.04 LTS bionic、14.04 LTS trusty)はすべて「Needs evaluation」と表示されています。本稿確認時点でUbuntu Security Noticesは未公開で、Ubuntu環境では今後のUSN公開を継続して確認する必要があります。

NHS England Digital

英国のNHS England Digitalは2026年6月23日にCyber Alert CC-4799を公開し、影響組織に対してGHSA-R8MH-X5QV-7GG2を参照のうえ速やかに更新を適用するよう推奨しています。同アドバイザリはNHS内部分類の脅威重要度をMediumと評価していますが、libssh2の脆弱性そのもののCVSSはCritical(9.2)である点に注意が必要です。

2019年のCVE-2019-3855との類似性

libssh2のtransport.c付近におけるinteger overflow系のリモートコード実行可能なバグは、今回が初めてではありません。2019年3月、libssh2 1.8.1のリリースとあわせて9件の脆弱性が一括公開され、その中核にあったのがCVE-2019-3855でした。これは同じくtransport read経路における整数オーバーフローで、悪意あるサーバーが接続中のクライアントにコード実行を引き起こせるという、性質の極めて近いバグでした。7年後、同じコードベースで類似クラスのバグが再発した形になります。

実務観点での対処

  • libssh2依存先のインベントリ作成:パッケージマネージャー可視範囲(OSのlibssh2パッケージ)に加え、curl/libgit2系ツール/PHP/バックアップエージェント/ファームウェアアップデーターなど、libssh2を組み込んでいる可能性のあるソフトウェアを棚卸しする。静的リンクされたコピーや、アプリケーションがバンドルしているコピーは特に見落としやすい
  • commit 97acf3dを含むビルドの適用:libssh2公式のタグ付きリリースは準備中のため、当面はディストリビューションのバックポート(Debian DSA-6365-1のような形)か、ソースからのビルドで対応する。各製品ベンダーのアドバイザリチャネルでリリース状況を継続確認する
  • 暫定対応 – 外向きSSH接続の制限:パッチ適用までの間、libssh2を組み込んだクライアントが信頼できないSSHサーバーへ接続しないよう、外向きSSH接続を信頼サーバーに限定する。ホストキーの検証を有効化し、未知のホストキーへの自動接続を抑止する。CI/CDジョブ、自動デプロイパイプライン、監視エージェント、バックアップジョブのうち外部SSH接続を含むものは優先対応の候補
  • 異常検知ルールの整備:過大なSSHパケットサイズや、SSH接続を行うクライアントプロセスの不明瞭なクラッシュを観測ルールに組み込む。本攻撃に関連する異常の事後検知につなげられる可能性があります
  • 関連CVEの同時対処:CVE-2026-55199(DoS)、CVE-2025-15661(SFTP heap over-read)も同じlibssh2 1.11.1以下に影響するため、まとめて修正する

一次情報・公式情報

参考情報

slug: libssh2-cve-2026-55200-client-rce

コメント

タイトルとURLをコピーしました