"You don't harden the injection surface. You make sure it was never built."
The Admin Panel That Shells Out
Picture the most natural way to build 'restart a service' into a web hub: take the service name from the UI, drop it into a command string, and run it. It works on the first try, and it's a breach waiting to happen. The moment a name can carry a semicolon, the button that restarts a service can also delete a home directory. This is command injection, and it's not a rare exotic bug — it's the default outcome of letting a user-provided string become part of an executed command.
Remove the Surface, Don't Guard It
The usual response is to sanitize: escape the string, validate it, allowlist characters. Firelink takes the stronger path — it removes the surface entirely. User-provided strings never become executable flags, labels, paths, or shell fragments. Every operation is a typed capability resolved through a registry and a fixed adapter. To restart a service you don't pass a name; you resolve a typed restart-service capability whose service id is a registered value, and the adapter runs a fixed command with no user string anywhere in it. There is nowhere for an injection to live, because nothing the user typed reaches the execution path.
Injection-Proof by Construction
This is the difference between defense and design. Sanitizing is defense: you're guarding a dangerous surface and hoping you caught every escape. Typed capabilities are design: the dangerous surface was never built. A registered id either resolves to a known adapter or it doesn't — there is no clever string that turns 'restart' into 'delete,' because the operation is chosen from a closed, typed set, not assembled from text. The security property isn't a filter you have to keep perfect; it's a shape that has no hole to begin with.