IL-0405 PortSwigger · 2026-01-11kubernetesawsnetworking
An expired AWS Load Balancer Controller webhook certificate left no healthy targets and took BSEE SaaS down
On 28 November 2025 PortSwigger upgraded the AWS Load Balancer Controller in its clusters from v1.14.1 to v1.16.0. A change to the controller's Helm chart in v1.15.0 (pull request 4359) changed how certificates are managed, and after the upgrade the old TLS secret was orphaned: it was owned by a cert-manager Certificate object that no longer existed, so cert-manager could not renew it.
The certificate in that secret expired on 8 January 2026. Webhook validation then failed and the controller stopped working. The webhook certificate is needed for load balancer target group configuration, so the controller could not update the AWS Target Groups, which eventually had no healthy targets, and from 10:00 UTC on 11 January all BSEE SaaS instances in the US and Canada regions were down. Customers reported it at 09:52 UTC on 12 January and the platform team began investigating at 10:00. The team deleted the orphaned aws-load-balancer-tls secrets in the US and Canada clusters, redeployed the controller configuration with Helm and checked that new certificates were generated and the webhooks worked. Services were restored at 10:40 UTC, about 24 hours 40 minutes after impact began. Two support cases were raised and no customer data was lost.
- Severity
- –
- Scope
- All BSEE SaaS instances in the US and Canada regions: customers could not access the Web UI or start scans
- Users affected
- US and Canada region customers; 2 support cases raised
- Region
- US and Canada regions
- Time to detect
- 23h 52m
- Time to resolve
- 24h 40m
Symptoms
From 10:00 UTC on 11 January 2026 every BSEE SaaS instance in PortSwigger's US and Canada regions was unavailable: customers could not open the Web UI or start scans. The platform team learned of it only when customers reported it through support at 09:52 UTC the next day.
Behind the outage, webhook validation for the AWS Load Balancer Controller failed because the webhook's TLS certificate had expired on 8 January 2026, three days before services stopped. Without a working webhook the controller could not update the AWS Target Group configurations, and the target groups eventually had zero healthy targets. When the platform team investigated, it found expired webhook certificates across all the affected clusters.
Root cause
Root cause Breaking change in an upgrade
- Trigger
- The upgrade of the AWS Load Balancer Controller from v1.14.1 to v1.16.0 on 28 November 2025 left an orphaned webhook TLS secret that cert-manager could not renew, and the certificate in it expired on 8 January 2026.
Detection
Customers reported the outage through support at 09:52 UTC on 12 January 2026, almost 24 hours after impact began, and the platform team began investigating at 10:00 UTC.
Remediation
- Deleted the orphaned aws-load-balancer-tls secrets in the US and Canada clusters
- Redeployed the AWS Load Balancer Controller configuration with Helm
- Verified that new certificates were generated and the webhooks worked again
Action items
- Audit all clusters for orphaned secrets that have no owning Certificate resource and resolve them
- Add high-level application access alerting for each SaaS cluster from an external probe
Lessons
–
Sources
References
Related cases
IL-0522An ingress-nginx chart upgrade deleted the jenkins.io Ingress and Fastly served HTTP/503 errors for hoursJenkins project · 2021same root cause · shared Admission webhook, Ingress controller, Helm
IL-0098After 2i2c moved from ingress-nginx to nginx-ingress, a hub's Ingress took priority over cert-manager's temporary Ingress for the same host, so new hubs could not get TLS certificates2i2c · 2026same root cause · shared Ingress controller, cert-manager
IL-0203A routine Kubernetes cluster system update made the AWS Load Balancer Controller fail, so new pods were never registered with the ALB and Honeycomb's EU1 ingest and UI went down once the last old pods were replacedHoneycomb · 2024same root cause · shared Cloud load balancer, Ingress controller
IL-0090After an upgrade of the ModSec ingress controller module, its validating webhook served a certificate for the wrong service name and blocked every Ingress create and changeUK Ministry of Justice · 2021same root cause · shared Admission webhook, Ingress controller
IL-0092Upgrading ingress-nginx from 1.12.0 to 1.14.3 brought a newer ModSecurity and OWASP Core Rule Set whose false positives blocked HMPPS Auth, so users could not sign in to their applicationsUK Ministry of Justice · 2026same root cause · shared Ingress controller
IL-0101After Google forced a GKE control plane upgrade to 1.33.2 at a deprecation deadline, no new node could initialise, so autoscaling and spot node replacement stopped for 15 hoursWealthy · 2025 · sev1same root cause · shared ConfigMaps and Secrets
IL-0079A GKE node auto-upgrade to an ubuntu_containerd image with a kernel regression left kube-proxy unable to apply its ip6tables rules, so load balancer health checks failed and several clusters lost all ingress trafficAltinity · 2025same root cause · shared Cloud load balancer
IL-0117A scheduled maintenance and an ingress upgrade on OpenAI's user-facing clusters caused a networking control plane regression that briefly broke the data plane, and the services that restarted then overwhelmed a backend persistence store with a heavy first-start queryOpenAI · 2024same root cause · shared Ingress controller
IL-0180A GKE control plane auto-upgrade from 1.22 to 1.23 removed the v1beta1 Ingress and ValidatingWebhookConfiguration APIs that Istio 1.7.4 still used, and Istio stopped working in productionSunwoo Park · 2023same root cause · shared Admission webhook
IL-0060Kubernetes 1.24 upgrade removed the master node label that Calico route reflectors selected on, dropping all pod routes and taking Reddit down for 314 minutesReddit · 2023same root cause · shared Admission webhook
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0405
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0405/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.