何が起きたか・対象

Jupyterの画面比較用スナップショットを更新するActionに、承認後の差し替えコードを実行できる問題がありました。jupyter/notebookの利用例では、権限を持つメンバーがPRへplease update snapshotsとコメントするとworkflowが起動し、Actionがコードを取得します。識別子はCVE-2026-84973、GHSL-2026-203です。

ActionはPRのpushed_atとコメントのcreated_atを比べ、コメントより後の更新を拒否していました。しかし両方が秒単位のため、同じ秒にpushした更新は等しい時刻として通ります。Actionはその後で差し替え後のコミットの識別子であるSHAを取得し、PRのコードをジョブの作業ディレクトリへcheckoutします。取得結果のSHAと、その直前に記録したSHAが一致していても管理者が確認したコードとは限りません。

利用側のworkflowが、そのディレクトリからローカルActionやパッケージスクリプトを起動すると、差し替えたコードも動きます。jupyter/notebookの例では、PR内の.github/actions/build-dist/action.ymlを呼ぶため、投稿者がその実行手順を変更できます。研究は再現成功を示していますが、全リポジトリへの書き込みや秘密の持ち出しまで確認した報告ではありません。

報告・修正・公開の時系列

2026-08-27に報告され、09-03にjupyterlab/maintainer-toolsへ移管、Action v1.0.0で修正されました。開発元アドバイザリは09-03、研究公開は09-04です。

正常ならどう動くはずだったか

承認者が更新を依頼した時点のコードを取得し、その内容で画面を比較するための画像などのスナップショットを作る必要があります。承認者の確認と、後から読み込むPRのコードを同じコミットへ結び付けることが重要です。

技術的な原因

Actionが比較するPR側のpushed_atと承認コメントのcreated_atは、どちらも秒単位です。更新がコメントより後なら拒否する検査でも、同じ秒の更新は等しい値として通ります。その後で取得するSHAは既に攻撃者が差し替えたコミットのものなので、checkout結果とそのSHAが一致しても、承認された内容との一致は保証できません。

攻撃が成立する条件と流れ

攻撃者が、権限のあるメンバーの承認コメントと同じ秒にPRへ別のコードをpushします。時刻比較を通過したActionは差し替え後のSHAを記録し、そのコミットを取得します。利用側が取得したコードからローカルActionやパッケージスクリプトを実行する構成では、未承認コードがジョブの権限で動きます。 例えばworkflowのuses: ./.github/actions/build-distは、取得済みPRのディレクトリからActionを読む指定です。Actionが取得したコードを、利用側workflowが呼び出すことが実行の条件です。

確認された事実と、想定される影響

研究は複数回の再現成功を示しています。jupyter/notebookのworkflowは、GitHubがジョブ向けに発行するGITHUB_TOKENへcontentsとpull-requestsの書き込み権限を指定し、Actionの入力として渡します。これはリポジトリのファイルやPRを操作する権限です。取得後に実行されるコードが、ジョブで利用可能な認証情報を使えるなら、APIへ提示して許可範囲の変更を行うおそれがあります。具体的に使える値と保護ブランチの制限はworkflowの設定に従います。

秘密の窃取には、コードが読める秘密と、その値を攻撃者へ送れる経路が別途必要です。保護ブランチへの書き込み成功や、全リポジトリの侵害まで確認した研究ではありません。ジョブに付与された権限と、実際の攻撃活動の観測を区別します。

実際の修正・対応方針

開発元はv1.0.0で修正としています。詳細な差分はここでは直接確認していません。一般策は、承認した不変のコミットのコードを取得・実行するよう固定することで、時刻だけを比べる方式の改良と同一視しません。

利用者・運用者が確認すること

Actionの参照を修正済みのものへ更新します。利用側も、承認、SHA取得、コード取得、ローカル処理の実行を追い、どのコードにジョブの権限を与えるか確認します。

開発者への教訓(教材としての考察)

同じ時刻と同じ内容は別です。SHAを比較していても、比較の基準を攻撃者の更新後に取得していれば、承認した内容を守る検証にはなりません。

出典・確認範囲

  1. [1] Same-second TOCTOU in update-snapshots-checkoutGitHub Security Lab / 確認日 2026-10-29
  2. [2] Same-second TOCTOU vulnerability in update-snapshots-checkoutJupyterLab / 確認日 2026-10-29
未確認事項・限界

参照資料では実悪用や実際の被害件数を確認できません。未記載の実装差分は推測していません。