[Security Review] Daily Security Review – 2026-04-17 #2054
Replies: 2 comments
-
|
This discussion was automatically closed because it expired on 2026-04-24T13:08:31.441Z.
|
Beta Was this translation helpful? Give feedback.
-
|
🔮 The ancient spirits stir, and the smoke-test seer has passed this hall. Warning The following domain was blocked by the firewall during workflow execution:
To allow these domains, add them to the network:
allowed:
- defaults
- "registry.npmjs.org"See Network Configuration for more information.
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
📊 Executive Summary
This daily security review analyzed the gh-aw-firewall codebase against the complementary Secret Digger escape-test results from 2026-04-11. The overall security posture is strong, with multiple layered defenses (seccomp allowlist, capability dropping, iptables default-deny, domain validation, one-shot token isolation, tmpfs overlays). One medium-severity gap was identified (ICMP covert channel) and several lower-risk observations are noted below.
SCMP_ACT_ERRNOdefault, ~345 allowed syscalls)ALL(agent + API proxy + DoH proxy)/dev/null)🔍 Findings from Firewall Escape Test (Secret Digger, 2026-04-11)
The escape test log (
/tmp/gh-aw/escape-test-summary.txt) shows workflow-level telemetry for the Secret Digger (Copilot) run:GH_AW_SECRET_VERIFICATION_RESULT: successAgent succeeded with only noop outputs— no secrets were found or leakedGH_AW_INFERENCE_ACCESS_ERROR: false— inference access was properly controlledGH_AW_LOCKDOWN_CHECK_FAILED: false— lockdown mode respectedInterpretation: The secret-digger agent ran under AWF containment and was unable to exfiltrate any secrets. This provides positive evidence that credential isolation (one-shot tokens, env-unset, API proxy BYOK pattern) is functioning correctly.
🛡️ Architecture Security Analysis
Network Security Assessment
Evidence gathered:
# Container iptables final DROP rules (containers/agent/setup-iptables.sh:427-430) iptables -A OUTPUT -p tcp -m limit --limit 10/min --limit-burst 20 -j LOG ... iptables -A OUTPUT -p tcp -j DROP iptables -A OUTPUT -p udp -m limit --limit 10/min --limit-burst 20 -j LOG ... iptables -A OUTPUT -p udp -j DROPStrengths:
containers/agent/setup-iptables.sh:48-49)DOCKER-USERchain (src/host-iptables.ts:566) provides cross-container enforcementThe
setup-iptables.shOUTPUT chain drops TCP and UDP, but never adds a DROP or LOG rule for ICMP (protocol 1). Any traffic that isn't TCP or UDP exits without restriction. Tools likepingand ICMP-based tunneling utilities (e.g.,ptunnel,icmptunnel) could use this as an unmonitored data exfiltration channel. Bandwidth is limited but the channel is entirely invisible to Squid and the current audit logs.Recommendation: Add at the end of
setup-iptables.sh, after the UDP DROP:Container Security Assessment
Evidence gathered:
Strengths:
ptrace,process_vm_readv/writevblocked — prevents cross-process memory inspectionkexec_load,reboot,init_moduleblocked — prevents kernel-level attacksumount/umount2blocked — prevents unmounting security-relevant filesystem overlays (tmpfs hiding workDir)src/docker-manager.ts:1647-1648)no-new-privileges: trueon all containers prevents setuid/setgid escalation/dev/null(src/docker-manager.ts:1313-1315)usermod/groupmod(containers/agent/entrypoint.sh:15-33)src/docker-manager.ts:1484-1508)Observation — Docker socket exposure when
--enable-dindis used:When
--enable-dindis explicitly opted into, the Docker daemon socket is mounted into the agent, allowingdocker run --network hostwhich bypasses all AWF network controls. This is documented and requires explicit opt-in, but operators should be aware that--enable-dindeffectively negates network containment.Domain Validation Assessment
Evidence gathered:
Strengths:
SQUID_DANGEROUS_CHARSbefore config interpolation — prevents Squid config injection via newline/comment/semicolon characters*→[a-zA-Z0-9.-]*character class prevents catastrophic backtracking (ReDoS)assertSafeForSquidConfig()called at both parse time (parseDomainList) and config generation time (formatDomainForSquid)!CONNECTrulesInput Validation Assessment
Evidence gathered:
Strengths:
escapeShellArg()(src/cli.ts:1052)Observation —
--env-allpassthrough:ICMP gap evidence
Domain validation evidence
Docker socket protection
✅ Recommendations
🔴 Medium — ICMP Egress Not Blocked
File:
containers/agent/setup-iptables.sh(after line 430)The agent container's iptables OUTPUT chain drops TCP and UDP but has no rule for ICMP or other IP protocols. Add a catch-all DROP after the UDP rule:
This closes the ICMP covert channel and provides defense against any other protocol-based bypass.
🟡 Medium — Document
--enable-dindFirewall Bypass ClearlyFile:
README.md,docs/environment.mdThe warning at
src/docker-manager.ts:1303is logged at runtime but is not prominently documented in user-facing docs. Add a security callout warning operators that--enable-dindfully negates network containment and should only be used in already-trusted environments.🟡 Medium — Strengthen
--env-allGuardFile:
src/cli.ts(~line 2013)Consider scanning env vars passed via
--env-allfor known secret patterns (e.g.,_KEY,_SECRET,_TOKEN,_PASSWORD) and emitting a specific per-variable warning, or add a--env-all-allow-secretsflag to make the risk explicit at a per-variable level. Currently only a single generic warning is shown.🟢 Low — Add ICMP to iptables Audit Logging
Even before blocking ICMP, add a LOG+DROP for ICMP in the audit logging section to make ICMP attempts visible in
dmesg/kernel logs. This provides observability without changing the allow/deny posture.🟢 Low — Document Secret Digger Test Coverage
Add a reference in
docs/INTEGRATION-TESTS.mdlinking to the Secret Digger workflow results so operators can track credential isolation test outcomes longitudinally.📈 Security Metrics
Beta Was this translation helpful? Give feedback.
All reactions