メインコンテンツへスキップ

緊急速報!GitHubの超人気Action「tj-actions/changed-files」が乗っ取り被害!2万3千以上のリポジトリに影響か

·3 分
2025/03 GitHub サプライチェーン攻撃 セキュリティ CI/CD GitHub Actions

緊急速報!GitHubの超人気Action「tj-actions/changed-files」が乗っ取り被害!2万3千以上のリポジトリに影響か

引用元:https://news.ycombinator.com/item?id=43367987

rarkins 2025-03-15T12:59:18

やあ、Renovateの作者兼メンテナーだよ。
問題のあったリポジトリはもう削除されちゃったから、記憶を頼りに書くね。たぶんこんな感じ。
1. 攻撃者がtj-actions/changed-filesリポジトリへの書き込み権限を持ってた。
2. 攻撃者はRenovateのコミットを装った。実際には、同じリポジトリの最新のコミットを偽装したんだ。それはRenovateからのものだった。
3. 重要:このコミットの偽装は、メンテナーを「騙して」PRを受け入れさせるためじゃなくて、ちょっとわかりにくくするためだけ。孤立したコミットで、mainとか他のブランチの上にあるわけじゃない。
4. 予想通り、コミットは未検証として表示された。でも、現実的にほとんどの人はそこを見ないし、署名付きコミットだけを強制しない(本物のボットはコミットに署名する)。
5. ちょっと関係ないけど、「本物」のRenovate Botは、Dependabotと同じように、アクションをアップデートするPRを提案し始めた。
6. 自動マージを有効にしてる人もいたけど、これはRenovateのデフォルトの動作じゃない。自動マージしなくても、PRの一部として実行されれば、目的を達成できるかもしれない。
7. 今回の件で、多くの人がgitタグが不変だと誤解してることを思い知らされた。セマンティックバージョンの形式でも、タグは変更できないわけじゃない。

srvaroa 2025-03-15T19:37:07

>7. 今回の件で、多くの人がgitタグが不変だと誤解してることを思い知らされた。セマンティックバージョンの形式でも、タグは変更できないわけじゃない”
たぶん、これは「思い出す」より「学ぶ」って感じだね。多くの人がタグに基づいて成果物を作成するパイプラインを設定してる(例えば、「特定のパターンを持つタグで、成果物:$tagを作成する」)。
みんながやってるからってだけで、基本的なトレードオフを知らずに採用してるんだよね。Semverも同じようなケースで、特定の文字列でソフトウェアをラベル付けすると、魔法のように動作が保証されると信じてる人が多い。

junon 2025-03-16T07:04:41

新しいコミットで自動マージが無効にならないことに気づいた時、この脆弱性について考えたことがあったんだ。これはGitHubのありえないデフォルト設定だよ。
追記:GitHubもついに気づいた(または気にするようになった)みたい。テストしてみたら、自動マージがサイト全体で無効になってるみたい。設定は有効になってるのに、PRを自動マージするオプションが表示されない。
やっぱり心配してた通りだ!
追記2:GitLabのCIでも同じことをテストしてみた。あっちではちゃんとやってるみたい。自動マージの有効化は、有効にしたコミットに対してのみ有効で、新しいプッシュは自動マージを無効にする。こっちの方がずっと安全だ。

nine_k 2025-03-15T21:21:57

タグは署名できるし、署名を検証することもできるよ。コミットの署名や検証と同じくらい簡単。タグを作成する時に、署名をデフォルトのオプションにすることだってできる。
今回は役に立たないけどね。なぜなら、正当なボットが悪意のあるコミットで動作するように騙されたから。騙されたボットは、正当なキーでタグに署名することもできる。
「不変のタグ」はもちろん存在する。それはコミットハッシュだけど、情報がないね…。

sunnybeetroot 2025-03-16T20:07:02

コミットハッシュで。

bboreham 2025-03-16T20:51:00

SHAで固定するだけじゃ不十分みたい。Renovate botがSHAで参照されるアクションをアップデートしてた。
例:https://github.com/chains-project/maven-lockfile/pull/1111/f…
これはrenovate.jsonで設定されたpinGitHubActionDigestsヘルパーによって制御されてるみたい。

diggan 2025-03-15T14:57:55

>6. 自動マージを有効にしてる人もいたけど、これはRenovateのデフォルトの動作じゃない。自動マージしなくても、PRの一部として実行されれば、目的を達成できるかもしれない”
PRを作るだけでどうやって悪用できるのかわからないな。もし理由があって、知らないコントリビューターによるビルドに対してシークレットを有効にしてるなら、それは明らかに間違いだ。通常、シークレットを使用するビルドは、特定のブランチでのみ実行され、そこには承認されたコードが配置されているはず。
>多くの人がgitタグが不変だと誤解してる”
もしGitHubでライブラリを配布していて、多くの人がそれを使っているなら、protected branchesprotected tagsを設定する必要がある。変更をある程度防げるよ。

semiquaver 2025-03-15T15:36:48

>PRを作るだけでどうやって悪用できるのかわからないな。もし理由があって、知らないコントリビューターによるビルドに対してシークレットを有効にしてるなら”

今回の件では、Renovate botがインストールされたリポジトリにPRを作成するから、信頼されたコントリビューターとしてCIビルドをトリガーできる。

jonenst 2025-03-15T20:49:24

Branch Protectionも新しいRulesetsも、リポジトリへのプッシュアクセス権を持つ人からシークレットを保護することはできないんだよね。私が理解している限り、environment secretsだけがこの機能を提供してる(同じ組織内の複数のリポジトリ間で共有できないという欠点があるけど、GitHub APIを使ってコピーできる)。

mlor 2025-03-15T13:51:35

コメントありがとねー。前からそうだったけど、今回の件でサプライチェーンのセキュリティについて、マジで色々考えさせられるよね。

afitnerd 2025-03-16T20:01:08

記事サンキュー!#1がマジ弱点だったみたいだね。攻撃者がtj-actions/changed-filesに書き込み権限を得た方法って特定できた?今回の件で、プロジェクトへの貢献方法とか変わったりしたのかな?

3np 2025-03-16T04:45:44

ステップ1から4までは理解できたんだけど、ステップ5がどうトリガーされたのか分からん。リリースとかmainブランチの外でorphan commitしたってこと?

mubou 2025-03-15T01:16:11

最近、サードパーティの依存関係とか拡張機能とか、マジで信用できなくなってきた。npmパッケージもtransitive dependenciesが少ないやつしか入れなくなったし、vscodeとかChrome拡張機能もあんま入れなくなったわ。
だって、乗っ取られて悪意のあるコードが追加されたり、開発者自身が裏切って悪意のあるコードを注入したり(Moqとか)、会社に売られてライセンスが変わって金払わないと使えなくなったり(FluentAssertionsとか)するんだもん。eslintのdependency tree見てみ?全部信用できる?

ashishb 2025-03-15T02:38:39

>本当に全部信用できる?
もっと良い仕組みが必要だよね。
例えば、fdとかrgみたいなツールを実行するとき、なんでインターネットアクセスが必要なんだ?
IMHO、全てのツールのインターネットアクセスを禁止する(パワーモードとかで)だけで、この問題解決するかも。
あと、CIとCDが一緒になってるのも問題。production/release tokensは、通常のCIとは別のシステムにあるべき。CIはCDよりも多くのユーザーがアクセスする必要があるからね。
似たような事例だと、数ヶ月前にこんなのもあったよ。
https://blog.yossarian.net/2024/12/06/zizmor-ultralytics-inj

redserk 2025-03-15T02:52:12

仮想マシンで開発するようにして、色々制限してる。ブラウザもVMで使うようにした。
PCの性能も上がってるから、VMのオーバーヘッドも気にならないしね。
開発環境にはVagrantを導入するのが良いと思う。

bombcar 2025-03-15T05:05:04

https://www.qubes-os.org/
これも同じ考え方だね。

redserk 2025-03-15T15:42:28

Qubesは使い勝手が微妙だから、オススメしにくいかな。
何回か試したけど、まだ改善が必要だと思う。ユーザーエクスペリエンスを誰かが見直すべき。
Qubesが何やってるか完全に理解できてないから、逆にセキュリティが下がってるんじゃないかって不安になる時がある。個々の要素(Xenとか)は理解してるんだけどね。
あと、3D系のパフォーマンスは期待できないと思う。それと、Snowdenの名前を大々的に出してるのは怪しい気がする。
メインのワークステーションはMacで、ParallelsでVMを立ててる。Qubesの方が安全かもしれないけど、使い勝手が悪い。

hypeatei 2025-03-15T03:07:50

OpenBSDのpledge[0]システムコールは、この問題に対処するためのものだね。ただ、これはメンテナー側のdefense-in-depthであって、ユーザー向けではないけど。
>The pledge() system call forces the current process into a restricted-service operating mode. A few subsets are available, roughly described as computation, memory management, read-write operations on file descriptors, opening of files, networking (and notably separate, DNS resolution). In general, these modes were selected by studying the operation of many programs using libc and other such interfaces, and setting promises or execpromises.
[0]:
https://man.openbsd.org/pledge.2

yencabulator 2025-03-15T03:22:07

Pledgeは自己隔離のためのもので、ミスには有効だけど、意図的なサプライチェーン攻撃には効果ないよ。

hypeatei 2025-03-15T03:30:44

え、マジで?パッケージレベルじゃ効果ないのは明らかだけど、GitHub runnersとかNode自体が”制限”モードに入る機能を付けて、それを約束したら良くない?

もっとコメントを表示(1)
_flux 2025-03-15T08:48:53

openbsd.orgの論文によると、pledgeはexecveでオフになるらしいよ。ランナーで使うには制約がキツすぎかも。基本的にはCベースのアプリの脆弱性に対する防御策って感じかな。Nodeランタイム自体の脆弱性は少ないから、もっと細かい制限を実装できるかもね。

mnahkies 2025-03-15T09:24:01

firejailが便利だよ(github.com/netblue30/firejail)。opensnitch(github.com/evilsocket/opensnitch)で予期しないネットワークリクエストを監視してる。ArgoCDみたいなのを使えば、CIからprodへの直接アクセスを防げる。gitリポジトリへの書き込みアクセスは必要だけどね。

ptx 2025-03-15T18:50:03

FreeBSDにはCapsicumがあるよ。プロセスがcapabilityモードに入ると、開かれたファイルディスクリプタしか使えなくなる。サブプロセスをspawnしたり、ネットワークに接続したりはできない。[0] wiki.freebsd.org/Capsicum [1] docs.kernel.org/userspace-api/landlock.html

CamJN 2025-03-15T02:45:50

書き込みアクセスもブロックしないと、埋め込まれた公開鍵でファイルを全部暗号化されちゃうよ。読み込みアクセスもブロックしないと、タイミングサイドチャネル攻撃で機密ファイルを読み取って、ネット権限のある別のプロセスに情報を渡されるかもね。わかるでしょ?

ashishb 2025-03-15T03:13:44

>You also need to block write access, so they can’t encrypt all your files with an embedded public key. And read access so they can’t use a timing side channel to read a sensitive file and pass that info to another process with internet privileges to report the secret info back to the bad guy. You get the picture, I’m sure.”
マジそれ。
攻撃対象領域を減らすには、ざっくり以下の能力を制限するのが有効だよ。
1. 読み取り専用アクセス vs 読み書き
2. カレントディレクトリとそのサブディレクトリのみへのアクセス
3. 設定可能なインターネットアクセス
Dockerはだいたいできてる。Dockerでコマンドを簡単に実行できたらいいのにな。

mivirl 2025-03-15T04:13:39

>1. Mount current read-only directory to Docker without Internet access (and without access to local network or other processes) 2. Run fd 3. Print the results 4. Destroy the container
Systemdには便利なサンドボックス機能があるんだけど、あんまり知られてないんだよね。systemd-runを使えば、かなり良い感じにできるよ。
bubblewrapも使えるけど、sudoいらないかも。

from-nibly 2025-03-15T04:25:31

マジつまんなくなるよね。オンラインで買い物するときにSSL使わないといけなくなった時みたい。SSLは悪くないよ。今じゃデフォルトだし。でも、昔はちょっとリスキーだったし、今は必須。車をロックしないと盗まれるからロックしないといけないみたいな。

asveikau 2025-03-15T16:35:36

キーフォブの時代だと、車をロックするのはほぼ自動だよね。車が自動でロックしてくれることもあるし。特に何も思わないなぁ。

usef- 2025-03-15T02:11:55

マジそれなー。ブラウザのプラグインも同じ。無料プラグインの作者が、プロジェクトの買い取りオファーを頻繁に受けてるって話、よく聞くじゃん。絶対、そのオファーに乗るやついるって。

ronjouch 2025-03-15T02:26:05

こういうオファーのヤバいリストの例としては、https://github.com/extesy/hoverzoom/discussions/670 を見るといいよ。

mubou 2025-03-15T07:00:44

だから、俺はuBlock以外は拡張機能をフォークしてるんだよねー。GitHubで見つからない場合は、拡張機能のフォルダをコピーするだけ。そうすれば、コードを監査できるし、ヤバいものが勝手に紛れ込んでくる心配もないし。過去に2つの拡張機能が、明らかに必要のない許可を求めてきたことがあって、多分これが原因だと思うんだよね。
ちなみに、拡張機能のソースコードをインストールする前に確認できるサイトはここだよ:https://robwu.nl/crxviewer/

ronjouch 2025-03-15T13:04:32

マジ感謝!crx explorerへのリンクもありがとね!俺も似たようなことしてて、機能の一部しか使わないアドオンをいくつか置き換えるために、自作のアドオン書き始めたんだよね。例えば、Chromium使うとき、1.新しいタブページをカスタマイズしたい、2.タブのピン留め/ピン解除のキーボードショートカットを追加したい。どっちも拡張機能の一部だけど、セキュリティリスクもあるし、重いんだよね(全部入りじゃなくて、必要なのは2つのマイクロ機能だけ!)。だから、リソース消費ゼロの、たった2つの機能だけの個人的なアドオン作ってる。小さいし(20行のコード!)、gitでバージョン管理してるし、変わることも乗っ取られることもない。マイクロ機能が必要になったら、アドオンのドキュメント検索したり、LLMに聞いたりすれば簡単に追加できるしね。

juliob 2025-03-16T04:43:00

メニュー項目のキーボードショートカットを追加するためだけに拡張機能を使う必要ないんじゃない?OSでマッピングできるんじゃないの?macOSならキーボード設定でできるよ。

xboxnolifes 2025-03-15T05:40:24

無駄じゃないよ。拡張機能の作者がどれくらいの規模で買収オファーを受けてるかを示してるんだから。買い手が誰かは重要じゃない。

Gigachad 2025-03-15T03:01:02

俺は、ちゃんとした会社が作ってない拡張機能は、もうずっと使ってないなー(パスワードマネージャーとか)。インストールしたときはマルウェアじゃなくても、売られたらそうなるから。

XorNot 2025-03-15T02:00:34

.NETとかJavaって、ライブラリごとに権限を設定するみたいな考え方があったんだよね。それって、今の時代にマジで必要だと思う。評判とか簡単に操作できるし。例えば、このactionがネットワークにアクセスする必要なんてマジでないじゃん。

scrapcode 2025-03-15T01:57:17

.NET以外で、こういうタイプのactionって他に例ある?FluentAssertionsの件は知ってたけど、Moqは初めて聞いた。全然知らなかったわ。

do_not_redeem 2025-03-15T02:04:20

node-ipcってのが最近あったね。作者がアップデートで、geolocationのwebserviceにアクセスして、ローカルのファイルを消すかどうか決めるコードを仕込んだんだって。

puffybuf 2025-03-15T03:10:07

暗号通貨を盗むのがめっちゃ儲かるからね。今まではなかった市場があるんだよ。だからセキュリティがマジで重要になってる。EmacsとかPythonのパッケージも信用できないから、サンドボックス化し始めたわ。

h4ck_th3_pl4n3t 2025-03-15T04:22:21

根本的な解決策は、オープンソースの持続可能な資金調達モデルを見つけることだと思う。みんな生活のためにプロジェクトを売るしかないから裏切りが起きるんだよ。
問題は経済的、社会的なもの。
今は企業がオープンソースのメンテナーを搾取してる。webpackみたいに人気で資金が集まるプロジェクトは稀で、webpackが依存してるプロジェクトのメンテナーは一銭ももらってないってのは不公平じゃない?
資金調達に加えて、再現性のあるビルド環境が必要。GitHubがコードの唯一のソースみたいになってるけど、リスク高すぎ。go mod vendorみたいに依存関係を固定するのはいいけど、サプライチェーンで問題が起きたときの対応が大変。

もっとコメントを表示(2)
ta1243 2025-03-15T09:52:37

これマジ笑える。
>Lewis Ardernって人がSemgrepのルールを書いたから、tj-actionsを見つけられるよ。ローカルで実行できるって。
「リモートのコードがヤバいから、リモートのコードをダウンロードして実行して探せ」ってこと?

fumufumu 2025-03-15T02:16:45

スマホのアップデートも止めてる?みんなアプリの自動アップデートをオンにしてるけど、アップデートにはexploitが含まれてる可能性もあるんだよ。
パッケージマネージャーとか信用しないのはわかるけど、生活は同じようなもので溢れてる。ほとんどのアプリはサードパーティのライブラリで出来てるし。スマホは常にアップデートされるし、アップデートの度にexploitがインストールされる可能性がある。
AppleとかMicrosoftとかGoogleはサードパーティの依存関係をチェックしてると思うけど、他の会社は信用できない。でも気にしすぎてもしょうがない。アップデートしないとセキュリティホールが修正されないし、アップデートするとexploitが紛れ込む可能性がある。

lenkite 2025-03-15T10:47:00

だから、標準ライブラリが充実してる言語が好きになってきた。依存関係が少なくて済むからね。依存関係の管理がマジで大変になってきて、CVEの分析に時間取られすぎ。

imoreno 2025-03-15T20:23:47

言語を肥大化させる代わりに、信頼できる組織がライブラリをforkして、安全性を確認して、”お墨付きライブラリ”として再配布すればいいんじゃない?安全なライブラリを開発する方が、言語の機能を追加するより簡単だと思う。

jrockway 2025-03-15T07:41:21

信用はできるけど、盲目的にアップグレードしちゃダメ。ベンダーに頼るか、依存してるファイルの暗号学的ハッシュで固定するべき。アップグレードするときは、みんながアップグレードするまで待って、diffを自分で確認する。
Goの「ちょっとコピーする方が、ちょっと依存するよりマシ」って格言もあるし。複雑なライブラリの簡単な関数が必要なら、自分のコードにコピーすればいい。

harrisi 2025-03-15T02:51:25

これって今に始まったことじゃないんだよねー。Thompsonが40年前に「Trusting Trustに関する考察」で警告してたじゃん(もっと前から言ってた人もいると思うけど)。
最近、90年代初頭の議論をいろいろ調べてて、その時に考えさせられてるんだよね。当時「モバイルコード」って呼ばれてたものの安全な実行について。怪しいクライアントがリモートサーバーで実行するために送ってくるコードのことね。
w3のおかげで、当時の議論がまだたくさん残っててありがたいんだけど、論文のほとんどは会社とか大学のリンク切れだらけなんだよね。
WWWの初期に、すごく賢い人たちが考えてたのに、いつの間にか忘れ去られちゃったのが不思議だわ。Denoのpermissionsは、当時のアイデアの現代版としては一番面白いけど、ちょっと物足りないかな。「利用規約に同意しますか?」疲れの問題もあるし、特にweb開発だとね。web開発で使うパッケージって、ネットワークアクセスが必要なものが多いから、「まあ、そうだよね」って思っちゃうのも無理ないよね。
それに、ビジネスニーズ(あるいはそう思われてるニーズ)のために存在するコードのことも考えるとね。レポート作成アプリの何千ものパッケージを監査するために1週間か2週間必要だってボスに言ってみてよ。

throwaway48476 2025-03-15T02:28:58

依存関係を信頼するための解決策は、署名付きの公開ビルドと、手動レビューが必要なMLの”変なところ”検出器だね。

kurmiashish 2025-03-14T23:21:00

免責事項:私はStepSecurityの共同創業者です。
StepSecurity Harden-Runnerは、GitHub Actionsワークフローからのアウトバウンドネットワーク呼び出しを継続的に監視し、予想される動作のベースラインを生成することで、このセキュリティインシデントを検出しました。侵害されたtj-actions/changed-files Actionが実行されたとき、Harden-Runnerは、ネットワークトラフィックに予期しないエンドポイントが出現したため、フラグを立てました。これは、確立されたベースラインから逸脱した異常です。プロジェクトはこちらから確認できます:https://github.com/step-security/harden-runner

kurmiashish 2025-03-15T16:12:27

cyrnelさん、フィードバックありがとうございます!コミュニティに貢献できるよう頑張ります。現在、一般ユーザーとエンタープライズのお客様向けに個別の復旧手順を用意しています。

cyrnel 2025-03-15T17:48:27

編集ありがとう!「インシデント対応モード」では、一瞬たりとも無駄にできないからね!

shawabawa3 2025-03-15T14:01:01

これを検出するもっと簡単な方法は、GitHub actionのタグハッシュを保存して、タグが変更された場合にactionをフリーズすることだね。

harrisi 2025-03-15T02:39:41

CI/CDのやり方が、GitHub上のランダムなリポジトリをただ列挙するだけってのが、いつもショックなんだよね。監査可能でバージョンを固定してるのは知ってるけど、サーバーにsshで接続する推奨方法が、GitHubのランダムなユーザーからランダムなパッケージにsshキーを渡すことだってのは、どうかしてると思う。
LLMの台頭で、これは特に問題になってくると思う。”GitHub actionsからこのプロジェクトをビルドしてデプロイする必要がある”みたいなのから生成されたGitHub actionsがたくさんあると思うんだよね。自分はsshとかキー関連の重要なことは手動で実行するようにしてるけど、そうじゃない人もいるだろうし。

remram 2025-03-15T02:50:03

みんなバージョンを固定してないんだよね。タグを参照するのはバージョンを固定することじゃないし、GitHubの公式actionでも更新されることあるし。

jakub_g 2025-03-15T16:34:50

GitHub Actionsのインストールって、READMEからコピペするのが普通じゃん?actions/checkoutの例だとuses: actions/checkout@v4って書いてあるから、みんなそのまま使うよね。v4が書き換え可能だなんて思わないって。npm/yarnみたいにlockfileでバージョン固定してくれないし。せめてActionの作者がREADMEにsha256載せてくれたらいいのにね。GitHubがデフォルト良くないから、みんな同じことするんだよ。

xign 2025-03-18T12:43:14

GitHubと第三者を信用するのって違うと思うんだよね。GitHub信用できないなら、最初からGitHub Actionsなんて使う意味ないじゃん。タグの使い方はマジで問題あり。GitHubはタグの再発行禁止にすべき。どうしてもって言うなら、uses: actions/checkout@v4.5.6@abcdef9876543210みたいな構文で、タグとcommit両方指定できるようにしてほしい。根本的な解決にはならないけどね。結局、信用できないリポジトリ使わないのが一番大事。

0rzech 2025-03-16T00:29:13

ちゃんとバージョン固定してる人もいるよ。例えばこんな感じ:
- uses: Swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2.7.7
- uses: subosito/flutter-action@f2c4f6686ca8e8d6e6d0f28410eeef506ed66aff # v2.18.0
ちょっと手間だけど、用心に越したことないってポーランドのことわざにもあるし。

brokenpip3 2025-03-16T00:59:59

>It’s a bit more manual work
今回の件で、GitHub workflows全部ハッシュで固定するようにしたよ!手作業でやるのめんどくさくなったから、[0]に簡単なスクリプト作った。workflowファイルを全部更新してくれるし、pre-commit hookとしても使える。大したもんじゃないけど、時間節約になるから共有するね。
[0] https://github.com/brokenpip3/pre-commit-hooks?tab=readme-ov

0rzech 2025-03-18T23:43:08

github action dependencyを特定のtagのhashで指定して、dependabotが更新できるtagも指定する[1]ってやつ、結局botにやらせたら攻撃されやすくなるだけじゃん。
[1] https://github.com/brokenpip3/pre-commit-hooks/blob/f01df657

matsemann 2025-03-17T08:40:45

RenovateとかDependabotがhash更新PR作ってきたら意味ないよ。うちも先日こんなPRが自動で作られたし:
-uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3
+uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3
しかもこのPR、書き込み権限のあるユーザーから来るから権限ありで実行されちゃう。

xign 2025-03-18T12:46:52

Dependabotに直接commitさせちゃダメ。PRだけ作らせて、人間が確認してmergeするのが一番。真面目なリポジトリなら、botにcommit権限与えるのはセキュリティ的にヤバい。毎週何百も依存関係更新しなきゃいけないなら、技術スタックを見直すべき。

もっとコメントを表示(3)
matsemann 2025-03-19T09:23:58

自動mergeしなくても、botは高い権限持ってること多いし(プライベートリポジトリ見れるとか)、PR作るだけでビルドジョブが実行されて、更新されたバージョンでsecretsが暴露される可能性もある。

0rzech 2025-03-18T23:30:45

セキュリティの観点から言うと、GitHub actionのhash更新を自動化するのは、ピン留めする意味がなくなる。

harrisi 2025-03-15T02:54:28

GitHub actionの“パッケージ”って、メジャーバージョンで指定するんじゃないの? checkout@v4とか。それってv4の単一リリースを指定してて、更新されないと思ってたんだけど…違ってたらマジでヤバい。

remram 2025-03-15T02:57:48

いやいや、”v4”タグはv4.1からv4.2みたいに、マイナーバージョンがリリースされるたびにアップデートされるんだよ。機能的にはブランチみたいなもんさ。

werrett 2025-03-15T03:06:08

その通り。今回起きたのはまさにそれで、悪いやつがそれらのバージョンタグを全部、自分の悪意のあるコミットを指すように変更しちゃったんだ。
詳しくはここを見て
https://github.com/tj-actions/changed-files/tags
すべてのタグがコミット^0e58ed8を指してる。

https://github.com/tj-actions/changed-files/commit/0e58ed867

diggan 2025-03-15T15:02:46

もし間違ってたら訂正してほしいんだけど、”Rules”を使えば、タグのアップデートをブロックして、今回の問題を防げたんじゃないかな?
https://github.blog/news-insights/product-news/github-reposi

sestep 2025-03-15T15:41:09

そうだけど、タグのアップデートはリポジトリのパッチをリリースするための事実上のメカニズムだから、そんなことするGitHub Actionはないと思うよ。

harrisi 2025-03-15T03:02:12

マジか、教えてくれてありがとう(他の人も指摘してくれて)。ヤバすぎ。

semiquaver 2025-03-15T15:39:06

gitのSHAでActionを固定すれば防げるけど、普通はやらないよね。Actionの作者はアップデートが自動で適用されるのを好むだろうし。

sestep 2025-03-15T02:43:52

もっとヤバいのは、みんなバージョンを固定してないこと!コミットハッシュを指定できるのに、タグやブランチ名を使うことが多い。それって簡単に変更できるし、実際よく変更されるよね(例えば、v3v3.5.1からv3.5.2に更新されるとか)。

nextts 2025-03-15T03:03:16

マジかよ。またデフォルトが安全じゃないのか。バージョン指定子はハッシュだけであるべきだと思う。セマンティックバージョンなんて忘れろ(互換性の判断は別の方法でやれ。どっちにしろアップデートごとにセキュリティ監査が必要だ)。プロセスは、古いハッシュ、新しいハッシュ、diffコード、セキュリティ監査、互換性監査(semverはメタデータ)、テスト実行、新しいハッシュへのアップグレード。

harrisi 2025-03-15T02:56:54

あなたともう一人が指摘してたね。GitHub-orgのActionしか使ってないから、全部を管理するルールがあると思ってたんだけど…どうやって監査するんだ?
GitHub Actionsで特定のコミットハッシュを指定するように推奨されてるのを見たことない。いつもv1とかv2とか。

evntdrvn 2025-03-15T14:06:46

一応、ここでおすすめとしてドキュメントに書いてあるよ:

https://docs.github.com/en/actions/security-for-github-actio

sundarurfriend 2025-03-15T18:41:57

それやるにはfoo/bar@commitshagoeshereって書くんだって。
例:uses: RafaelGSS/bad-action@e20fd1d81b3f403df56f5f06e2aa9653a6a60763 # v1.0.1
(https://blog.rafaelgss.dev/why-you-should-pin-actions-by-com…から)

0rzech 2025-03-16T00:59:24

ほんとそれ。tagsは公式のGitHub actionsだけにしとくべき。他は全部pin止めしとくべきだね。

mcpherrinm 2025-03-15T03:37:41

OpenSSF scorecardは、hashpin止めされてない依存関係(GitHub actions含む)にフラグ立てるよ。
https://scorecard.dev/
https://github.com/ossf/scorecard/blob/main/docs/checks.md#p…

tommasoamici 2025-03-15T19:08:55

ssh/rsyncactions使わなきゃいけないのがずっとイヤだったんだよね。最近、直接コマンド使うように変えたんだ(ちょっと面倒だけど)。
GitHub Actionsの欠点は、サードパーティのactionsが広まりすぎてることだと思う。「GitHub actions ssh」で検索したら、公式ドキュメントが一番上に来るべきなのに、サードパーティのactionsの例ばっかり出てくる。

kalaksi 2025-03-15T09:06:03

マジそれ。GitHub Actions使おうとしたけど、公式ツールとドキュメントが充実してたGitLabにしたわ。俺のニーズはシンプルなんだ。ちょっとしたスクリプト書くだけでも、コードとdepsが多いサードパーティのrepoを監査するよりマシ。
あと、初心者だと、actionがただのランダムなrepoだって気づかないかも。

12_throw_away 2025-03-16T17:52:12

>CI/CDのやり方が、GitHub上のランダムなrepositoryをリストアップするだけってのが信じられない。
わかる?俺のCIのイメージは「定義済みの環境で、自動化されたコマンドの連続」なんだよね。再現性と並列処理のために、ちょっといい感じにしたbash scriptsの集まりみたいな。
それを、ベンダーロックされたブラックボックスな”Actions”に変えるのは…CI本来の価値を薄めてる気がする。

Sytten 2025-03-15T05:31:11

イミュータブルなgithub actions[1]の話が出てないのが意外。2022年からずっと待ってるんだよね。これが実現すれば影響はかなり小さくなるはず。githubには頑張ってほしい。
俺はいつもactionsをフォークするか、少なくともcommit hashを使うようにしてる。
[1] https://github.com/features/preview/immutable-actions

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。