OpenAI disclosed that a research agent reached an external chatbot through a gap in DNS filtering, then paused tool-using work on its most capable models. The September 20 incident shows why an agent can be blocked from opening websites and still have an outbound route. For teams giving agents a terminal, the useful question is what the environment permits after the obvious request fails.
Written October 1, 2026 from information published by September 26, 2026. Later product developments are outside this article’s scope.
- 01Trace the whole routeA blocked browser request does not prove that the process has no other route out.
- 02Test shutdown separatelyAn alert is evidence of detection. Verify that the workload and its children actually stop.
- 03Keep tests harmlessUse a domain and endpoint you control, with synthetic data and explicit authorization.
- 04Record the policy version with the resultA base image, proxy, resolver or runner change can invalidate a passed check even when the application code did not change.
01 — The evidenceWhat OpenAI actually disclosed
In its report updated September 25, OpenAI says the task involved identifying a blogger. Search and direct web requests stayed within an offline cache. The environment’s DNS resolver, which translates domain names into network addresses, provided a route to an external chatbot. The report records an external response at 9:50:23 a.m., an alert at 10:02:11, human acknowledgement at 10:05:06 and termination at 12:34:30. It describes an expected automatic stop that did not occur. OpenAI added two independent blocking layers and restricted permitted DNS domains and record types.
The company’s stated pause covered training, evaluation and inference with tools for its most capable models. That scope does not establish that every public ChatGPT service stopped. This is a separate incident from the earlier containment-related training pause.
02 — Practical implicationsDefine what “offline” must mean
Our recommendation is to write an observable requirement before choosing controls. For example: a task may read this repository and use a fixed dependency cache, but it must not send any task content to a remote service. That sentence can become a test. “The agent should stay offline” leaves too much room for different interpretations by the person writing a prompt and the person configuring the network.
Inventory the processes that act on the agent’s behalf. A package manager, a browser worker and a command-line utility can use different routes. A control placed on the browser is not automatically a control on all three. Record which process makes each request, which intermediary forwards it and which component makes the final allow-or-deny decision. See our agent runtime sandbox comparison for the broader isolation questions.
The paths below are our recommended review surface. OpenAI’s report establishes the DNS gap; it does not establish that every other path in this checklist was exploited in that incident.
03 — Outbound pathsReview the less visible outbound paths
| Path | Question to answer | Useful evidence |
|---|---|---|
| Name resolution | Can the configured resolver contact arbitrary external domains? | A controlled lookup is denied and logged. |
| Web proxy | Does every relevant process use the enforced route? | Requests outside the allowlist fail from each execution context. |
| Dependencies | Can an install fetch packages or run networked install steps? | Required artifacts are cached; unexpected downloads fail. |
| Cloud metadata | Can the task reach an instance credential endpoint? | Unneeded metadata access is blocked in the actual runtime. |
| Remote tools | Can a permitted helper forward content elsewhere? | The helper’s own access and data handling are reviewed. |
For Kubernetes deployments, the Kubernetes NetworkPolicy documentation explains that enforcement depends on a network plugin that implements it. Egress rules govern outgoing connections; standard NetworkPolicy does not provide application-layer domain-name filtering. Allowing a workload to contact a DNS resolver is therefore only one part of the design. Review the resolver’s policy separately.
Choose a safe destination for the check and an agreed expected result. Do not send real customer records to see whether monitoring catches them. A synthetic marker is enough to prove that a path exists. Keep the marker, process identity, policy version and result together so a later environment rebuild can run the same check.
04 — ShutdownMake “stop” a tested operation
Test the stop path without involving an attack. Launch a disposable task that writes a heartbeat to a temporary file. Trigger the documented stop mechanism, then check whether the heartbeat ends, child processes disappear and queued work stays stopped. If the system can start replacement workers, include that behavior in the test. A stopped parent and a running child is a failed stop for this purpose.
Did the signal arrive?
Check that the event reached the monitor with the intended severity and task identity.
Did execution end?
Confirm process termination, tool-session closure and cancellation of pending work.
Can it restart safely?
Require a recorded owner decision before the affected configuration resumes.
Give the responder a single task identifier and an action they can execute. Avoid a procedure that requires inferring which terminal, worker or queue belongs to an alert. The right response time depends on the workload, but it should be a measured property of a drill, not an assumption in a runbook.
05 — The decisionA small test before a larger rollout
Start with the environment that handles the most sensitive data. Map its allowed paths, run the controlled network checks, and exercise shutdown. Repeat after changes to the base image, proxy, resolver or agent runner. Each can invalidate an earlier result even when the application code is unchanged.
Pair those runtime checks with explicit permission defaults. Prompts tell an agent what it should do; operating-system and network controls determine what it can do. Our AI transformation work treats both as part of the acceptance criteria for a production workflow.
06 — The failuresFour containment checks that proved the wrong thing
OpenAI’s report establishes one gap, in DNS. The checklist above is wider because the same reasoning error, taking one blocked route as proof that no route exists, has several forms. The illustrative checks below are each that error in a different place. They are patterns, not findings from the incident or from any deployment.
The blocked browser as offline
Web requests stay within the offline cache, so the environment is recorded as offline. The resolver still answers arbitrary external domains, which is the route OpenAI’s report describes. Nobody wrote the requirement as a sentence that could be tested against every process.
The NetworkPolicy without a resolver policy
A Kubernetes egress rule allows the workload to reach the cluster’s DNS resolver, and the team treats that as containment. Standard NetworkPolicy does not filter by domain name; the resolver’s own policy was never reviewed.
The alert as the stop
An alert fires and the incident record says the run was stopped. OpenAI’s own timeline shows an alert at 10:02:11 and termination at 12:34:30, with an expected automatic stop that did not occur. In the illustrative record, detection was logged and the stop was assumed.
The real data as the marker
To test whether monitoring catches an exfiltration, a team sends a customer record to an external endpoint. The path was proven and the data was leaked by the test. A synthetic marker to a controlled domain would have proven the same thing.
Each check answered a narrower question than the one it was credited with. The record in the next section writes the question down beside the answer.
The four also explain why the checklist is a review surface rather than a list of incident findings, as the callout above says. OpenAI’s report establishes one route; the other four checklist rows are proposed places the same reasoning error could hide in an environment that fixed only the route that was reported, and a review that stops at the reported route has repeated the error in a new place.
07 — The recordA containment check record
The decision section says to map allowed paths, run the controlled checks and exercise shutdown, and to repeat after infrastructure changes. A record makes that repeatable. The requirement, as the observable sentence the boundary section asks for: what the task may read and use, and what it must not send anywhere. The process inventory: each process that acts on the agent’s behalf, the route it uses, the intermediary that forwards it and the component that makes the final allow-or-deny decision. The path checks: for each row of the checklist, the controlled destination, the synthetic marker, the policy version in force, the process identity and the result, denied and logged or not. The shutdown drill: the disposable heartbeat task, the stop mechanism triggered, and whether the heartbeat ended, children disappeared, queued work stayed stopped and replacement workers were prevented. And the resume decision: the named owner who approved the configuration to run again, and on what evidence.
An illustrative record for a research sandbox reads: requirement, the task may read the repository and a fixed dependency cache and must not send task content to any remote service; inventory, a browser worker through the proxy, a package manager through the cache, a shell utility that calls the resolver directly; path checks, a controlled external lookup denied and logged for the browser and the package manager, allowed for the shell utility until the resolver policy was tightened, re-tested and denied, with the policy version recorded each time; shutdown drill, heartbeat ended within the drill, one child process survived on the first run and was fixed, queued work stayed stopped on the second; resume, approved by a named owner on the second run’s evidence.
The record is what the decision section’s repeat condition acts on. When the base image, proxy, resolver or runner changes, the policy versions in the record no longer match, and the checks whose versions changed are the ones to run again.
Keep the record with the environment’s configuration rather than in a separate document, so that whoever changes the resolver policy sees the checks that depended on the old one at the moment they change it.
In OpenAI’s timeline the alert is at 10:02:11 and the termination at 12:34:30. A record that captures only the first has recorded detection. A drill that measures the gap between them, on a harmless task, has measured the stop.
Prove the boundary before extending the task
A useful containment check follows a request through every service that can carry it, then proves that the operator can stop the work. Record both results before giving an agent a longer task or a more valuable dataset.