Git 爆弾

Exploding Git Repositories

translated 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 statusgit 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 に連絡を。