Aikido

フォークが目覚める:GitHubの見えないネットワークがパッケージのセキュリティを破壊する理由

チャーリー・エリクセンチャーリー・エリクセン
|
#
#
#
#
#

親愛なるGitHub様、

つまり、こうなんです。あるセキュリティ問題が もうしばらく前から公然の秘密として存在しているんです。人々は課題管理ツールでその話題を話し、セキュリティ情報開示で取り上げられ、Slackのスレッドでも議論されますそして結局その議論は「…でも実際にそのデータを公開するにはGitHubの協力が必要だ」という結論で終わってしまうんです 

この件についてご指摘するのは、同じ結論で終わる議論にうんざりしているからです。セキュリティコミュニティが求めているのは、既に存在するデータへの可視性だけです。それがなければ、私たちは行き詰まります。パッケージレジストリはユーザーに警告できず、セキュリティツールは不審な参照を検知できません。一方、攻撃者はこの盲点を完全に理解しています。彼らは既にそれを悪用しているのです。シャイ・フルードがそうしたように

休暇シーズンが近づいてきました。今年はかなり良い子だったと自負しています。ただ一つお願いしたいのは、生態系をより良く守るための手段を与えてほしいということ。どうか無理な願いではありませんように!

何が問題なの?

独自のnpmのようなパッケージマネージャーや、BunやPyPIのようなサードパーティサービスにより、開発者はGitHubリポジトリを直接依存関係としてインストールできます。独自のGitHub Actionsもこの同じ基本機能に依存しています。

npm install github:trusted-org/trusted-package#commit-sha

bun install github:trusted-org/trusted-package#commit-sha

pip install git+https://github.com/trusted-org/trusted-package#commit
- uses: trusted-org/trusted-package@commit-sha

ほとんどの人はこれを見てこう思うだろう:「セキュリティ上の問題がどこにある? 文字通り正確なリポジトリを指定しているだけなのに」

ああ。私も同じことを思ったよ。

しかし、実際に起きるのはこうだ:そのコミットSHAが リポジトリの リポジトリのフォークに存在する場合、フォークからコードをプルすることになります。あなたのURLにあるリポジトリからではなく、フォークから。一体どういうことだ?

ちょっと考えてみて。待ってるから…。URLにはこう書いてある 信頼された組織/信頼されたパッケージしかし、攻撃者がそのリポジトリをフォークし、悪意のあるコミットを追加し、そのコミットのSHAを参照させれば、あなたは彼らのコードをインストールしたことになる。あなたが想定したコードではない。指定したリポジトリでもない。彼らのものだ。

なぜこのようなことが起こるのか?

これはGitHubの「フォークネットワーク」によるものです。

おそらく聞いたことがないでしょう。仕組みはこうです:リポジトリをフォークしても、完全に独立したコピーは得られません。あなたのフォークはネットワークに参加し、元のフォークや他のすべてのフォークと基盤となるGitオブジェクトストアを共有します。これがGitHubのスケール処理の方法です。同じコミットのコピーを何百万も保存しているわけではないのです。納得ですね。

それがこの攻撃が成功する理由でもある。

上記のコマンドは最終的にGitHubの「リポジトリのアーカイブ(tar)をダウンロードするエンドポイント。ドキュメントにはこれについて次のように記載されています。 所有者 パラメータ:

ownerパラメータは単なるリポジトリの所有者であり、そのリポジトリ自体からのコードであることを保証するものではありません

コードがリポジトリに直接属している保証はなく、フォークから取得される可能性があるという警告もありません。正直なところ?このアーキテクチャを考慮すると、この動作は理にかなっています。コミットは共有グラフに存在し、GitHubがそれを提供しています。それは間違いではありません。

問題は、これが誰も見抜けない曖昧さを生み出すことだ。あなたは 信頼された組織攻撃者からコードを受け取った。GitHubは要求を履行した。ただ、あなたが求めていたものとは異なるものを受け取っただけだ。そしてGitHub以外のツールではその違いを判別できない。

非対称性 

GitHub.comに警告バナーを追加してくれたこと、本当に感謝しています。こうしたコミットに対する警告が表示されるのは? 非常に有用です。これが表面化させる価値のある問題だと認識している証拠ですから。

しかし問題はここにある:パッケージマネージャーはあなたのウェブサイトを見ない。APIを呼び出すのだ。そしてAPIは異常な事態が起きていることを一切示さない。フラグもメタデータも、文書化された情報も何もない。だからnpmはユーザーに警告できない。PyPIもBunもユーザーに警告できない。情報は存在する。あなたは既にフロントエンドでそれを表示している。だがエコシステムはそれにアクセスできないのだ。

どうしてダメなの?

厳しくする時だ

リポジトリアーカイブ(tar)をダウンロード」というエンドポイントについて話したのを覚えていますか?現時点では、これが最も脆弱な部分です。しかし、修正すべき箇所として最も明白な場所でもあります。

一つのアイデア:追加する 厳格な パラメータ。設定されている場合、コミットが実際の指定リポジトリではなくフォーク内のみに存在するとリクエストは失敗する。パッケージ管理者はこの動作を有効にし、その他は現行の動作を維持するため、何も壊れない。

その警告バナーについては、フロントエンド側ですでにこのチェックを行っています。APIにも同じ機能を持たせてください。もちろん、API全体でより多くのフォークネットワーク情報を公開できれば理想的ですが、少なくとも最も明らかな問題はこれで解決されます。

楽しい休日を!

これは苦情として書いているわけではありません。私たちが皆、安全で信頼できるエコシステムを望んでいるという点で一致しているからこそ、書いているのです。GitHub.comで警告を表示することで、すでにこの問題を認識されています。次に、その同じシグナルをAPIを通じて公開していただくと、エコシステムがそれに基づいて行動できるようになり、大きな違いが生まれます。

貴社側でのわずかな改善が、エコシステム全体に大きな改善をもたらすでしょう。これこそが最良の改善ではないでしょうか? 

そして、ホリデーシーズンを迎えた今、裏で耳にしていることを共有したいと思います。ここ数週間、エコシステムにおける主要なプレイヤー数名と話をしましたが、皆が休暇を取って家族と過ごす時間を確保しようとしている最中に何か問題が起きるのではないかという、静かで共通の懸念が囁かれています。もちろん、この一つの問題を解決したからといってそのリスクが完全に消えるわけではありませんが、この懸念は現実のものであり、広く共有されているのです。

楽しい休日を、GitHub。穏やかな年末を。

4.7/5

今すぐソフトウェアを保護しましょう

無料で始める
CC不要
デモを予約する
データは共有されない - 読み取り専用アクセス - CC不要

今すぐ安全を確保しましょう

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

クレジットカードは不要。