Skip to content
In this article
View as Markdown

Failure Architecture: How Outages Propagate

Five incidents, five fail modes, the failure matrix and a blast-radius method

Last reviewed 13 October 2026 · 10 min read

The shape every outage takes

Large outages look different in the news and alike in the post-incident reports. Nearly all of them follow the same path:

  1. A trigger: a change, a race, a malformed file.
  2. A fault: one component misbehaves.
  3. Propagation through a shared dependency: DNS, identity, configuration, a control plane, time.
  4. Amplification: retries, thundering herds, caches expiring together, crash loops.
  5. The outage.
  6. Recovery, slowed by tooling that shares fate with what failed.

How a small fault becomes a large outage

  1. 1. Trigger

    A change, a race, a malformed file

  2. 2. Fault

    One component misbehaves

  3. 3. Shared plane

    DNS, identity, configuration, a control plane, time

  4. 4. Amplification

    Retries, herds, caches expiring together, crash loops

  5. 5. Outage

    Many services, many regions

  6. 6. Slow recovery

    The tools to fix it share its fate

Steps 3 and 4 are where design makes the difference. Three layers each retrying three times put up to 64 times the normal load on the bottom dependency at the moment it can least take it.

Two steps on that path are where design makes the biggest difference. Propagation is decided by what components share, which you can map in advance. Amplification is decided by retry and backoff behaviour, which you can set in advance. The rest of this page is about both.

Five incidents, read closely

These five were chosen because each provider published enough to see the mechanism. The dates and times are in each provider's own time zone.

AWS us-east-1, 19 and 20 October 2025

What happened. A latent race condition in DynamoDB's DNS automation, between the components AWS calls the Planner and the Enactor, left an empty DNS record for dynamodb.us-east-1.amazonaws.com. DynamoDB API errors ran from 11:48 PM to 2:40 AM PDT. Console sign-ins using an IAM user saw increased authentication failures from 11:51 PM to 1:25 AM. Dependent services failed, EC2 launches were impaired and throttled, and the event ended at 2:20 PM PDT on 20 October after three distinct periods of impact.

A detail worth getting right. Customers using DynamoDB global tables could still connect to their replica tables in other Regions; what they saw was prolonged replication lag. Earlier summaries said "IAM updates and global tables were affected", which is broader than the post-event summary supports.

What it teaches. The multi-region data plane worked. The regional control and identity paths didn't. Local credentials survived, which is the pattern called fail-static identity. Version-fence your DNS plan updates, and make sure recovery paths don't depend on the service that failed. AWS disabled the automation worldwide.

Google Cloud, 12 June 2025

What happened. A new quota-checking code path in Service Control, added on 29 May, lacked error handling and wasn't behind a feature flag. At about 10:45 AM PDT a policy with blank fields was inserted, and its metadata "replicated globally within seconds". The blank fields hit the unprotected code, causing a null pointer and a crash loop in every region, from 10:51 to 18:18 PDT. As tasks restarted in us-central1, they overloaded the Spanner database underneath without randomised backoff, and that region took up to about 2 hours 40 minutes to recover fully.

What it teaches. Google's report notes that Service Control is a regional service with a regional datastore, yet the policy data replicated globally. That mismatch has a name in this atlas: regional compute, global state. It made a regional service a global failure domain. Google's remediation was to modularise the checks so that the functionality is isolated and fails open, which is right for a quota check and would be wrong for an access check. The next section explains the difference.

Azure Front Door, 29 October 2025

What happened. An inadvertent tenant configuration change introduced an invalid or inconsistent state that caused a significant number of AFD nodes to fail to load properly, from 15:45 UTC to 00:05 UTC the next day. Microsoft 365 and the Azure portal were affected. The portal was failed away from AFD at 17:26, and configuration changes were blocked at 17:30 while a last-known-good configuration was rolled out.

The deeper mechanism. Microsoft's later engineering post explained that a different sequence of configuration changes across two control-plane versions produced incompatible metadata, and that the bad configuration passed the protection system before a delayed asynchronous processing task crashed on it. A separate AFD incident on 9 October involved the protection system being bypassed during a manual clean-up.

What it teaches. Control-plane version skew can make configuration incompatible, so configuration needs a schema version and a skew policy between producers and consumers, as Kubernetes has for its components. Validation has to exercise the real consumer, including its asynchronous stages. And management tooling must not depend on the edge it manages.

Cloudflare, 18 November 2025

What happened. A change to permissions in a ClickHouse database caused a query to return duplicate rows. The Bot Management feature file generated from that query doubled in size, past a hard limit that Cloudflare's postmortem describes as set to 200, well above its normal use of about 60 features. The proxy panicked. Failures began at 11:20 UTC. Because the file was regenerated every few minutes, the network flapped between working and failing. Core traffic was largely flowing normally by 14:30, and all systems were normal by 17:06. An unrelated failure of Cloudflare's off-platform status page at the same time suggested to responders that they were under attack.

What it teaches. Generated configuration is configuration whose producer is a query, so a permission change upstream of it is a configuration change. Validate generated configuration for size and cardinality, not just schema. And a non-critical module must not be able to crash the critical path.

CrowdStrike Channel File 291, 19 July 2024

What happened. A new IPC Template Type defined 21 input parameter fields, but the integration code supplied only 20[1]. The Content Validator checked against 21. A content update with a non-wildcard criterion in the 21st field made the sensor read past the end of the input, an out-of-bounds memory read, crashing Windows hosts between 04:09 and 05:27 UTC. Microsoft estimated 8.5 million devices, under 1% of Windows machines; later reporting said more than 8 million. Each had to be recovered by hand.

What it teaches. Content needs staged rings with bake time, just as code does, and customers need control over when it rolls out. Add runtime bounds checks, and test with the non-wildcard values production will actually use.

What the five have in common

All five were data or configuration that propagated faster than code would have been allowed to. Three of them also impaired the tools people needed to see or recover. Two (Google and Azure Front Door) involved a mismatch between where a component ran and how far its data travelled.

The five ways a check can fail

Saying "authorization never fails open" sounds safe, and then you read Google's remediation, which made its checks fail open deliberately. Both are right, because they're talking about different kinds of check. Every check needs a declared failure mode, and there are five:

ModeUse it forWhat it requires
Fail-closed: deny when unsureAccess to protected data; granting privilegeA break-glass path
: use the last known good decision or data, up to a declared ageAuthorization within a staleness budget; configuration; DNS fallbackA declared maximum age
Fail-open: allow when unsureQuota, rate limits, budgets; advisory enrichmentAn alarm, a time limit and bounded exposure
Fail-degraded: serve a reduced functionAI generation falling back to search-only; read-only modeA defined experience and SLO
Fail-to-manual: a human decidesIrreversible side effects: payments, deletionsA staffed approval path

And checks fall into four classes:

  • Protective checks (authentication, and authorization over protected data or side effects) fail closed, or fail static within a declared revocation window.
  • Economic and availability checks (quota, rate limit, budget) may fail open, with alarms, because over-admission is bounded and reversible.
  • Enrichment checks (telemetry, advisory risk scoring) fail open.
  • Safety interlocks on irreversible actions fail to manual.

A fail-open path is itself security-relevant configuration. Version it, alarm on it, and put a time limit on it.

The failure matrix

FailureHow it spreadsHow you detect itHow you prevent or contain it
Identity-provider outageNew sign-ins and token refreshes failSynthetic sign-insDesign token lifetimes; break-glass outside Conditional Access
DNS failureEvery client; TTLs delay recoveryResolution SLIs from several vantage pointsFenced automation; static fallbacks
Certificate expiryEverything fails at the same momentExpiry inventory and alertsACME or managed certificates
Database failureConnection stormsLag and error ratesTested failover; idempotent clients
Storage corruptionReplicas copy itIntegrity checksVersioning, object lock, separate backups
Region or provider failureGlobal features homed in that regionExternal monitoringStatic stability; pre-provisioned capacity
Model API outageEvery AI featurePer-provider SLIsPolicy-equivalent fallback
GPU or quota exhaustionQueues grow; 429s cascadeQueue time, KV utilisation, headroomReservations, admission control, a smaller fallback model
Network partitionSplit brainPath monitoringQuorum with fencing
Corrupted dataPipelines, indexes and answersQuality checksData contracts, versioned tables, rewinding along lineage
RansomwareLateral movement through shared credentialsEDR, canariesA separate backup identity plane; immutability
Credential theftThe attacker acts as the identityAnomalous Graph usePhishing-resistant MFA; no long-lived keys
Prompt injection or a malicious toolTools act for the attackerTool-call anomaly auditAuthorization inside tools; approvals; signed, pinned MCP servers
Logging outageBlind operations; a compliance gapPipeline healthLocal buffering; an independent failure domain
Backup or restore failureSilent until you need itRestore drillsRebuild from IaC and restore data, tested together
Configuration driftInconsistent securityDrift detectionGitOps; block out-of-band changes
Clock skewTokens rejected, leases broken, logs misorderedAn NTP-offset SLIRedundant time sources; skew tolerance; monotonic clocks for timeouts
Signing-key rotationMass 401sJWKS fetch errorsOverlap windows; publish keys before use
Admission-webhook outageEvery write blockedAPI error rateScoped failure policies; a webhook path outside the cluster

Blast radius: a method

"What would this failure take with it?" is a question you can answer before the failure, if you map the dependencies.

  1. Draw the dependency graph with typed edges: depends on (at runtime), authenticates as, resolves via (DNS), keyed by (KMS or PKI), configured by, observed by, recovered by.
  2. For a failed node F, list its direct dependents, one edge away.
  3. Add its indirect dependents: the transitive closure along runtime edges.
  4. Add the shared-plane dependents: everything that shares F's control plane, configuration producer, identity issuer, DNS zone, telemetry pipeline or backup system.
  5. Subtract what is statically stable: dependents whose edge to F is only needed for change, each with a declared survival time, such as the remaining token lifetime.
  6. Flag recovery coupling: does restoring F need F, or anything in F's blast radius?

The blast radius is everything found in steps 2 to 4, less whatever step 5 removes. It changes with time, because cached tokens, DNS answers and certificates all expire.

DependencyDirect dependentsIndirect and sharedStatically stable forRecovery coupling
Identity providerSign-ins, token refresh, workload identity exchangesAll SaaS, CI/CD, agents, admin portalsThe remaining token life: about an hour by default, up to 28 hours with CAEBreak-glass must not need the identity provider or Conditional Access
DNSEvery call by namePrivate endpoints, the identity provider, certificate checks (OCSP, CRL)The cached TTLRecovery tools that resolve through the same zone
KMSDecryption on read; envelope keysDatabases, storage, secrets, backupsCached data keys, depending on the providerDeleting a key or locking its policy makes backups unreadable
PKITLS and mTLS handshakesService mesh, identity-provider signing, device authenticationUntil certificates expireThe offline procedures for the issuing CA
Network transitCross-network and on-premises flowsHybrid DNS, Active Directory, backupsNone: it's liveAn out-of-band management path
DatabaseApplication reads and writesCaches (stampedes), indexes (CDC stalls)Read cachesConnection storms on failover
Object storageArtefacts, the data lakeImage pulls, model weights, backupsLocal copiesRestores need storage in another domain
AI gatewayEvery AI featureAgents, metering, auditNone, unless clients bypass it, which they mustn'tA last-known-good gateway configuration
Model providerGenerationAgents, evaluationsOnly a policy-equivalent fallbackQuota in the fallback region
Kubernetes control planeScheduling, scaling, secret updatesOperators, admissionExisting pods keep runningWebhooks that fail closed block the fix
CI/CDDeploymentsIaC changes, policy rolloutRunning systemsThe pipeline identity is Tier-0; keep a manual emergency path
ObservabilityDetection, pagingAudit evidence, SLOsLocal buffersIndependent paging and status
BackupRestoreRansomware recovery, legal holdNot applicable: it's latentA separate identity, keys and control plane

The Tier-0 set

The Tier-0 set: components whose failure or compromise takes everything with it

Identity provider

And every identity that can grant permissions

DNS

Including the private zones behind private endpoints

KMS and PKI

Keys, signing certificates, issuing CAs

Edge and CDN

And the tooling that configures it

AI gateway

Every AI feature routes through it

CI/CD and IaC state

Can recreate or destroy everything

Backup control plane

The last line, so it needs its own identity

Time source

Leases, token expiry, certificates and logs all read it

These are roles, not products, so they are drawn without product icons. Map your own product against each one first: most of the propagation paths in the failure matrix run through at least one of them.

A component is one whose compromise or failure compromises or fails everything else. The revised set is: the identity provider and every permission-granting identity; DNS; KMS and PKI; the edge and CDN; the AI gateway; CI/CD and IaC state; the backup control plane; and the time source that leases, tokens, certificates and logs all read. The last one is the newest addition, and the one most estates have never mapped.

Map the Tier-0 set against the failure matrix first. Most propagation paths run through it.

Verified claims

The security and provider-specific statements on this page, each tied to the page that says it, the date it was last checked against that page, and the conditions it depends on. The method is set out in the verification standard.

  1. [1]CrowdStrike Channel File 291 defined 21 input fields while the integration code supplied 20, and reading the 21st caused an out-of-bounds read.

    Source
    CrowdStrike: Channel File 291 Incident: Root Cause Analysis
    Checked
    13 October 2026, evidence tier T1
    Holds when
    Falcon sensor for Windows, version 7.11 and above, on 19 July 2024.

Should you have any questions regarding this page, please contact us at solutions@alesanalytics.com.

Sources

Every link goes to the publisher: the provider's own documentation, the specification, or the official incident report. Where they change, they are the authority, not this page.

Next steps

Diagrams use the official Microsoft Azure, Microsoft Entra, AWS and Google Cloud architecture icons, as each vendor permits for documentation, and the Kubernetes icon set by the Kubernetes Authors under CC-BY-4.0. Product names are trademarks of their owners.