ReZero's Utopia.

Exploding Git Repositories

字数统计: 434阅读时长: 2 min
2017/10/13 Share

Origin fork: git exploding repo Tree, blob 可参考 git clone https://github.com/Katee/git-bomb.git 值得一试上面的命令。(最好不要用自己的工作物理机) 如果你没有足够大的 RAM 和 storage, 那么通常来说你的 git 会被kill, 然后就是爆内存到逼你重启。

The secret is that git de-duplicates “blobs” (which are used to store files) to make repositories smaller and allow using the same blob when a file remains unchanged between commits.

blobs 指的是 类似 文件内容或inodes, tree 指的是 类似目录一样的东西 文章开头的那个项目 git-bomb 妄想造 a billion files, 然而它实际上只有10 tree 和 10个指向文件blob指针。 实际上这种攻击类似于 笑傲江湖 (XML bomb) , 因此叫 git bomb。

Structure

Bottom

blobs 最底下的有个blob文件有一个laugh。

$ git show 5faa3895522087022ba6fc9e64b02653bd7c4283
one laugh

而有一个树对象指向这个blob对象10次

$ git ls-tree 6961ae061a9b89b91162c00d55425b39a19c9f90
100644 blob 5faa3895522087022ba6fc9e64b02653bd7c4283    f0
100644 blob 5faa3895522087022ba6fc9e64b02653bd7c4283    f1
# … snipped
100644 blob 5faa3895522087022ba6fc9e64b02653bd7c4283    f9

Middle

然后 9 层树对象 指向 它们身后的这个树对象 (这是顶部树对象):

$ git ls-tree 106d3b1c00034193bbe91194eb8a90fc45006377
040000 tree 8d106ebc17b2de80acefd454825d394b9bc47fe6    d0
040000 tree 8d106ebc17b2de80acefd454825d394b9bc47fe6    d1
# … snipped
040000 tree 8d106ebc17b2de80acefd454825d394b9bc47fe6    d9

Top

master ref 指向最高树对象。

$ git log --pretty=format:"%s | tree: %T"
Create a git bomb | tree: 106d3b1c00034193bbe91194eb8a90fc45006377

可以用多种能跑tree的方法 (git status, git checkout) 来测试这个repo, 都会因git在写文件进磁盘前在内存中建树而使内存 奔溃。 这也意味着你的进程会被killed 而不是填充满你的磁盘。

Other Git Bombs

Here is a slightly different version of the same idea. This repo has 15,000 nested tree objects. On my laptop this ends up blowing up the stack and causing a segfault. $ git clone https://github.com/Katee/git-bomb-segfault.git If you’d like to make your own git bombs read the next post Making Your Own Git Bombs.

CATALOG
  1. 1. Structure
    1. 1.0.1. Bottom
    2. 1.0.2. Middle
    3. 1.0.3. Top
  2. 1.1. Other Git Bombs