Git 爆弾
Exploding Git Repositories by Kate Murphy on
原著者の許諾を得て翻訳・掲載しています。
もしあなたが冒険好きな人なら(そして起こるかもしれない再起動に対処できる人なら)、この小さなリポジトリをクローンしてください:
$ git clone https://github.com/Katee/git-bomb.git
クローンできましたか?あなたのマシンが相当なメモリ(RAM とストレージ合わせて)を積んでいない限り、git が殺されたか、メモリ不足になったか、再起動しなければならなかったと思います。なぜでしょう?これは、たった12個のオブジェクトで構成されたリポジトリです。
どのようにして、この小さなリポジトリがメモリ不足を起こすのでしょうか?その秘密は、git が行う blobs(ファイルを保存しておくもの)の de-duplication(重複排除)です。これは、リポジトリを小さく、そしてコミット間でファイルが変更されていない場合に同じ blob を使うようにするためのものです。また、git は tree(リポジトリ内のディレクトリ構造を定義するもの)に関しても重複排除をしています。git-bomb
コマンドは10億個ものファイルを作成しようとしますが、blob への参照は10個しかなく、tree も10個しかありません。
これは Billion Laughs(別名 XML bomb)と非常によく似ているため、「git bomb」という名前になっています。
構造
下層
一番下に "one laugh" という文字列を含む blob ファイルがあります:
$ git show 5faa3895522087022ba6fc9e64b02653bd7c4283
one laugh
この blob を10回参照する tree オブジェクトが1つあります:
$ git ls-tree 6961ae061a9b89b91162c00d55425b39a19c9f90
100644 blob 5faa3895522087022ba6fc9e64b02653bd7c4283 f0
100644 blob 5faa3895522087022ba6fc9e64b02653bd7c4283 f1
# … snipped
100644 blob 5faa3895522087022ba6fc9e64b02653bd7c4283 f9
中層
そして、その tree オブジェクトの上に9階層分の tree オブジェクトを重ねます(ここに示すのは一番上の tree オブジェクトです)
$ git ls-tree 106d3b1c00034193bbe91194eb8a90fc45006377
040000 tree 8d106ebc17b2de80acefd454825d394b9bc47fe6 d0
040000 tree 8d106ebc17b2de80acefd454825d394b9bc47fe6 d1
# … snipped
040000 tree 8d106ebc17b2de80acefd454825d394b9bc47fe6 d9
上層
master の ref は一番上の tree オブジェクトを指しています:
$ git log --pretty=format:"%s | tree: %T"
Create a git bomb | tree: 106d3b1c00034193bbe91194eb8a90fc45006377
ツリーを辿らなければならないもの(git status
や git checkout
)を使ってみると、git はファイルをディスクに書き込む前にツリーを構築するので、メモリの問題に陥ります。つまり、ディスク領域を埋める代わりにプロセスが強制終了されます。
他の Git 爆弾
アイデアは同じですが少し違ったバージョンです。このリポジトリには15,000のネストされたツリーオブジェクトがあります。私のラップトップでは、スタックが爆破し、セグメンテーションフォルトになりました。
$ git clone https://github.com/Katee/git-bomb-segfault.git
もしあなたが自分の git 爆弾を作りたいなら、Making Your Own Git Bombs を読んで下さい。
アップデート
2017-10-11:この記事を投稿するために、Hackerone 上の Github から許可を得る
2017-10-12:Hackerone 上の Github から表彰された
2017-10-12:Hacker News のトップページ載り、コメントを頂いた
2017-10-13:git のメーリングリストにこれに関する議論があります。これは、このような性質のリポジトリの言及が含まれています。
2017年10月14日:CVE-2017-15298
2017年10月15日:Josh Leeが私の随分前に GitHub に同様のリポジトリをアップロードし、しかも非常に似た名前でした!このリポジトリは現在無効になっていて、彼はそれについて書きませんでした。
Wesley、おかしなリポジトリで一緒にペアリングしてくれてありがとう。彼は今仕事を探しています。経験から言えますが、彼とペアリングするのは素晴らしいです。彼を雇いたい場合は w.aptekar@gmail.com に連絡を。