Black-box and authenticated assessment of AWS infrastructure, EKS cluster configuration, IAM permission boundaries, and container runtime security for [REDACTED]. Conducted under authorised engagement agreement ref. ENG-2025-0412.
Plaidnox InfoSec conducted an authorised cloud and Kubernetes penetration assessment of [REDACTED]' AWS production environment between February 10 and 21, 2025. The scope included the AWS account boundary, three EKS clusters running patient-facing workloads, ECR container registries, and the CI/CD pipeline integration with GitHub Actions.
The assessment identified 11 vulnerabilities across five severity tiers. Three Critical findings represent direct paths to cross-account data exfiltration: an IMDSv1 SSRF chain from a public-facing pod, an overpermissive IAM role attached to worker nodes, and a publicly exposed Kubernetes API server endpoint accepting unauthenticated list operations. Immediate remediation is required before the next production release cycle.
Testing followed the OWASP Cloud Security Testing Guide, CIS AWS Foundations Benchmark v2.0, CIS Kubernetes Benchmark v1.8, and MITRE ATT&CK for Containers. All active exploitation was conducted on an isolated staging replica of the production cluster.
| ID | Title | Severity | CVSS | Category |
|---|---|---|---|---|
| CLD-001 | IMDSv1 SSRF via Public-Facing Pod → AWS Credentials | Critical | 9.6 | Container Escape |
| CLD-002 | Worker Node IAM Role Allows AssumeRole on All AWS Services | Critical | 9.1 | IAM Privilege Escalation |
| CLD-003 | Kubernetes API Server Publicly Exposed — Anonymous List Allowed | Critical | 9.0 | K8s Misconfiguration |
| CLD-004 | S3 Bucket with Patient Records Allows Public Read via ACL | High | 8.2 | Storage Exposure |
| CLD-005 | ECR Images Running as Root with No Read-Only Filesystem | High | 7.4 | Container Security |
| CLD-006 | Secrets Stored in Kubernetes ConfigMaps in Plaintext | High | 7.1 | Secrets Management |
| CLD-007 | GitHub Actions Workflow Exposes AWS Credentials via Env Vars | High | 6.8 | CI/CD Security |
| CLD-008 | Kubernetes RBAC — ClusterAdmin Binding on Service Account | Medium | 5.8 | K8s RBAC |
| CLD-009 | CloudTrail Logging Disabled in Two Secondary Regions | Medium | 4.4 | Audit & Logging |
| CLD-010 | Pod Security Admission Not Enforced on Production Namespace | Low | 3.2 | K8s Policy |
| CLD-011 | EKS Cluster Version 1.26 — End of Support Since Q1 2024 | Info | 0.0 | Lifecycle |
fetch-document endpoint)
was exploitable as an SSRF vector. Combined with IMDSv1 still enabled on the underlying EC2 worker nodes,
an attacker can retrieve the IAM instance profile credentials for the node's service role via
the link-local metadata endpoint http://169.254.169.254/latest/meta-data/iam/security-credentials/.GET /api/fetch-document?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/eks-worker-role # Response — credentials returned to attacker: { "AccessKeyId": "ASIA...", "SecretAccessKey": "...", "Token": "IQo...", "Expiration": "2025-02-11T08:30:00Z" }
HttpTokens: required in the launch template.fetch-document — deny all requests to RFC 1918 and 169.254.0.0/16 ranges.altera-prod-cluster-2 has its API server endpoint
configured as public (0.0.0.0/0). Additionally, the RBAC policy includes a
ClusterRoleBinding granting list and get permissions on
all resources to the system:anonymous principal — unauthenticated requests can
enumerate all pods, services, secrets, and configmaps cluster-wide.system:anonymous and system:unauthenticated principals immediately.kubectl auth can-i --list --as=system:anonymous after the fix to verify zero permissions remain.| ID | Finding | Action | Owner |
|---|---|---|---|
| CLD-001 | IMDSv1 SSRF | Enforce IMDSv2 on all node groups; SSRF allowlist on fetch endpoint | Platform Team |
| CLD-002 | Overpermissive Node IAM Role | Apply least-privilege IAM policy scoped to required S3/ECR operations only | Cloud Infra |
| CLD-003 | Public K8s API + Anonymous RBAC | Restrict endpoint CIDR; remove anonymous RBAC bindings | Platform Team |
| CLD-004 | Public S3 Bucket | Remove public ACL; enable S3 Block Public Access at account level | Cloud Infra |
| CLD-005 | Containers Running as Root | Set runAsNonRoot: true and readOnlyRootFilesystem: true in pod security context | App Teams |
| CLD-006 | Secrets in ConfigMaps | Migrate to Kubernetes Secrets with envelope encryption via AWS KMS | Platform Team |
| CLD-007 | CI/CD Credential Exposure | Replace long-lived AWS keys with OIDC-based GitHub Actions federation | DevOps |