当社のAIエンジンNeutronが、UCバークレーのCyberGymベンチマークで97.1%のスコアを記録しました。 詳細を見る

ディープダイブ

ディープダイブ

悪意あるOVHcloud CLIのリリースアーカイブがシークレットを窃取

2026年10月19日、OVHcloud CLIの5つのリリースでアーカイブが差し替えられ、94分間シークレット窃取ビルドが配布されました。全シークレットをローテーションし、v0.16.0をインストールしてください。

要点

  • 2026年10月19日12:47~14:21 UTC、乗っ取られた貢献者のGitHubアカウントを使う攻撃者が、公開済みのOVHcloud CLI v0.11.0~v0.15.0という5リリースのダウンロードアーカイブを、シークレット窃取ビルドに差し替えました。差し替えファイルは94分間取得可能でした。
  • その時間帯に、macOS x86_64またはarm64、Linux x86_64またはarm64、Windows x86_64で、公式インストールスクリプト、リリースの直接取得、ハッシュ未固定のCI取得、CLI自身の更新コマンドを通じてGitHubからインストール・更新した人は、差し替えビルドを受け取りました。Homebrew、go install、Docker、時間帯より前のインストールは影響を受けません。
  • OVHcloud創業者Octave Klabaは、バイナリがユーザーのディスク上のシークレットを探すと述べ、影響者は保存された全シークレットを変更すべきとしています。差し替えアーカイブの公開分析はなく、OVHcloudも取得件数を公表していないため、被害者数は不明です。
  • その時間帯にインストール・更新した場合、端末から読める全シークレットを露出済みと扱い、別の端末からローテーションし、バイナリを削除してください。同日夜に公開された変更不能なv0.16.0を、gh release verify-assetで検証してインストールします。

影響を受けるか

次の条件をすべて満たす場合に影響を受けます。

  • 2026年10月19日12:47~14:21 UTCにOVHcloud CLIをインストールまたは更新した
  • 下記4経路のいずれかでGitHubから取得した
  • 対象が各リリースで差し替えられた5種類のプラットフォーム、macOS x86_64またはarm64、Linux x86_64またはarm64、Windows x86_64のいずれか。Linux i386、Windows i386、Windows arm64、WebAssemblyのビルドは全リリースで未変更

影響する4つのダウンロード経路です。

  • ハッシュを確認せず最新リリースのアーカイブを取得する公式スクリプトinstall.sh
  • 対象5リリースのGitHubページから、独立した検証なしに直接取得
  • ハッシュを固定せず、リリースダウンロードURLから取得するCIジョブやビルド処理
  • macOSまたはLinuxで、スクリプトか手動で導入したCLI自身の更新コマンド。ハッシュを確認せずアーカイブを取得し、バイナリを置き換える

次のいずれかに当てはまれば影響を受けません。

  • Homebrewでインストールした。当該時間帯のcaskは各アーカイブの元のSHA-256を固定し、Homebrewは不一致の取得を拒否します。そのため、その時間帯のbrewインストール・更新は差し替えファイルを導入せず失敗したはずです。tapのcask履歴には、9月16日のv0.15.0更新から10月19日のv0.16.0更新まで変更がありません。一部初期記事はHomebrewも対象としましたが、固定ハッシュによりこの経路は除外されます。
  • go installまたはソースからビルドした。v0.15.0タグは9月のコミット760fd72を指したままで、ソースツリーは変更されていません。
  • Dockerイメージovhcom/ovhcloud-cliを取得した。latestタグの最終pushは差し替えの数週間前の9月21日で、再ビルドされていませんでした。
  • 10月19日12:47 UTCより前にインストールし、対象時間帯に更新していない。またはLinux/Windows i386、Windows arm64、WebAssemblyだけを取得した。
リリース 状態
v0.11.0~v0.15.0、2026年4月14日~9月16日公開 各リリース6アセット、すなわち5プラットフォームのバイナリとchecksums.txtが対象時間帯に差し替え。Linux i386、Windows i386、Windows arm64、WebAssemblyは未変更。差し替えファイルは14:21 UTCにOVHcloudが削除
v0.10.0、2026年3月2日公開 安全。元の10アセットすべてが元のタイムスタンプのまま
v0.16.0、2026年10月19日17:16 UTC公開 安全で変更不能な置き換え版。ovh-cdsサービスアカウントがリリース証明付きで公開

修正方法

検証済みの安全なリリースをインストールします。Linux x86_64ではGitHub CLIでv0.16.0を取得し、展開前に証明を検証してからバイナリをインストールします。

gh release download v0.16.0 --repo ovh/ovhcloud-cli \
  --pattern 'ovhcloud-cli_Linux_x86_64.tar.gz' &&
gh release verify-asset v0.16.0 ovhcloud-cli_Linux_x86_64.tar.gz \
  --repo ovh/ovhcloud-cli &&
  tar xzf ovhcloud-cli_Linux_x86_64.tar.gz &&
  sudo install -m 0755 ovhcloud /usr/local/bin/ovhcloud

他のプラットフォームでは、v0.16.0リリースから対応アーカイブを選び、展開や実行前に検証してください。

v0.16.0は変更不能で、GitHubは誰にもファイルを変更させません。また、ファイルの署名付き記録であるリリース証明があり、verifyコマンドで確認できます。今後はCIでアーカイブのSHA-256を固定してください。影響経路には差し替えを拒否する独立したハッシュチェックがありませんでした。下流のCIジョブは、固定ハッシュによって差し替えを検出しました。

悪意あるコードの動作

OVHcloud自身の説明では、差し替えバイナリはシークレット窃取プログラムです。プロジェクトのリリースパイプライン外のローカルチェックアウトからビルドされ、保存・公開分析されたコピーはありません。

Klabaは、バイナリがユーザーのディスクに保存されたシークレットを探し、品質は低いが機能すると述べました。OVHcloudは、読むパス、収集内容の送信先、ダウンロード数を公開しておらず、誰かが保存する前に差し替えファイルを削除しました。そのため動作はベンダーの説明からしかわかりません。

削除前に報告者が記録したgo version -mの出力から、作り方について次が証明できます。

  • モジュール行はv0.15.1-0.20261013083505-5ead8ef9b43d+dirtyです。これはタグのないコミットからのビルドにGoが生成する仮バージョンで、ここでは2026年10月13日のコミットです。正規リリースは仮バージョンでなくタグを使います。安全なv0.16.0もv0.16.0+dirtyと表示するため、+dirty自体は正規ビルドにも現れます。識別点は0.20261013083505という仮バージョンの時刻と、予期しないコミット、ビルドフラグの組み合わせです。
  • 記録されたコミットは、v0.15.0タグの760fd72ではなく5ead8efです。v0.16時代のツリーがv0.15.0のファイル名を装っています。
  • -ldflags="-s -w"行が存在します。正規パイプラインは、Goが記録フラグから除外するバージョン指定フラグを使うため、正規版には-ldflags行自体がありません。
  • vcs.modified=trueは、ビルド時に未コミットの変更があったことを意味し、ローカルチェックアウトへの変更と整合します。ただし、このフラグだけでは変更内容や悪意は証明できません。

差し替えの経緯

必要だったのは、書き込み権限を持つ貢献者アカウント一つの乗っ取りと、変更不能リリースが無効であることです。アカウントはGitHub Releases APIで5リリースそれぞれの6アセットを置き換え、公開ハッシュが差し替えバイナリと一致するようchecksums.txtを最後にアップロードしました。

OpenSourceMalwareがGitHubのサーバー側記録から再構成し、報告者のissue #300で裏付けられた手順です。

  1. 攻撃者は、ovhcloud-cliに書き込み権限を持つ正規OVH貢献者HassenBFの認証情報を保持していました。その人のマージ済み公開貢献はOVHcloudのドキュメントリポジトリにあります。アカウントは数か月前から侵害されていました。2026年3月5日と6日、個人リポジトリ4つが、隠しローダーを追加する改変済み先端コミットでforce-pushされており、サーバーで確認できる最初の攻撃者利用です。
  2. 10月19日12:47~約13:12 UTC、通常のGitHub Releases APIで、v0.15.0の5つのプラットフォームアーカイブとchecksums.txtを削除・再アップロードしました。その後v0.14.0、v0.13.0、v0.12.0、v0.11.0でも繰り返し、毎回最後にchecksums.txtを置いて新しいバイナリとハッシュを一致させました。
  3. タグのpushもGitHub Actionsの実行もありません。リリースワークフローはタグpushだけで動き、実行一覧では10月16日から10月19日16:00 UTCのv0.16.0タグpushまで実行がありません。プロジェクトのビルドパイプラインには触れず、既存リリースへ直接アップロードしていました。
  4. 影響する全インストール経路は、同じリリースURLから新ファイルを取り、どこにもハッシュチェックがありませんでした。インストールスクリプトは元々確認せず、更新コマンドも確認せず、固定のないCIはそこにあるものを取得しました。
  5. Linux arm64アーカイブのSHA-256を所有者が固定していた下流CIジョブが13:50 UTCに失敗しました。所有者はgo version -mでパイプライン外のビルドを見つけ、非公開報告窓口がないため公開issueを作成しました。OVHcloudは14:21 UTCに差し替えアセットを削除し、17:16 UTCに変更不能なv0.16.0を公開しました。
flowchart LR A["書き込み権限のある
貢献者アカウントを乗っ取り"] --> B["Releases APIが公開済み5リリースの
6アセットを差し替え"] B --> C["checksums.txtを最後に変更し
公開ハッシュを一致させる"] C --> D["インストール経路が同じURLから取得
ハッシュチェックなし"] D --> E["開発者の端末で
シークレット窃取ビルドが動く"] C --> F["別のCIジョブが取得を拒否
固定SHA-256が不一致"] style D fill:#f8d7da

欠陥はDです。影響する4経路はどれも、実行前に取得ファイルを独立検証していませんでした。Fの別個の固定SHA-256チェックが失敗し、そのCIで差し替え版が動く前に検出しました。

攻撃者に可能なこと

ユーザーとして動く窃取プログラムは、そのアカウントが利用可能なシークレットを読み、コピーできます。影響端末の全シークレットを変更するというOVHcloudの案内に従い、次を露出済みと扱ってください。

  • OVHcloud認証情報:~/.ovh.confと環境変数にあるAPI認証情報
  • その他の読み取り可能なシークレット:SSHキー、.npmrc、.netrc、.pypirc、.envファイル、クラウドやCIの認証情報

これらは棚卸しとローテーションの対象です。削除されたペイロードの公開分析がなく、正確な窃取対象一覧は確立されていません。

攻撃に必要な条件です。

  • 94分間に、影響する4経路の一つから、差し替えられた5プラットフォームのビルドをインストールまたは更新
  • それ以外は不要。通常のインストールコマンド以外のユーザー操作、OVHcloudのソースやビルドパイプラインの侵害、意図したツールを実行する以外の被害者の行動は必要ない

インストールした場合の対処

差し替えビルドを実行した、または実行していないと証明できない場合、OpenSourceMalwareの補足を含めOVHcloudの案内に従ってください。

  1. その端末で読める全シークレットを露出済みとし、別端末からすべてローテーションします。影響端末では差し替えバイナリがまだ動いている可能性があります。ローテーションが先です。バイナリ更新はプログラムを置き換えますが、すでにコピーされたキーは失効しません。
  2. バイナリを削除し、同日夜に公開された変更不能リリースv0.16.0以降をインストールします。
  3. gh release verify-asset v0.16.0 FILE --repo ovh/ovhcloud-cliで新しいアーカイブを検証し、取得するCIジョブやDockerfileではSHA-256を固定します。欠けていたこの制御が攻撃経路を開きました。

侵害されたかを確認する方法

バイナリを実行せず確認してください。3つの特徴で差し替えビルドを区別できます。この区別は重要です。+dirtyやvcs行があれば悪意あるとする一律の助言では、v0.16.0+dirtyとvcs.modified=trueを示すOVHcloud自身の正規リリースも検出してしまいます。

go version -m ./ovhcloud
  • モジュール行がv0.15.0やv0.16.0のリリースタグではなく、仮バージョンv0.15.1-0.20261013083505-5ead8ef9b43d+dirty
  • 記録コミットがタグのコミット(v0.15.0では760fd72)ではなく5ead8ef
  • -ldflags="-s -w"行が存在。正規のOVHcloudリリースには-ldflags行がない

すでに取得したovhcloud versionの出力では、正規のv0.16.0はv0.16.0を表示します。リリースバージョンフラグが省略された場合のソースのデフォルトはundefinedです。記録されたフラグで他が未変更なら、この値になると予想されます。ただし、削除されたペイロードで確認された値ではありません。疑わしいバイナリを実行せず、上記の静的チェックを使ってください。

ハッシュの組が公開された唯一のアーカイブは、直接比較できます。

  • v0.15.0のovhcloud-cli_Linux_arm64.tar.gz、差し替え版:3833daffcaaaab27e4e0e0833240ffcb1df8df648f4ec0bc4a75c176e28933cb
  • v0.15.0のovhcloud-cli_Linux_arm64.tar.gz、元の版:5c2beb56e6d83a4b426565a1557791ef759316abcc4effb38dd627c90aeb80e0

OpenSourceMalwareが公開したアカウント侵害キャンペーンの指標は、コピーの残っていないCLIバイナリの指標とは別です。

  • 乗っ取られたGitHubアカウント:HassenBF(ID 4911006)
  • ローダー:preinstall.js、SHA-256 43df42fd79f6f81e530892b54634598770d6e496796a863c596e616bcb3fec70
  • ライフサイクルスクリプト:package.json内の"preinstall": "node preinstall.js"エントリ
  • Solanaのデッドドロップ用ウォレット:BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC
  • 実行制御用ファイル:macOSホームディレクトリの~/init.json

経緯

時刻はすべてUTCです。OpenSourceMalwareが公開したGitHubのサーバー側記録、報告者のissue #300、リリース記録に基づきます。

  • 2026-03-05および03-06:HassenBFの個人リポジトリ4つに、改変した先端コミットと隠しローダーをforce-push。攻撃者による最初のサーバー検証済み利用。
  • 2026-05-25~09-07:同アカウントがOVHcloudのドキュメントリポジトリで通常のプルリクエストを継続。
  • 2026-10-13 08:35:コミット5ead8efがmainへマージ。後にこのツリーへ未コミットの変更を加えて悪意あるバイナリをビルド(vcs.modified=true)。
  • 2026-10-19 12:47:最初の差し替えアセットがv0.15.0へ到達。
  • 12:57:公開ハッシュが一致するようv0.15.0のchecksums.txtを変更。
  • 13:01~13:12:v0.14.0、v0.13.0、同じ処理でv0.12.0とv0.11.0を差し替え、作業終了。
  • 13:50:固定SHA-256が不一致になったCI所有者がissue #300を作成。
  • 14:21:OVHcloudが5リリースの差し替えアセットをすべて削除。
  • 16:00:v0.16.0タグのpushでビルドとリリースのワークフロー開始。
  • 17:16:ovh-cdsサービスアカウントが、変更不能でリリース証明付きのv0.16.0を公開。KlabaがXへ警告を投稿。
  • 2026-10-20:OVHcloudが初期確認では他のリポジトリに影響なしとし、事後報告を約束。
  • 2026-10-26:本記事を公開。

よくある質問

Homebrewは影響を受けたか?

いいえ。当該時間帯のcaskは元のSHA-256を固定し、Homebrewは不一致を拒否するため、インストールや更新は差し替え版を入れず明確に失敗したはずです。初期記事はHomebrewも対象としましたが、tapの履歴ではv0.15.0とv0.16.0のcaskの間に変更がありません。

ソースやビルドパイプラインが侵害されたのか?

いいえ。v0.15.0タグは9月のコミットを指したままで、ソースツリーは未変更、差し替え中にGitHub Actionsの実行もありません。実行一覧は10月16日からv0.16.0タグのpushまで空です。攻撃者は貢献者のトークンを使い、Releases APIで既存リリースへファイルをアップロードしました。変更不能リリースが無効だったため差し替えられました。

変更不能リリースの設定が重要な理由は?

GitHubの変更不能リリースが有効でなければ、書き込み権限を持つ人はリリースの添付ファイルを削除・再アップロードでき、URLは変わりません。OVHcloudは有効にしていませんでした。この機能は2025年10月から一般提供され、ファイルとタグをロックしますが、有効化後に作るリリースだけを保護します。現在は有効なので、v0.16.0を同じ方法で変更することはできません。

v0.16.0が安全と判断する方法は?

個人アカウントではなくOVHcloudのovh-cdsサービスアカウントが公開し、変更不能とされているため置き換えできません。また、GitHubの公開検証フローに従い、gh release verify-asset v0.16.0 FILE --repo ovh/ovhcloud-cliで自分で確認できるリリース証明があります。

実際に侵害された人はいるか?

不明です。OVHcloudは94分間の取得件数を公表しておらず、差し替えアーカイブのコピーも保存されていないため、被害者数もペイロード分析もありません。その時間帯に影響経路を使った場合、エビデンスの有無にかかわらずローテーションするのが安全な対応です。

GlassWormキャンペーンなのか?

アカウントの関連は実在しますが、帰属は証明されていません。乗っ取られたアカウント自身のリポジトリは3月にforce-pushされ、SolanaのデッドドロップウォレットによりGlassWormのForceMemoキャンペーンと結び付くローダーが入りました。同じアクターが10月にアカウントを使ったかは、OpenSourceMalware自身の言葉でも推論です。10月のバイナリは保存されていないため、GlassWormに結び付けられた内容はありません。

次の差し替えの前に、未固定の取得を発見

Ostorlabのソースコードスキャンガイドからリポジトリのリスクをレビューしてください。OVHcloudでは、CI設定やDockerfileのハッシュ未固定の取得を調べ、保持したバイナリをgo version -mで確認し、仮バージョンv0.15.1-0.20261013083505-5ead8ef9b43d+dirtyと-ldflags="-s -w"行を探します。これらの手動チェックは、スキャナーにこの事象専用のシグネチャがあることを前提としません。

参考資料

  • The Hacker News、「Hackers Hijack Five OVHcloud CLI Releases to Distribute Secret-Stealing Malware」、2026年10月20日。影響経路、Homebrew tap検証、検出指標、+dirtyの誤った助言への訂正:https://thehackernews.com/2026/10/hackers-hijack-five-ovhcloud-cli.html (2026年10月26日確認)
  • OpenSourceMalware、「Glassworm Hacks OVH Clouds CLI tool」、2026年10月19日。サーバー側の時系列、弱点表、キャンペーン指標、帰属の限界:https://opensourcemalware.com/blog/glassworm-hacks-ovh-clouds-cli-tool (2026年10月26日確認)
  • 2026年10月19日13:50 UTC作成のissue #300。差し替えの記録、go version -m出力、ハッシュの組:https://github.com/ovh/ovhcloud-cli/issues/300 (2026年10月26日確認)
  • 2026年10月19日17:16 UTC公開の安全で変更不能なv0.16.0、アセット一覧と変更履歴:https://github.com/ovh/ovhcloud-cli/releases/tag/v0.16.0 (2026年10月26日確認)
  • リリースURLから取得しハッシュを確認しないv0.15.0のインストールスクリプト:https://github.com/ovh/ovhcloud-cli/blob/v0.15.0/install.sh (2026年10月26日確認)
  • ハッシュ確認なしで取得してバイナリを置き換えるv0.15.0の自己更新コード:https://github.com/ovh/ovhcloud-cli/blob/v0.15.0/internal/upgrade/install.go (2026年10月26日確認)
  • GitHubの変更不能リリース文書と2025年10月28日の一般提供開始の変更履歴:https://docs.github.com/en/code-security/concepts/supply-chain-security/immutable-releases および https://github.blog/changelog/2025-10-28-immutable-releases-are-now-generally-available/ (2026年10月26日確認)
  • GitHubのリリースアセット検証フロー:https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/verify-release-integrity (2026年10月26日確認)
  • 当該時間帯に有効だった、元のSHA-256を固定するHomebrew tapのcaskコミット:https://github.com/ovh/homebrew-tap/commit/b70a654 (The Hacker News経由の参照、2026年10月26日)
  • OVHcloudサービスを管理する公式CLIのリポジトリovh/ovhcloud-cli。2026年10月26日時点で218スター:https://github.com/ovh/ovhcloud-cli および https://api.github.com/repos/ovh/ovhcloud-cli (2026年10月26日確認)
  • 安全なv0.16.0アセットのダウンロード数。2026年10月26日までの週に2,053:https://api.github.com/repos/ovh/ovhcloud-cli/releases/tags/v0.16.0 (2026年10月26日確認)
  • OpenSourceMalwareとnext.inkが引用したKlabaの10月19日のX上の声明:https://next.ink/262824/le-client-en-ligne-de-commande-dovhcloud-compromis-par-un-pirate-sur-github/ (The Hacker News経由の参照、2026年10月26日)