メニュー
gitmoru
日本語

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

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

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

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

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

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

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

スキャンの流れ

  1. 01

    期間内のプッシュを集めます

    イベントで対象を絞るので、組織全体を総当たりしません。

  2. 02

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

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

  3. 03

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

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

  4. 04

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

    判定ではなく順番です。

  5. 05

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

    この道具はこの手前で止まります。

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

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

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

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

先に読むものの決め方

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

  • サイズの急増

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

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

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

  • author の偽装

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

  • ツールの痕跡

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

動かしてみる →