INCIDENT REPLAY · 2017-03-08
AT&T Mobility VoLTE 911 outage (trusted-IP whitelist push)
For about five hours AT&T VoLTE customers nationwide could not reach 911; roughly 12,600 unique callers failed. AT&T pushed an updated list of trusted IP addresses that omitted Comtech's addresses, cutting AT&T off from the systems that return 911 call-routing information. Rolling back took three minutes once the IP team was involved, but it took almost five hours to involve them.
A reconstruction, not the operator's network. Hammerhead's authors rebuilt the change from the public record as a small network of their own. No configuration here is the operator's. What follows is what the tool reported on that reconstruction; it is not a claim that the tool would have prevented the outage.
What happened
Who: AT&T Mobility; 911 routing subcontractors Comtech and West
The summary at the top is paraphrased from the sources below. Hammerhead's catalog rates its confidence in this account high.
Sources
- https://docs.fcc.gov/public/attachments/DOC-344049A1.pdf
- https://docs.fcc.gov/public/attachments/DOC-344941A1.pdf
- https://www.fcc.gov/document/final-report-march-8-2017-att-mobility-volte-911-outage
- https://www.fierce-network.com/wireless/at-t-s-911-outage-result-mistakes-made-by-at-t-fcc-s-pai-says
- https://www.theregister.com/2017/05/18/whitelist_caused_att_911_outage/
What the public record says
- For about five hours AT&T VoLTE customers nationwide could not reach 911; roughly 12,600 unique callers failed. AT&T pushed an updated list of trusted IP addresses that omitted Comtech's addresses, cutting AT&T off from the systems that return 911 call-routing information. Rolling back took three minutes once the IP team was involved, but it took almost five hours to involve them.
- Who: AT&T Mobility; 911 routing subcontractors Comtech and West
What the reconstruction assumed
Decided by Hammerhead's authors to build a network that runs. None of it describes the operator's network.
Everything below is ours.
- The family template (
tools/replays/gen_family_policy.py): PARTNER-1 (the 911 routing partner) reaches E911-GW-1 (the 911 gateway) through MSC-FW-1 (the firewall in front of the 911 call routing), which filters inbound on its outside interface. The intent file names the flow:911 signalling from the partneron udp/5060. - The record says a trusted-IP allow list was pushed without a partner that the 911 service depended on. The allow list is modelled as the permit entries of the firewall's inbound ACL, and the push drops the partner's entry; the intended change adds a third partner instead.
- Cisco IOS syntax and stand-in address space throughout. A reconstruction, not any operator's configuration.
What Hammerhead said
Each run below is pinned by Hammerhead's replay tests at commit 0ee9732: the verdict and the quoted text are checked against the tool's output, and a run that disagrees fails the test. Reason lines are copied verbatim; a pinned line can be part of a longer reason. Every preflight run uses --max-blast-radius 100, so a change is never counted as caught merely because it touched many devices of a small network.
the change as intended
now: passOn the reconstruction, hammerhead preflight on a before and an after snapshot with --policy @att_volte_911_2017/policy.yaml --allow-flow-changes returned pass.
First run, before the fixes this batch prompted
first: fail- policy gate: high/critical failure(s) on the 'after' network: 911 signalling from the partner
Pinned in tests/gauntlet/replays-policy.yaml.
the change as pushed
now: failOn the reconstruction, hammerhead preflight on a before and an after snapshot with --policy @att_volte_911_2017/policy.yaml --allow-flow-changes returned fail, for the reasons below.
Reason text pinned (some reason contains each line)
- policy gate: high/critical failure(s) on the 'after' network: 911 signalling from the partner
- NOT reachable (expected reachable)
First run, before the fixes this batch prompted
first: fail- policy gate: high/critical failure(s) on the 'after' network: 911 signalling from the partner
Pinned in tests/gauntlet/replays-policy.yaml.
What changed in Hammerhead because of it
From the “What was fixed” table in Hammerhead's replay notes, where each fix landed after a failing test. “Found by” is copied as written; a family name means the batch this incident belongs to.
A flow rule names its protocol and port
Every reachability rule probed TCP/80, so an intent about SIP could not tell the push from the intended change: 7 of 11 intended changes failed on main and the one that dropped only the named port passed. protocol: and dst_port: on the rule; the policy gate's reason now carries the violation, not only the policy's name.
Found by: Required-flow family
Limits
- The configurations are a reconstruction. Where the record is silent, the assumptions above fill the gap; if one is wrong, the replay is wrong in that respect.
- A verdict describes the reconstructed network's converged state. Timing, traffic load, and anything a device does that no configuration states, such as software reacting to a health check or a firmware bug, are outside it.
- A pass is reported as a pass. A fail says a gate fired on the reconstruction, nothing more.
- Why the catalog counts this outage as partly in scope: An allowlist change that removes a partner the service depends on is a 'must-stay-reachable' intent violation, but only if the whitelist is enforced on a parsed router/firewall rather than inside an IMS/SBC provisioning system.
Green links. Broken checkout.
Chicago payments network. Four routed metro nodes form a ring; the service gateway has a separate handoff. Route checks and ICMP succeed. The primary service transport fails even though an allow rule appears in the service access list. Investigate the two service networks from R2: 10.201.130.0/24 to 10.201.136.0/24 (TCP/443), and 10.201.131.0/24 to 10.201.137.0/24 (TCP/8443).
Link addressing (5)
- R1 R2
10.201.144.0/30 - R2 R3
10.201.145.0/30 - R3 R4
10.201.146.0/30 - R4 R1
10.201.147.0/30 - R4 R5
10.201.148.0/30
Free to practice. No account required.
Imported from docs/replays/att-volte-911-2017/FACTS.md and the replay manifests in the Hammerhead repository at commit 0ee9732.