Empirical Study

A Benchmark of .git/ Pillagers

Seven open-source tools, five web-server scenarios, deterministic test repository.

Wang Yihang ·  updated Jul 12, 2026  ·  commitd3b18c2 ·  seed 0

§1.Setup

A ground-truth Git repository (random seed 0) is served over HTTP under five configurations: Apache and Nginx with directory listing on / off, plus a PHP-LFI entry point. Each tool runs in its own Docker container against the same target, with a 300-second timeout. Full methodology: see /methodology.

§2.Feature Support

Table 1a.✓ = supported by the tool in at least one scenario, ✗ = absent. Tools sorted by total feature count. directory listing enabled.

ToolVersionSource codeReflogsStashesCommitsBranchesRemotesTagsTotal
GitHacker1.1.10+local7/7
git-dumper1.0.96/7
git-hacker (rbozburun)56285f66/7
dumpall0.3.22/7
GitHacka3d70b12/7
GitTools7cac63a4/7
dvcs-ripper2c1bbc61/7

Table 1b.✓ = supported by the tool in at least one scenario, ✗ = absent. Tools sorted by total feature count. directory listing disabled.

ToolVersionSource codeReflogsStashesCommitsBranchesRemotesTagsTotal
GitHacker1.1.10+local7/7
git-dumper1.0.95/7
git-hacker (rbozburun)56285f65/7
dumpall0.3.22/7
GitHacka3d70b12/7
GitTools7cac63a4/7
dvcs-ripper2c1bbc61/7

§3.Completeness

Mean recovery ratio (% of ground-truth files reconstructed correctly), averaged across all five scenarios. Higher is better. Best in bold.

Table 2.Aggregate per-tool metrics, averaged across five scenarios. Best value in each column is bold.

ToolRecovery (%)Duration (s)HTTP requests
GitHacker99.24.53127
git-dumper53.21.25178
git-hacker (rbozburun)53.21.27195
dumpall32.01.65889
GitHack32.01.63862
GitTools0.20.43147
dvcs-ripper0.00.23151
0 25 50 75 100 GitHacker 99.2 (99–99) git-dumper 53.2 (0–67) git-hacker (rbozburun) 53.2 (0–67) dumpall 32.0 (32–32) GitHack 32.0 (32–32) GitTools 0.2 (0–0) dvcs-ripper 0.0 (0–0)
Figure 2.Mean recovery per tool with per-scenario min–max whiskers. Tight whiskers around a high mean indicate consistent behavior across deployments.

§4.Per-Scenario Breakdown

Recovery rate (%) for every (tool, scenario) cell. Empty cells (—) mean the tool did not complete the run.

Table 3.Per-scenario recovery rate. Rows in descending mean order, GitHacker highlighted.

ToolApache (index on)Apache (index off)Nginx (index on)Nginx (index off)PHP-LFIMean
GitHacker99.299.199.299.199.199.2
git-dumper67.265.867.265.80.053.2
git-hacker (rbozburun)67.265.767.265.70.053.2
dumpall32.032.032.032.032.032.0
GitHack32.032.032.032.032.032.0
GitTools0.20.20.20.20.20.2
dvcs-ripper0.00.00.00.00.00.0
Apache (index on) Apache (index off) Nginx (index on) Nginx (index off) PHP-LFI GitHacker 99 99 99 99 99 git-dumper 67 66 67 66 0 git-hacker (rbozburun) 67 66 67 66 0 dumpall 32 32 32 32 32 GitHack 32 32 32 32 32 GitTools 0 0 0 0 0 dvcs-ripper 0 0 0 0 0
Figure 3.Monochrome heatmap of the same data as Table 3. Cell darkness encodes recovery rate. Mono ramp chosen so the figure prints to grayscale without losing comparison.

§5.Cost vs. Completeness

Recovery rate plotted against HTTP requests issued (log scale). One point per (tool, scenario). The Pareto frontier reveals which tools recover the most while issuing the fewest requests.

0 25 50 75 100 recovery (%) HTTP requests (log) GitHacker other tools
Figure 4.HTTP requests vs. recovery rate, one point per (tool, scenario). Lower-left dots cost less for less return; upper-left is the Pareto sweet spot.

§6.Discussion

The largest spread is on directory-listing-disabled scenarios where some tools refuse to brute-force tag and branch names — a defensible default but one that costs 30+ percentage points in completeness. The cost-completeness scatter (FIG. 4) shows that high request counts do not buy recovery: the most aggressive tool issues 10× the requests of GitHacker on the same scenario without improving the ratio.