fix(cred_proxy): close git-push bypass + route through pipelock (PRD 0010)
Three coupled fixes that close a documented bypass of git-gate's gitleaks pre-receive hook: 1. cred-proxy refuses git smart-HTTP push at runtime. Any path ending in /git-receive-pack or /info/refs?service=git-receive-pack returns 403 with a pointer at the bottle.git SSH path. Fetch (upload-pack) is still allowed — the bypass we're closing is push, where gitleaks is the load-bearing scanner. Hard guarantee. 2. The provisioner suppresses the cred-proxy `~/.gitconfig` insteadOf rewrite for any host already declared in bottle.git. git-gate is the canonical git path there; we don't write a competing rule that would let `git clone https://<host>/...` succeed in ways that confuse on push. Defense in depth — (1) is the hard guarantee. 3. cred-proxy routes its outbound HTTPS through pipelock. The sidecar's environ now sets HTTPS_PROXY=<pipelock-url>, and the image's entrypoint runs `update-ca-certificates` over the per-bottle pipelock CA (docker cp'd into /usr/local/share/ca-certificates/pipelock.crt before start) so the proxy's HTTPS client trusts pipelock's bumped certs. Consequence: pipelock's allowlist + body scanner now sit in the cred-proxy egress path the same way they sit in front of direct agent traffic. The cred-proxy upstream hosts (api.github.com, github.com, gitea hosts, registry.npmjs.org) come OFF pipelock's passthrough_domains. Only api.anthropic.com remains on passthrough (LLM body content legitimately trips DLP). PRD 0010 updated to reflect all three. Tests adjusted: the "cred-proxy hosts go on passthrough" assertion in test_pipelock_allowlist flips to "they don't", a new TestIsGitPushRequest exercises the smart-HTTP refusal predicate, and the gitconfig renderer tests cover the per-host suppression matrix.
This commit is contained in:
@@ -92,9 +92,13 @@ class TestTlsPassthrough(unittest.TestCase):
|
||||
passthrough = pipelock_effective_tls_passthrough(_bottle({}))
|
||||
self.assertEqual(["api.anthropic.com"], passthrough)
|
||||
|
||||
def test_token_hosts_added_to_passthrough(self):
|
||||
# cred-proxy validates upstream certs with the real CA bundle;
|
||||
# pipelock must not MITM these or the handshake fails.
|
||||
def test_token_hosts_NOT_added_to_passthrough(self):
|
||||
# cred-proxy now trusts pipelock's per-bottle CA (loaded into
|
||||
# its container's trust store via docker cp + update-ca-
|
||||
# certificates at start time), so pipelock can MITM the
|
||||
# cred-proxy -> upstream leg and body-scan it. Auto-adding
|
||||
# cred-proxy hosts to passthrough would silently disable that
|
||||
# second scanner for github / gitea / npm.
|
||||
passthrough = pipelock_effective_tls_passthrough(_bottle({
|
||||
"tokens": [
|
||||
{"Kind": "github", "TokenRef": "G"},
|
||||
@@ -103,10 +107,7 @@ class TestTlsPassthrough(unittest.TestCase):
|
||||
"Url": "https://gitea.dideric.is"},
|
||||
],
|
||||
}))
|
||||
for host in ("api.anthropic.com", "api.github.com", "github.com",
|
||||
"registry.npmjs.org", "gitea.dideric.is"):
|
||||
self.assertIn(host, passthrough)
|
||||
self.assertEqual(passthrough, sorted(passthrough), "sorted")
|
||||
self.assertEqual(["api.anthropic.com"], passthrough)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user