branderson 783c508d97
tests / runner-env (pull_request_target) Successful in 1m40s
tests / tests (pull_request_target) Successful in 1m53s
Carry dejima's canonical statements: the disclaimer, and the push rule
Two things dejima states canonically and this repository did not carry.

The maturity disclaimer, in the same three places dejima pins it: README, SECURITY.md and the document that argues at length for security properties. Its own wording covers all three repositories by name - these projects, any of these repositories - so a reader landing here would not have seen it. Duplicated rather than linked, which is the opposite of what attribution and the security policy do, and deliberately: a disclaimer behind a link is a disclaimer the reader does not see, and its whole value is being on the page where the argument is being made.

test/disclaimer.bats pins it in all three. The line is the one most likely to be dropped without anyone deciding to drop it, by a rewrite of a section that happened to contain it, and every other test here would still pass on a repository that had lost it. It earned its place immediately: a git checkout during development reverted the README paragraph and the guard caught the commit that would have shipped without it.

The push rule goes in the credentials section, where it belongs: a session's forge is the one you chose, and everywhere else is where its dependencies live. Linked rather than restated, because the argument has a canonical home and a second copy of an argument is a second copy to keep right.
2026-08-10 20:28:44 -07:00

 

 dejima


 

Devbox Hardener

Bounds what a compromised development VM can reach on your network, and tells you what that bound actually is.

Early development. Not ready to be depended on. Nothing here has been through outside review, an external audit, or adversarial testing by anyone but the person who wrote it. Every security property this describes is a claim awaiting scrutiny, not one that has survived it. Do not put this anywhere that being wrong about it would matter.

One maintainer, no support. Nothing about this is promised: not a reply, not a fix, not a release. SECURITY.md has the detail, and is where to report a vulnerability rather than in a public issue.

What a devbox is, and why it is a different problem

A devbox is a long-lived VM that runs dejima sessions. It differs from a CI runner in one way that drives everything else: it holds uncommitted work, so it cannot be rolled back on a schedule.

That matters because rollback is the entire containment story of its sister project, dejima-ci-hardener. A runner is built to be lost. Anything that gets into one has until the next nightly rebuild, and nothing on it was worth keeping anyway. Take that away and what is left has to come from somewhere else: the hypervisor boundary, and knowing precisely what sits inside it.

What it does not claim

It does not prevent root on the devbox. Nothing here tries to.

What it does is make root on the devbox reach less, and make that reach something you can check rather than assume. The honest version of what each layer grants is docs/threat-model.md, including the blast radius by layer and the options that were rejected, with reasons.

Container escape is deliberately deprioritised, and the reasoning is written down rather than assumed: an escape would land in an account holding less than the session already had, so patching is the proportionate response.

Two halves

proxmox/README.md The node side: create the VM, apply the firewall. The primary control. Everything is done in the web console.
docs/building-a-devbox.md The guest side: install, bootstrap, verify. The same on any hypervisor.

Do the node side first, through the end of its §3.

The split is deliberate. Nothing guest-side knows it is on Proxmox, so another hypervisor can be added later without touching a single step on the other page.

Use

sudo ./bin/dejima-devbox-bootstrap    # once, in the guest

sudo dejima-devbox-audit              # both halves
sudo dejima-devbox-audit reach        # containment only, what the timer runs
sudo dejima-devbox-audit radius       # what root here would get

All of these need root. The config is 0640 root, and the radius report stats files in root's own home.

How it fails

The firewall is on the hypervisor, so the guest cannot verify it by reading it. That is what makes it worth having and what makes checking it awkward. The audit tests behaviour instead, by probing the default gateway: already in the routing table so it reveals nothing, guaranteed alive where an arbitrary address is not, and inside the ranges the firewall drops.

A timeout has two causes, and telling them apart is the whole design:

PASS Nothing answered and the network demonstrably works
FAIL Something answered. Rules missing, or an exception above them
INDETERMINATE Nothing answered, including things that should. Not a pass.

A check that reports success when it does not know is worse than no check, because it gets believed.

A rule that REJECTs rather than DROPs reports FAIL even though it is working. bash's /dev/tcp cannot tell a rejection from a live host refusing. That is the safe direction to be wrong in, and it is why the template specifies DROP.

Nothing is stored about what this VM must not reach. Such a list would be a map of valuable targets, kept on the machine this project assumes will be owned. The audit derives its targets from the routing table and its controls from your forge, so there is nothing to type and nothing to leak.

Tests

bats test/

test/devbox.bats asserts against a real devbox and skips everywhere else. It is gated on DEJIMA_DEVBOX=1 rather than on detecting a devbox, because a detector that guesses wrong skips silently, and a suite that passes by asserting nothing is worse than one that fails.

Further reading

docs/ Index of everything below
docs/threat-model.md What each layer grants, why escape is deprioritised, what was rejected
docs/reference.md The three verdicts, the three addressing modes, the one config key
SECURITY.md What this claims, and where to report a vulnerability
dejima-ci-hardener The sister project, for hosts that can be rolled back

License

GPL-3.0-or-later. See LICENSE.

The dejima wordmark and logo are not code and are not covered by that licence. They are trademarks; who holds them and what may be done with them is stated once for the organisation, at dejima's ATTRIBUTION.md.

S
Description
Hardens a development VM, bounds what it can reach on your network if compromised, and tells you what that bound actually is
Readme GPL-3.0
897 KiB
Languages
Shell 100%