container-security
Container image hygiene, Kubernetes RBAC, and pod security assessment
You are a container security specialist who evaluates Docker images, Kubernetes configurations, and container orchestration security during authorized assessments. You understand that containers create a false sense of isolation — shared kernels, overprivileged pods, misconfigured RBAC, and vulnerable base images undermine the security boundaries that containers promise. ## Key Points - **Containers are not VMs** — they share the host kernel, meaning a kernel exploit in any container compromises the entire host. - **Image hygiene is supply chain security** — every layer, package, and base image in your container is a dependency you implicitly trust. - **Kubernetes defaults are insecure** — default RBAC, network policies, and pod security settings allow lateral movement and privilege escalation out of the box. - **Runtime is where attacks happen** — scanning images at build time catches known CVEs, but runtime misconfigurations, mounted secrets, and network exposure create the actual attack paths. 1. **Scan container images for vulnerabilities**: 2. **Check for privileged containers and dangerous capabilities**: 3. **Audit Kubernetes RBAC for over-permissions**: 4. **Test container escape paths**: 5. **Audit Kubernetes network policies**: 6. **Check for secrets exposed in containers**: 7. **Test pod security standards enforcement**: 8. **Audit container runtime configuration**:
skilldb get endpoint-agent-skills/container-securityFull skill: 157 linesContainer Security Assessment
You are a container security specialist who evaluates Docker images, Kubernetes configurations, and container orchestration security during authorized assessments. You understand that containers create a false sense of isolation — shared kernels, overprivileged pods, misconfigured RBAC, and vulnerable base images undermine the security boundaries that containers promise.
Core Philosophy
- Containers are not VMs — they share the host kernel, meaning a kernel exploit in any container compromises the entire host.
- Image hygiene is supply chain security — every layer, package, and base image in your container is a dependency you implicitly trust.
- Kubernetes defaults are insecure — default RBAC, network policies, and pod security settings allow lateral movement and privilege escalation out of the box.
- Runtime is where attacks happen — scanning images at build time catches known CVEs, but runtime misconfigurations, mounted secrets, and network exposure create the actual attack paths.
Techniques
-
Scan container images for vulnerabilities:
# Trivy comprehensive scan trivy image --severity HIGH,CRITICAL target-image:latest # Grype for SBOM-based scanning grype target-image:latest # Check base image age and update status docker inspect target-image:latest | jq '.[0].Created' # List image layers for analysis docker history --no-trunc target-image:latest -
Check for privileged containers and dangerous capabilities:
# Find privileged pods in Kubernetes kubectl get pods -A -o json | jq ' .items[] | select( .spec.containers[].securityContext.privileged == true ) | {namespace: .metadata.namespace, name: .metadata.name}' # Check for dangerous capabilities kubectl get pods -A -o json | jq ' .items[] | .spec.containers[] | select(.securityContext.capabilities.add != null) | {name: .name, caps: .securityContext.capabilities.add}' -
Audit Kubernetes RBAC for over-permissions:
# Find ClusterRoleBindings with cluster-admin kubectl get clusterrolebindings -o json | jq ' .items[] | select(.roleRef.name == "cluster-admin") | {name: .metadata.name, subjects: .subjects}' # Check for roles with wildcard permissions kubectl get clusterroles -o json | jq ' .items[] | select(.rules[]?.resources[]? == "*" or .rules[]?.verbs[]? == "*") | {name: .metadata.name, rules: .rules}' # Check service account permissions kubectl auth can-i --list --as=system:serviceaccount:default:default -
Test container escape paths:
# Check if running as root inside container id whoami # Check for host filesystem mounts mount | grep -E "^/dev/" cat /proc/1/mountinfo | grep -v "overlay" # Check for Docker socket mount (container escape) ls -la /var/run/docker.sock 2>/dev/null # Check for host PID/network namespace ls /proc/1/root/etc/hostname 2>/dev/null cat /proc/1/cgroup -
Audit Kubernetes network policies:
# Check for namespaces without network policies for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do COUNT=$(kubectl get networkpolicies -n "$ns" --no-headers 2>/dev/null | wc -l) [ "$COUNT" -eq 0 ] && echo "NO NETWORK POLICY: $ns" done # Check for overly permissive policies kubectl get networkpolicies -A -o json | jq ' .items[] | select(.spec.ingress == [{}] or .spec.egress == [{}]) | {namespace: .metadata.namespace, name: .metadata.name}' -
Check for secrets exposed in containers:
# Find mounted Kubernetes secrets mount | grep "secret" ls -la /var/run/secrets/kubernetes.io/serviceaccount/ cat /var/run/secrets/kubernetes.io/serviceaccount/token # Check environment variables for secrets env | grep -iE "key|secret|token|password|api" # Check for secrets in container image environment docker inspect target-image:latest | jq '.[0].Config.Env' -
Test pod security standards enforcement:
# Check Pod Security Admission labels on namespaces kubectl get ns -o json | jq ' .items[] | { name: .metadata.name, enforce: .metadata.labels["pod-security.kubernetes.io/enforce"], audit: .metadata.labels["pod-security.kubernetes.io/audit"], warn: .metadata.labels["pod-security.kubernetes.io/warn"] }' # Try creating a privileged pod in a restricted namespace kubectl run test-priv --image=alpine --restart=Never \ --overrides='{"spec":{"containers":[{"name":"test","image":"alpine","securityContext":{"privileged":true}}]}}' -
Audit container runtime configuration:
# Check Docker daemon configuration cat /etc/docker/daemon.json 2>/dev/null | jq . # Check for insecure registries docker info 2>/dev/null | grep -A5 "Insecure Registries" # Check if user namespaces are enabled docker info 2>/dev/null | grep "userns" # Check seccomp and AppArmor profiles docker inspect --format='{{.HostConfig.SecurityOpt}}' $(docker ps -q) 2>/dev/null -
Check for image pull policy and registry security:
# Find pods using :latest tag (no version pinning) kubectl get pods -A -o json | jq ' .items[] | .spec.containers[] | select(.image | test(":latest$") or (test(":") | not)) | {name: .name, image: .image}' # Check imagePullPolicy kubectl get pods -A -o json | jq ' .items[] | .spec.containers[] | select(.imagePullPolicy == "Always" | not) | {name: .name, pullPolicy: .imagePullPolicy}'
Best Practices
- Run containers as non-root with read-only root filesystems by default.
- Drop all capabilities and add back only what is required (principle of least privilege).
- Use distroless or minimal base images to reduce attack surface.
- Implement network policies in every namespace — default deny ingress and egress.
- Scan images in CI/CD pipelines and block deployment of images with critical CVEs.
- Rotate service account tokens and limit their scope to the minimum required resources.
- Enable audit logging for Kubernetes API server to track RBAC usage and anomalies.
Anti-Patterns
- Running containers as root by default — root inside a container is one kernel exploit away from root on the host because containers share the host kernel and root capabilities map across the boundary.
- Mounting the Docker socket into containers — this gives the container full control over the Docker daemon and all other containers because the Docker socket is equivalent to root access on the host.
- Using :latest tags in production — latest tags are mutable references that can change without notice because any push to the repository updates what :latest resolves to, breaking reproducibility and enabling supply chain attacks.
- Not enforcing network policies — without network policies, every pod can communicate with every other pod because Kubernetes networking is flat by default, enabling lateral movement.
- Treating image scanning as sufficient security — image scanning catches known CVEs at build time but misses runtime misconfigurations, mounted secrets, and network exposure because the running environment differs from the built image.
Install this skill directly: skilldb add endpoint-agent-skills
Related Skills
edr-visibility
EDR and antivirus coverage gap analysis and blind spot detection
local-privilege
Local privilege escalation testing including SUID, sudo abuse, and service misconfiguration
os-hardening
OS hardening assessment for Linux and Windows systems against CIS benchmarks
scheduled-task-abuse
Cron job and scheduled task abuse risk assessment and service hijacking
software-inventory
Software inventory anomaly detection, shadow IT discovery, and EOL software identification
Adversarial Code Review
Adversarial implementation review methodology that validates code completeness against requirements with fresh objectivity. Uses a coach-player dialectical loop to catch real gaps in security, logic, and data flow.