[Security Review] Daily Security Review — AWF Firewall (2026-06-29) #5677
Replies: 3 comments
-
|
🔮 The ancient spirits stir; the smoke test agent was here. Warning Firewall blocked 1 domainThe following domain was blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "registry.npmjs.org"See Network Configuration for more information.
|
Beta Was this translation helpful? Give feedback.
-
|
🔮 The ancient spirits stir around this discussion. The smoke test agent was here, and the omens are green. Warning Firewall blocked 1 domainThe following domain was blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "registry.npmjs.org"See Network Configuration for more information.
|
Beta Was this translation helpful? Give feedback.
-
|
🔮 The ancient spirits stir, and the smoke test agent has passed through these halls. The firewall oracle has observed the run and left this rune behind. Warning Firewall blocked 1 domainThe following domain was blocked by the firewall during workflow execution:
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
Overall Security Posture: STRONG — AWF implements multiple independent layers of egress control and credential isolation. The architecture demonstrates mature security engineering: iptables DNAT as a backstop for proxy-unaware tools, per-session CA certificates for optional SSL inspection, capability isolation via
capsh, and 14+ credential files hidden via/dev/nulloverlays.Metrics:
🔍 Findings from Firewall Escape Test
The pre-fetched escape test file contains CI logs from the Secret Digger (Copilot) workflow (April 11, 2026, run
24273493151). Result: no secrets found.Key indicators:
GH_AW_SECRET_VERIFICATION_RESULT: successnoopsafe-output calls emitted — no secrets to reportGH_AW_INFERENCE_ACCESS_ERROR: falseThis validates that credential isolation (API key env exclusion +
/dev/nulloverlays) is functioning correctly under active adversarial probing.🛡️ Architecture Security Analysis
Network Security
The firewall enforces a 5-layer stack (evidence:
containers/agent/setup-iptables.sh,src/host-iptables-rules.ts):setup-iptables.sh:configure_nat_bypasses()setup-iptables.sh:configure_http_dnat()setup-iptables.sh:configure_host_access_rules()[FW_BLOCKED_UDP]/[FW_BLOCKED_OTHER]src/host-iptables-rules.ts:addBlockRules()src/squid/config-generator.tsStrengths confirmed by evidence:
sysctl net.ipv6.conf.all.disable_ipv6=1— prevents proxy bypass via IPv6169.254.0.0/16blocked at host iptables — cloud metadata (IMDS) access preventedacl dst_ipv4 dstdom_regex ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$+http_access deny dst_ipv4Container Security
Evidence:
src/services/agent-service.ts:76-94,containers/agent/entrypoint.sh:1142awf-iptables-init(shares network namespace)defaultAction: SCMP_ACT_ERRNO— syscall allowlistdocker-compose.ymlplaintext secrets/proc/[pid]/environcredential exfiltrationapi-proxy,cli-proxy,doh-proxy):cap_drop: ['ALL']Domain/Input Validation
Evidence:
src/domain-validation.ts,src/squid/domain-acl.ts,src/domain-patterns.tsSQUID_DANGEROUS_CHARS = /[\s\0"';#]/` — rejects whitespace, null bytes, quotes, semicolons, backticks, hash*converts to[a-zA-Z0-9.-]*(character class, not.*)*,*.*, and wildcard-only patterns blocked at validationexecaused throughout (array args, no shell string interpolation) — no shell injection riskCredential Isolation
Evidence:
src/services/agent-environment/excluded-vars.ts,src/services/agent-volumes/credential-hiding.tsWhen
--enable-api-proxy:OPENAI_API_KEY,ANTHROPIC_API_KEY,GEMINI_API_KEY,COPILOT_GITHUB_TOKENexcluded from agent env.Always excluded:
ACTIONS_RUNTIME_TOKEN,ACTIONS_RESULTS_URL.14 credential files hidden via
/dev/nulloverlays:.ssh/id_*,.aws/credentials,.kube/config,.azure/credentials,.config/gcloud/credentials.db,.docker/config.json,.npmrc,.cargo/credentials,.config/gh/hosts.yml.🎯 Attack Surface Map
--allow-domainsinput172.30.0.30:10001/var/run/docker.sock--enable-dind/tmp/awf-(ts)/✅ Recommendations
🔴 Critical — None
🟠 High — None
🟡 Medium
M-1: Harden JSONL audit log against injection (
src/squid/config-generator.ts:97)The JSONL audit log embeds
%{Host}>hand%ruwithout JSON escaping. Squid's logformat cannot escape strings natively. Mitigations:src/logs/log-aggregator.tsloadAllLogs()to skip/flag malformed recordsLOGGING.mdM-2: Expand credential file hiding (
src/services/agent-volumes/credential-hiding.ts)Add
/dev/nulloverlays for files not currently covered:~/.pypirc— PyPI upload tokens~/.netrc— Generic HTTP credential store (git clone https://)~/.gitcredentials— git credential helper store~/.gradle/gradle.properties— Gradle signing keys / API keys🔵 Low
L-1: Document GITHUB_TOKEN pass-through (
src/services/agent-environment/excluded-vars.ts:38)GITHUB_TOKENflows to the agent only whendifcProxyHostis not configured. Add explicit documentation noting this behavior and provide a--exclude-env GITHUB_TOKENexample for high-sensitivity deployments where agents should not have repository write access.L-2: Investigate scoped AppArmor profile (
src/services/agent-service.ts:92)apparmor:unconfinedis required to allowmount -t procduring entrypoint startup. Investigate whether a minimal AppArmor profile allowing only the targetmountoperation could replace this. If not feasible, document the accepted risk with a security comment referencing the capsh-drop mitigation.i️ Informational
--doh-resolverin high-sensitivity deployments to prevent DNS timing side-channels.[FW_BLOCKED_OTHER]kernel log prefix.📈 Security Metrics
Beta Was this translation helpful? Give feedback.
All reactions