Incident Library

IL-0404 PortSwigger · 2024-10-24kubernetesaws

All BSEE SaaS customer pods on EKS crash-looped after Karpenter moved nodes to Bottlerocket v1.26.0, which broke Java

Bottlerocket PR-158, merged on 16 October 2024, added a default security setting that blocks writable and executable memory for all services, `MemoryDenyWriteExecute=yes`, and Bottlerocket v1.26.0, released on 24 October at 02:00, included it. The systemd documentation for this option says it is incompatible with programs that generate code at runtime, including JIT execution engines, so on v1.26.0 applications that rely on JIT compilation, such as Java, could not run. PortSwigger's Karpenter resources used the latest released Bottlerocket AMI, so once AWS published v1.26.0 in eu-west-1, Karpenter rolled the production EKS nodes onto it and every BSEE SaaS customer instance failed.

The team was told of the outage by other teams at 08:07 and 08:15, found the crash-looping pods and the JVM error, saw that the nodes had been updated at 05:33 to v1.26.0, and found the matching Bottlerocket issue. The team reverted all EC2 instances in the SaaS production account to Bottlerocket v1.25.0, deployed v1.25.0 across all EKS clusters and rolled out new nodes, and customer instances came back from 09:15. The incident lasted 3h 45m, affected all customers, raised one support case and lost no customer data.

Severity
–
Scope
Every BSEE SaaS customer instance was unavailable and showed the Environment Unavailable message; one support case was raised and no customer data was lost
Users affected
all BSEE SaaS customers
Region
eu-west-1
Time to detect
–
Time to resolve
3h 45m

Symptoms

On 24 October 2024 every BSEE SaaS customer instance showed the Environment Unavailable message, and the SaaS Uptime Over Time metric dropped sharply at 04:45. The Technology Team learned of the outage when the Growth team posted about it at 08:07 and a member of the Product team told the Technology Team verbally at 08:15.

All customer Kubernetes pods were in crash loop back off. The logs of the `init-enterprise-server-keystore` container, which runs `/usr/local/burpsuite_enterprise/bin/createKeystore`, showed `Error occurred during initialization of VM` followed by `Failed to mark memory page as executable - check if grsecurity/PaX is enabled`.

The error pointed the team at the operating system. The AWS EC2 console showed the EC2 nodes had been updated at 05:33 and the workloads had moved to the new nodes after that. The nodes ran Bottlerocket v1.26.0, and the Bottlerocket GitHub repository had Issue 4260 about compatibility problems of v1.26.0 with Java-based applications.

Symptom Container crash loopService outage

Root cause

Trigger
AWS made Bottlerocket v1.26.0 the latest Bottlerocket AMI in eu-west-1 between 02:00 and 04:30, and at 04:00 Karpenter saw the new version and started replacing the EC2 nodes of the production EKS cluster with it.

Detection

The Growth team reported the outage in the BSEE cloud onboarding issues channel at 08:07, and a member of the Product team told the Technology Team verbally at 08:15. The SaaS Uptime Over Time metric had already dropped at 04:45.

Remediation

Action items

Lessons

–

Sources

References

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, Node operating system image, Karpenter among them, read-only, from Claude Code or Codex. Its checks cite public reports like this one.

For AI tools and scripts

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.