メニュー
gitmoru
日本語

上書きしてもコミットは残っています

ブランチはただのポインタです

ブランチは 1 つのコミットに付いたラベルで、「ここが先頭」と指しているだけです。

force push はコミットを消しません。ラベルを動かしただけです。元のコミットは残っていて、住所を見失っただけです。

そして GitHub は、プッシュのたびにその住所を記録しています。

GitHub Events API
before:  7f3a91c   <- 見失った住所
head:    9d2b04e

復元も同じ仕組みです。ブランチをそのコミットに指し直すだけです。

スキャンの流れ

  1. 01

    期間内の動きを集めます

    プッシュで対象を絞り、非公開から公開に変わったリポジトリも見ます。これはプッシュが 1 件もなくても起きます。

  2. 02

    直前のツリーと今のツリーを diff します

    どのファイルが追加、変更、削除されたかが出ます。

  3. 03

    変わったファイルを全部残します

    ここが成果物です。ルールと関係なく残ります。

  4. 04

    先に読むものを並べ替えます

    判定ではなく順番です。

  5. 05

    あとは人か AI が引き取ります

    このツールはこの手前で止まります。

同じ事実が限界にもなります

GitHub Events APIは 90 日、300 件ほどしか残りません。それを過ぎると住所が見つかりません。

だから早く見る必要があり、ツールも画面でそう伝えます。掘った記録をファイルに残すのも同じ理由です。

攻撃直前のファイルと今のファイルを左右に並べた画面

先に読むものの決め方

どれも実際の事故から出てきたものです。どれにも当たらないから安全、という意味ではありません。

  • サイズの急増

    設定ファイルの後ろに空白を長く入れて、その先にコードを隠す手口があります。名前はそのままなので目につきませんが、サイズは正直に増えます。

  • リポジトリをまたぐ同じファイル

    ツールで複数のリポジトリを書き換えると、まったく同じ中身があちこちに入ります。内容のハッシュが同じなら同じファイルです。

  • author の偽装

    author の名前と日付は変えられます。ですが committer の日付は実際に作られた時刻なので、ずれた跡が残ります。

  • ツールの痕跡

    自動化ツールは作業用の一時ファイルを作り、コミットに混ざらないよう .gitignore に書き足します。その行がそのまま指紋です。

  • 署名が途切れた

    署名していたブランチで署名が抜けたかを見ます。もともと署名しない場所では出ません。変わったことだけが事実です。

  • アクションの固定外れ

    uses がコミットハッシュからタグに変わると、持ち主がそのタグを動かせます。2025 年に広く使われていたアクションがそうして乗っ取られました。

  • ワークフローが開けた口

    他人の PR のコードが秘密を持って動くようになったか、PR のタイトルが命令になり得るか。今回のプッシュで生じたものだけです。

動かしてみる →