{"id":"IL-0405","org":"PortSwigger","date":"2026-01-11","docs":["https://github.com/kubernetes-sigs/aws-load-balancer-controller/pull/4359"],"title":{"en":"An expired AWS Load Balancer Controller webhook certificate left no healthy targets and took BSEE SaaS down","ko":"AWS Load Balancer Controller 의 webhook 인증서가 만료돼 US·Canada 지역의 BSEE SaaS 인스턴스가 전부 멈췄다"},"domain":["kubernetes","aws","networking"],"impact":{"scope":"All BSEE SaaS instances in the US and Canada regions: customers could not access the Web UI or start scans","users":"US and Canada region customers; 2 support cases raised","region":"US and Canada regions"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":null,"related":[],"sources":[{"url":"https://github.com/portswigger-cloud/postmortems/blob/main/2026/01/load-balancer-webhook-certificate-expiry.md","kind":"github","archived":null}],"summary":{"en":"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.\n\nThe 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.","ko":"PortSwigger 는 2025년 11월 28일 AWS Load Balancer Controller 를 v1.14.1 에서 v1.16.0 으로 올렸다. v1.15.0 에서 Helm 차트가 인증서를 관리하는 방식이 바뀌었고, 그 결과 webhook 용 TLS Secret 이 소유자 없이 남았다. 이 Secret 을 소유하던 Certificate 객체가 더는 없었으므로 cert-manager 는 인증서를 갱신하지 못했다.\n\nSecret 안의 인증서는 2026년 1월 8일에 만료됐다. webhook 인증서는 로드 밸런서의 대상 그룹을 설정하는 데 필요하다. 인증서가 만료되자 webhook 검증이 실패해 컨트롤러가 AWS Target Group 설정을 갱신하지 못했고, 결국 healthy 상태인 대상이 하나도 남지 않았다. 1월 11일 10:00 UTC 부터 US 와 Canada 지역의 BSEE SaaS 인스턴스가 전부 쓸 수 없게 됐고, 고객은 Web UI 에 들어가거나 스캔을 시작하지 못했다.\n\n1월 12일 09:52 UTC 에 고객이 지원 창구로 문제를 알렸고, Platform Team 이 10:00 UTC 에 조사를 시작했다. 팀은 US 와 Canada 클러스터에서 소유자가 사라진 aws-load-balancer-tls Secret 을 지우고 Helm 으로 컨트롤러 설정을 다시 배포했다. 새 인증서가 만들어지고 webhook 이 동작하자 10:40 UTC 에 서비스가 돌아왔다. 장애는 약 24시간 40분 이어졌고 고객 데이터 손실은 없었다."},"trigger":{"en":"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.","ko":"PortSwigger 는 2025년 11월 28일 AWS Load Balancer Controller 를 v1.14.1 에서 v1.16.0 으로 올렸다. v1.15.0 의 Helm 차트가 인증서를 관리하는 방식을 바꿨고, 이 업그레이드 뒤에 소유자가 사라진 webhook 용 TLS Secret 이 남았다."},"severity":"unknown","symptoms":["service-unavailable","tls-certificate-errors"],"timeline":{"detected_after":"23h 52m","resolved_after":"24h 40m"},"date_kind":"incident","detection":{"en":"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.","ko":"엔지니어는 고객이 지원 창구로 신고한 뒤에야 장애를 알았다. 신고는 2026년 1월 12일 09:52 UTC 에 들어왔고, 영향이 시작되고 23시간 52분이 지난 때였다."},"components":["ingress","admission-webhook","cert-manager","helm","configmap","cloud-load-balancer"],"root_cause":"upgrade-breaking-change","remediation":[{"text":{"en":"Deleted the orphaned aws-load-balancer-tls secrets in the US and Canada clusters","ko":"US 와 Canada 클러스터에서 소유자가 사라진 aws-load-balancer-tls Secret 을 지웠다."}},{"text":{"en":"Redeployed the AWS Load Balancer Controller configuration with Helm","ko":"Helm 으로 AWS Load Balancer Controller 설정을 다시 배포했다."}},{"text":{"en":"Verified that new certificates were generated and the webhooks worked again","ko":"인증서가 새로 만들어졌는지, webhook 이 제대로 동작하는지 확인했다."}}],"action_items":[{"text":{"en":"Audit all clusters for orphaned secrets that have no owning Certificate resource and resolve them","ko":"모든 클러스터에서 소유자인 Certificate 리소스가 사라진 Secret 을 찾아 정리한다."}},{"text":{"en":"Add high-level application access alerting for each SaaS cluster from an external probe","ko":"SaaS 클러스터마다 외부 프로브가 애플리케이션에 접속할 수 있는지 확인하고, 접속하지 못하면 알림을 보내게 한다."}}],"contributing":["delayed-effect-change","monitoring-blind-spot"],"recurrence_of":null,"symptoms_text":{"en":"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.\n\nBehind 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.","ko":"US 와 Canada 지역 고객이 BSEE SaaS 인스턴스의 Web UI 에 들어가지 못했고 스캔도 시작하지 못했다. 엔지니어는 고객이 지원 창구로 알려 온 뒤에야 장애를 알았다.\n\n영향은 2026년 1월 11일 10:00 UTC 에 webhook 실패가 서비스 가용성을 떨어뜨리면서 시작됐다. 고객 신고는 하루 가까이 지난 1월 12일 09:52 UTC 에 들어왔고, 지원 문의는 모두 두 건이었다.\n\nPlatform Team 은 영향을 받은 클러스터들에서 AWS Load Balancer Controller webhook 인증서가 만료된 것을 찾았다. 인증서는 1월 8일에 이미 만료돼 있었다. webhook 검증이 실패해 컨트롤러가 AWS Target Group 설정을 갱신하지 못했고, 결국 healthy 상태인 대상이 하나도 남지 않았다."},"updated_at":"2026-11-14T12:34:05.604426Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0405","org_slug":"portswigger"}