1. A Vulnerable Application Is Only Part of the Problem
A critical application vulnerability can become an infrastructure security incident when the environment surrounding the application provides attackers with excessive privileges, unrestricted network access or exposed credentials.
The October 2026 disclosure of PHP2Shell, involving CVE-2026-109618 and CVE-2026-109619, illustrates this risk.
These vulnerabilities affect PHP request processing and can allow unauthenticated remote code execution on vulnerable PHP environments. The PHP project released fixed versions for supported branches:
- PHP 8.2.35
- PHP 8.3.36
- PHP 8.4.27
- PHP 8.5.12
Organizations should also verify vendor security advisories because Linux distributions may backport security fixes without changing the upstream version number.
PHP2Shell is an application-runtime vulnerability, not a Terraform vulnerability. However, it provides an excellent scenario for examining a broader security question:
If an attacker gains code execution inside an application container, how much of the underlying infrastructure can they reach?
The answer depends heavily on infrastructure design.
Infrastructure as Code (IaC) security helps organizations identify dangerous configurations before infrastructure is provisioned. It does not eliminate application vulnerabilities, but it can significantly reduce the attack surface and limit the potential impact of successful exploitation.
This article explores how to combine Terraform security scanning, policy enforcement, container hardening and runtime controls into a practical DevSecOps strategy.
2. From Application RCE to Infrastructure Exposure
Consider a typical architecture:
- A public-facing web application running PHP.
- A Docker container hosting the application.
- A Kubernetes cluster orchestrating workloads.
- A cloud provider managing networking and infrastructure.
- IAM roles granting access to cloud resources.
- A secrets management system providing application credentials.
An attacker exploiting a vulnerable PHP runtime may obtain code execution with the privileges of the affected worker process.
What happens next depends on the security boundaries surrounding that process.
Potential exposure includes:
Environment variables: Application credentials or configuration values may be accessible to the compromised process.
Cloud identity: An overly permissive workload identity may allow unauthorized access to cloud resources.
Container privileges: An unnecessarily privileged container can increase the consequences of compromise.
Network access: Flat network architecture may expose internal APIs, databases and administrative services.
Secrets management: Poorly scoped credentials may allow access beyond the compromised application.
These conditions do not automatically produce a full infrastructure compromise. They create opportunities for privilege escalation, lateral movement and data exposure.
The objective of DevSecOps is to reduce these opportunities through preventive and detective controls.
3. Terraform Misconfigurations: Where Infrastructure Risk Begins
Terraform makes infrastructure repeatable, version-controlled and auditable.
However, infrastructure defined as code can reproduce security weaknesses just as efficiently as it reproduces correct configurations.
Some common examples include:
3.1 Publicly exposed management ports
A security group allowing SSH access from anywhere creates an unnecessary attack surface.
resource "aws_security_group_rule" "ssh" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = aws_security_group.app.id
}
This configuration should be replaced with a restricted administrative access strategy, such as a controlled VPN, bastion architecture or managed session service.
3.2 Overly permissive IAM policies
A compromised application should not inherit administrative privileges over an entire cloud account.
Avoid broad policies such as:
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
Instead, grant only the permissions required by the application, scoped to specific resources and operations.
3.3 Publicly accessible storage
Storage buckets containing application data, backups or logs should not be publicly accessible unless a documented business requirement explicitly demands it.
Enforce public-access restrictions and encryption through infrastructure policies.
3.4 Unrestricted network communication
A workload should not have unrestricted access to every internal service.
Use security groups, subnet segmentation, Kubernetes NetworkPolicies and explicit service-to-service authorization.
3.5 Missing infrastructure encryption
Databases, storage volumes and communication channels should use appropriate encryption configurations.
Encryption does not compensate for excessive permissions, but it is an important component of defense in depth.
4. Implementing Terraform Security Scanning
The first practical step is to introduce automated Infrastructure as Code analysis into the development workflow.
Several tools can help:
| Tool | Primary purpose |
|---|---|
| Checkov | IaC misconfiguration detection |
| Trivy | IaC, filesystem and container vulnerability scanning |
| Terrascan | Infrastructure configuration security |
| OPA | Policy as Code |
| Conftest | Testing structured configuration against policies |
4.1 Scan Terraform with Checkov
Checkov can analyze Terraform configurations before deployment.
Example:
pip install checkov
checkov \
-d terraform/ \
--framework terraform \
--output cli
This helps identify issues such as:
- Publicly exposed resources.
- Missing encryption.
- Insecure security group rules.
- Excessive IAM permissions.
- Missing logging configurations.
A scan should be part of the pull request validation process, not something performed manually before production releases.
4.2 Scan Infrastructure with Trivy
Trivy also supports Infrastructure as Code scanning.
trivy config terraform/
It can detect configuration weaknesses across supported IaC formats.
Using more than one scanner may improve coverage, but it should be based on a clear evaluation of overlapping rules, maintenance costs and false positives.
The objective is not to maximize the number of security tools. It is to establish reliable and actionable controls.
5. Building a Security Gate with GitLab CI/CD
A practical DevSecOps implementation should validate Terraform configurations before infrastructure changes are applied.
Example pipeline:
stages:
- validate
- security
- plan
- deploy
terraform_validate:
stage: validate
image: hashicorp/terraform:latest
script:
- terraform -chdir=terraform init -backend=false
- terraform -chdir=terraform validate
terraform_security:
stage: security
image: bridgecrew/checkov:latest
script:
- checkov -d terraform/ --framework terraform --output cli
allow_failure: false
terraform_plan:
stage: plan
image: hashicorp/terraform:latest
script:
- terraform -chdir=terraform init
- terraform -chdir=terraform plan -out=tfplan
dependencies:
- terraform_validate
terraform_deploy:
stage: deploy
script:
- terraform -chdir=terraform apply -auto-approve tfplan
when: manual
dependencies:
- terraform_plan
This is an illustrative pipeline. A production implementation should pin container images by immutable digest, securely manage remote state and credentials, preserve the exact reviewed plan artifact, and use protected deployment environments.
Security scanning should also produce machine-readable reports that can be consumed by the security team.
5.1 Moving from scanning to policy enforcement
Finding a misconfiguration is useful. Preventing it from reaching production is better.
Open Policy Agent (OPA) and Conftest allow teams to express security requirements as policies.
For example, a policy can reject Terraform configurations containing unrestricted SSH ingress.
Illustrative Rego policy:
package terraform.security
deny contains msg if {
some rule in input.resource_changes
rule.type == "aws_security_group_rule"
after := rule.change.after
after.from_port == 22
after.cidr_blocks[_] == "0.0.0.0/0"
msg := "SSH must not be exposed to the public internet"
}
The exact input schema must match the Terraform plan JSON and the policy must be tested against representative plans before being enforced.
This approach allows organizations to move from generic security scanning to business-specific security requirements.
6. Hardening the Runtime Environment
Terraform controls the infrastructure provisioning layer. Application security must continue after deployment.
For Kubernetes workloads, consider the following controls:
Run as non-root
securityContext:
runAsNonRoot: true
runAsUser: 10001
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
Apply network segmentation
Restrict application communication to the services it actually requires.
Protect workload identities
Use short-lived, workload-specific credentials instead of embedding cloud access keys in containers.
Control secrets
Use a dedicated secrets management platform, restrict access and rotate credentials when compromise is suspected.
Monitor runtime activity
Falco can detect suspicious behaviors, including unexpected shell execution and unusual process activity inside containers.
These controls help reduce the consequences of an application-level compromise.
7. The PHP2Shell Incident Response Perspective
When investigating a PHP2Shell exposure, organizations should not stop after identifying and updating the PHP package.
A structured response should include:
- Identify every PHP deployment, including containers and bundled runtimes.
- Check the actual runtime version and vendor security advisories.
- Update to a fixed release or vendor-patched package.
- Rebuild and redeploy affected container images.
- Restart all relevant PHP workers.
- Investigate logs, process activity and potential indicators of compromise.
- Review credentials accessible to affected workloads.
- Audit cloud IAM permissions and network access.
- Rotate potentially exposed credentials.
- Verify that the rebuilt infrastructure and applications meet security policies.
A particularly important detail: scanning the host’s command-line PHP version alone may not identify the version serving web traffic. The web runtime and container images must also be inventoried.
8. Building a Defense-in-Depth DevSecOps Architecture
An effective security strategy combines preventive, detective and corrective controls.
| Layer | Security control | Example tooling |
|---|---|---|
| Source code | IaC scanning | Checkov, Trivy |
| Policy enforcement | Policy as Code | OPA, Conftest |
| Infrastructure | IAM and network hardening | Cloud-native controls |
| Container build | Image vulnerability scanning | Trivy |
| Deployment | Admission policies | Kyverno, OPA Gatekeeper |
| Runtime | Threat detection | Falco |
| Incident response | Monitoring and remediation | SIEM, cloud audit logs |
This architecture makes security part of the delivery lifecycle instead of treating it as a final approval step.
9. Production Readiness Checklist
Before deploying Terraform-managed infrastructure, engineering teams should verify:
- No unrestricted SSH or administrative access.
- IAM permissions follow least privilege.
- Public storage access is explicitly controlled.
- Encryption is enabled where required.
- Secrets are not stored in Terraform source files or state in plaintext.
- Terraform state is protected and access-controlled.
- IaC scanning is integrated into CI/CD.
- Critical security policies block deployment.
- Container images are scanned before release.
- Kubernetes workloads run with restricted privileges.
- Network policies restrict unnecessary communication.
- Runtime security monitoring is operational.
- Incident response includes credential rotation and exposure assessment.
10. Infrastructure Security Must Start Before Deployment
PHP2Shell illustrates an important principle: application vulnerabilities can have consequences far beyond the application itself when infrastructure security boundaries are weak.
Terraform provides a powerful way to define and reproduce infrastructure, but secure infrastructure requires more than version-controlled configuration files.
It requires automated scanning, policy enforcement, least-privilege access, network segmentation, secure workload configuration and runtime monitoring.
The real DevSecOps objective is not simply to prevent vulnerable infrastructure from being deployed.
It is to ensure that when an application vulnerability is discovered or exploited, the surrounding infrastructure does not turn a limited compromise into a much larger security incident.
Secure infrastructure is not a deployment milestone. It is a continuous engineering responsibility.

