MonkeytypeのCIに脆弱性、修正版26.43.0が公開
MonkeytypeのGitHubリポジトリで、外部から送られたプルリクエストのコードが、書き込み権限つきのCIで動いてしまう脆弱性が見つかりました。影響するのはCIの設定で、アプリや利用者データではありません。リポジトリを管理している組織や、フォークして同じワークフローを残している組織は、26.43.0への更新か同等の修正を確認してください。
急ぎ度: 早めに
CVSS v3が9.3と高く修正版も出ていますが、影響がリポジトリのCIに限られるため、至急ではなく早めの対応で足りると見ています。
関係があるか
Monkeytypeのリポジトリを管理している人と、これをフォークして.github/workflows/fix-formatting.ymlを残している組織が対象です。アプリを使うだけの利用者や、アプリのデータには影響しません。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| Monkeytype(リポジトリのCIワークフロー) | 26.43.0より前 | 26.43.0 |
確かめ方
- 1自組織のリポジトリがMonkeytypeのフォークか、そのコードを取り込んだものかを確認する。
- 2
.github/workflows/fix-formatting.ymlが存在するかを確認する。 - 3存在する場合、
pull_request_targetで動き、フォークのプルリクエストをチェックアウトしているかを読む。 - 4取り込んだ時点が26.43.0より前かどうかを、タグやコミット履歴で突き合わせる。
何が起きたか
Monkeytypeのリポジトリで、外部の貢献者が送ったプルリクエストをきっかけに、貢献者のコードがリポジトリの書き込み権限つきで実行されてしまう脆弱性が見つかりました。
対象は.github/workflows/fix-formatting.ymlです。このワークフローはpull_request_targetで動き、リポジトリへの書き込み権限を持っています。フォークから届いたプルリクエストをチェックアウトし、そのpackage.jsonに書かれた依存関係をインストールして、フォーク側が用意したoxfmtを実行します。
しかもactions/checkoutは、権限の強いGITHUB_TOKENをGitの設定に残したままにします。信頼できないコードが動き終わるまで残るので、そのコードがトークンを読み取れる状態でした。分類はCWE-829で、外部が管理するコードを取り込んで実行してしまう型です。
攻撃の流れ
-
1
プルリク送付
外部の貢献者がフォークからプルリクエストを送ります。
-
2
ラベル付与
そのプルリクエストにformatラベルが付き、ワークフローが起動します。
-
3
外部コード実行
フォーク側の依存関係とoxfmtが、書き込み権限つきのCIで動きます。
-
4
トークン悪用
読み取られたトークンで、リポジトリの内容やプルリクエスト、Issueが書き換えられます。
どう悪用されるか
リポジトリのアカウントや権限は不要で、外部の貢献者としてプルリクエストを送れれば条件を満たします。ネットワーク越しに実行でき、複雑な準備もいりません。ただし、そのプルリクエストにformatラベルが付くことが必要で、CVSSでは利用者の操作ありと評価されています。
悪用されると、任意のコードがCI上で動き、GITHUB_TOKENを読み取って外部に送れます。そのトークンで、リポジトリへの内容のpushと、プルリクエストやIssueの書き換えができます。CVSSでは機密性と完全性への影響が高く、可用性への影響はなしとされています。
今すぐやること
-
1
修正版に更新する
Monkeytypeのリポジトリを管理している場合は、26.43.0に更新します。フォークしている場合は、修正のコミットを取り込むか、ワークフローを同等に直します。
-
2
同種のワークフローを洗い出す
自組織のリポジトリで、
pull_request_targetを使い、フォークのコードをチェックアウトして実行しているワークフローがないかを探します。grep -rn "pull_request_target" .github/workflows -
3
実行履歴を点検する
GitHub Actionsの実行履歴で、
fix-formatting.ymlがどのプルリクエストで動いたかを見ます。身に覚えのないコミットや、プルリクエストとIssueの変更がないかも合わせて確認します。 -
4
ラベルを付ける前に中身を見る
修正版を適用するまでは、外部からのプルリクエストにformatラベルを付ける前に、変更内容とpackage.jsonの差分を確認します。
すぐ更新できないとき
すぐに修正版を当てられない場合は、fix-formatting.ymlのワークフローをいったん無効にします。あわせて、外部のプルリクエストにformatラベルを付けない運用にします。
背景
Monkeytypeは、タイピングテストをブラウザーで行うオープンソースのサービスです。外部からの貢献を多く受けるため、フォークから届くプルリクエストをCIで検査・整形する仕組みが欠かせません。今回のワークフローは、名前のとおりコード整形を直す処理なので、リポジトリに書き込む権限が付けられていたと考えられます。
pull_request_targetは、フォークのプルリクエストでも、本体リポジトリの権限と秘密情報を使ってワークフローを動かせます。通常のpull_requestなら権限が抑えられる場面でも、こちらは強い権限のまま動きます。そのため、フォークのコードをチェックアウトして実行する組み合わせは、GitHub Security Labなどが「pwn requests」と呼んで注意してきた型です。今回は、フォークのpackage.jsonとoxfmtという、投稿者が自由に書き換えられるものが実行の入口になっていました。
よくある質問
Q.formatラベルを付けていなければ、問題はありませんか。
まだ分かっていないこと
- 実際の攻撃で悪用されたかどうか、被害があったかどうかは公表されていません。最新の状況は、Monkeytypeのセキュリティアドバイザリで確認してください。
- formatラベルを付けられるのがどの権限の人かは、公表されていません。リポジトリごとのラベル運用を、各自で確認する必要があります。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| monkeytypegame | monkeytype | — | — |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
Monkeytype is a minimalistic and customizable typing test. Prior to 26.43.0, the .github/workflows/fix-formatting.yml workflow runs on pull_request_target with repository write permissions, checks out a fork pull request, installs dependencies from the fork's package.json, and invokes the fork-controlled oxfmt binary. Because actions/checkout persists the elevated GITHUB_TOKEN in Git configuration until after untrusted code executes, an external contributor whose pull request receives the format label can run arbitrary code, read or exfiltrate the token, and push repository content or modify pull requests and issues. The issue affects the repository CI workflow, not the Monkeytype application or user data. This issue is fixed in version 26.43.0.
出典: CVE.org (CVE Program・cvelistV5) NVD