Files
Charon/docs/security/archive/supply-chain-no-cache-solution.md
2026-03-04 18:34:49 +00:00

13 KiB

Supply Chain Security: Vulnerability Remediation Strategy

Date: 2026-01-11 PR: #461 - DNS Challenge Support Status: ⚠️ 8 Medium Vulnerabilities Identified (Not False Positives)


Executive Summary

After implementing --no-cache builds, the supply chain scan still reports 8 Medium vulnerabilities. Investigation reveals these are actual runtime dependencies, not false positives from cached layers.

Vulnerability Breakdown:

  • 3 Alpine APK packages (busybox, curl, ssl_client) - CVE-2025-60876, CVE-2025-10966 (no fixes available)
  • 2 Go dependencies (golang.org/x/crypto v0.42.0) - GHSA-j5w8-q4qc-rx2x, GHSA-f6x5-jh6r-wrfv (fix available: v0.45.0)

Current Status:

  • No-cache builds implemented successfully
  • ⚠️ Alpine base image vulnerabilities have no upstream patches yet
  • 🔧 golang.org/x/crypto requires dependency update

Vulnerability Analysis

Actual Vulnerabilities Found (Not False Positives)

1. Alpine Base Image - busybox (CVE-2025-60876)

Affected Packages: busybox, busybox-binsh, ssl_client Current Version: 1.37.0-r20 Fixed Version: None available Severity: Medium

Details: CVE-2025-60876 affects busybox utilities in Alpine 3.21. No patch is available yet from Alpine upstream.

Impact:

  • Affects base image utilities (not directly used by application)
  • Busybox provides minimal shell and utilities in Alpine
  • Low exploitability in containerized environment

Recommendation: Monitor Alpine security advisories for patch release.

2. Alpine Base Image - curl (CVE-2025-10966)

Current Version: 8.14.1-r2 Fixed Version: None available Severity: Medium

Details: CVE-2025-10966 affects libcurl in Alpine 3.21. No patch is available yet from Alpine upstream.

Impact:

  • curl is used by healthcheck scripts
  • Medium severity with limited attack surface
  • Requires network access to exploit

Recommendation: Monitor Alpine security advisories for patch release.

3. Go Dependencies - golang.org/x/crypto (GHSA-j5w8-q4qc-rx2x, GHSA-f6x5-jh6r-wrfv)

Current Version: v0.42.0 (transitive dependency) Fixed Version: v0.45.0 Severity: Medium

Details: Two GitHub Security Advisories affecting golang.org/x/crypto v0.42.0:

  • GHSA-j5w8-q4qc-rx2x: SSH connection handling vulnerability
  • GHSA-f6x5-jh6r-wrfv: SSH key parsing vulnerability

Dependency Chain:

github.com/go-playground/validator/v10@v10.28.0
  └─> golang.org/x/crypto@v0.42.0 (VULNERABLE)

Direct dependency: golang.org/x/crypto@v0.46.0 (SAFE)

Impact:

  • Transitive dependency from go-playground/validator
  • validator library used for input validation in API handlers
  • Medium severity - requires specific conditions to exploit

Remediation: Force upgrade via go.mod replace directive or wait for upstream validator update.


Root Cause Analysis

Why No-Cache Didn't Eliminate These

The --no-cache implementation worked correctly. These vulnerabilities are in the runtime image, not in build cache layers:

  1. Alpine packages are installed in the final Docker image via RUN apk add
  2. golang.org/x/crypto is compiled into the charon binary as a transitive dependency
  3. Not cached layers - these are actual production dependencies

What No-Cache Did Accomplish

Eliminated potential false positives from builder stage caching Ensured fresh base image pulls with latest patches Provided clean, reproducible builds Accurate SBOM reflecting actual runtime dependencies


Remediation Strategy

Immediate Actions (Can Implement Now)

1. Force golang.org/x/crypto Upgrade

Add a replace directive to force the vulnerable transitive dependency to use the patched version:

// backend/go.mod
module github.com/Wikid82/charon/backend

go 1.25.5

// Force all transitive dependencies to use patched version
replace golang.org/x/crypto v0.42.0 => golang.org/x/crypto v0.45.0

require (
    // ... existing dependencies
)

Expected Impact: Eliminates 2-4 of the 8 Medium vulnerabilities (the golang.org/x/crypto issues).

Testing Required:

  • Backend unit tests
  • Integration tests
  • Validate validator/v10 compatibility

2. Document Accepted Risk for Alpine CVEs

Since Alpine has not released patches for CVE-2025-60876 and CVE-2025-10966:

  1. Create risk acceptance document in docs/security/accepted-risks.md
  2. Document mitigation strategies:
    • busybox/ssl_client: Not directly invoked by application code
    • curl: Only used in healthchecks, no user input processing
  3. Set monitoring alerts for Alpine security updates
  4. Plan to update base image when patches are released

Short-Term Actions (Monitor & Update)

3. Monitor Alpine Security Advisories

Action Plan:

  1. Subscribe to Alpine Linux security mailing list

  2. Check https://security.alpinelinux.org/vuln daily

  3. When patches are released:

    # Update Dockerfile base image
    FROM caddy:2-alpine  # This will pull the latest Alpine patch
    
  4. Rebuild and re-scan to verify resolution

4. Monitor go-playground/validator Updates

Action Plan:

  1. Check https://github.com/go-playground/validator/releases weekly

  2. When validator releases version with golang.org/x/crypto@v0.45.0+:

    cd backend
    go get -u github.com/go-playground/validator/v10@latest
    go mod tidy
    
  3. Remove the replace directive from go.mod

  4. Re-run tests and supply chain scan

Long-Term Actions (Proactive Security)

Long-Term Actions (Proactive Security)

5. Implement Automated Dependency Updates

Tools to Consider:

  • Renovate Bot (already configured) - increase update frequency
  • Dependabot for Go modules
  • Automated security patch PRs

Configuration:

// .github/renovate.json
{
  "vulnerabilityAlerts": {
    "enabled": true,
    "schedule": "at any time"
  },
  "go": {
    "enabled": true,
    "schedule": "weekly"
  }
}

6. Alternative Base Images

Research Options:

  1. Distroless (Google) - Minimal attack surface, no shell
  2. Alpine with chainguard - Hardened Alpine with faster security patches
  3. Wolfi (Chainguard) - Modern, security-first distribution

Evaluation Criteria:

  • Security patch velocity
  • Compatibility with Caddy
  • Image size impact
  • Build time impact

Implementation Plan

Phase 1: Immediate Remediation (This PR)

  1. Add replace directive for golang.org/x/crypto
  2. Run full test suite
  3. Verify supply chain scan shows reduction to 3-4 Medium vulnerabilities
  4. Document accepted risks for Alpine CVEs

Phase 2: Monitoring & Updates (Next 2 Weeks)

  1. Monitor Alpine security advisories daily
  2. Check go-playground/validator for updates weekly
  3. Set up automated alerts for CVE-2025-60876 and CVE-2025-10966
  4. Review Renovate configuration for security updates

Phase 3: Long-Term Hardening (Next Quarter)

  1. Evaluate alternative base images (distroless, wolfi)
  2. Implement automated security patch workflow
  3. Add security regression tests to CI/CD
  4. Quarterly security posture review

No-Cache Implementation (Completed)

Files Modified

  1. .github/workflows/docker-build.yml

    • Added no-cache: true to build-and-push step
    • Removed GitHub Actions cache configuration
    • Added --no-cache to PR-specific builds
  2. .github/workflows/waf-integration.yml

    • Added --no-cache flag to integration test builds
  3. .github/workflows/security-weekly-rebuild.yml

    • Already using no-cache for scheduled scans

What No-Cache Accomplished

Clean Builds: No cached layers from previous builds Fresh Base Images: Always pulls latest Alpine patches Accurate SBOMs: Only runtime dependencies included Reproducible Builds: Consistent results across runs


Testing & Validation

Test Plan for golang.org/x/crypto Upgrade

# 1. Add replace directive to backend/go.mod
echo 'replace golang.org/x/crypto v0.42.0 => golang.org/x/crypto v0.45.0' >> backend/go.mod

# 2. Update dependencies
cd backend
go mod tidy

# 3. Run test suite
go test ./... -v -cover

# 4. Build Docker image
docker build --no-cache -t charon:security-test .

# 5. Scan for vulnerabilities
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy:latest image charon:security-test \
  --severity MEDIUM,HIGH,CRITICAL

# 6. Verify golang.org/x/crypto vulnerabilities are resolved

Expected Results

Before Replace Directive:

Medium: 8 (busybox x3, curl x1, golang.org/x/crypto x4)

After Replace Directive:

Medium: 4 (busybox x3, curl x1)

Rollback Plan

If the replace directive causes test failures:

# Remove replace directive
cd backend
git checkout backend/go.mod backend/go.sum

# Rebuild and test
go mod tidy
go test ./...

Monitoring and Maintenance

Ongoing Monitoring

  1. Weekly Security Scans: Automated via security-weekly-rebuild.yml
  2. PR-Level Scans: Every pull request gets supply chain verification
  3. SARIF Upload: Results uploaded to GitHub Security tab for tracking
  4. Dependabot: Automated dependency updates for Go modules and npm packages

Success Metrics

  • 0 false positive vulnerabilities from cached layers
  • 100% SBOM accuracy (only production dependencies)
  • Build time increase < 5 minutes
  • All security scans passing for PRs

Review Schedule

  • Monthly: Review build time impact and optimization opportunities
  • Quarterly: Assess if partial caching can be re-enabled for dev branches
  • Annual: Full security posture review and workflow optimization

References


Conclusion

Implementing --no-cache builds across all workflows eliminates false positive vulnerability reports from cached Go module layers. This provides accurate security posture reporting, clean SBOMs, and compliance-ready artifacts. The trade-off of slightly longer build times is acceptable for the security benefits gained.

Next Steps:

  1. Changes committed to docker-build.yml and waf-integration.yml
  2. Wait for next PR build to validate clean scan results
  3. Monitor build time impact and adjust if needed
  4. Update this document with actual performance metrics after deployment

Authored by: Engineering Director (Management Agent) Review Status: Ready for implementation Approval: Pending user confirmation


Security Posture Summary

Current State (PR #461 - Build 20901537001)

Vulnerability Status: ⚠️ 8 Medium Critical/High: 0 Build Quality: No-cache implemented, accurate scanning

Package Version CVE/GHSA Severity Fix Available Action
busybox 1.37.0-r20 CVE-2025-60876 Medium No Monitor Alpine
busybox-binsh 1.37.0-r20 CVE-2025-60876 Medium No Monitor Alpine
ssl_client 1.37.0-r20 CVE-2025-60876 Medium No Monitor Alpine
curl 8.14.1-r2 CVE-2025-10966 Medium No Monitor Alpine
golang.org/x/crypto v0.42.0 GHSA-j5w8-q4qc-rx2x Medium v0.45.0 Add replace directive
golang.org/x/crypto v0.42.0 GHSA-j5w8-q4qc-rx2x Medium v0.45.0 (duplicate)
golang.org/x/crypto v0.42.0 GHSA-f6x5-jh6r-wrfv Medium v0.45.0 Add replace directive
golang.org/x/crypto v0.42.0 GHSA-f6x5-jh6r-wrfv Medium v0.45.0 (duplicate)

Risk Assessment

Alpine CVEs (3 unique vulnerabilities in 4 packages):

  • Exploitability: Low (requires local access or specific network conditions)
  • Impact: Limited (utilities not directly exposed to user input)
  • Mitigation: Containerization limits attack surface
  • Status: ACCEPTED RISK - Monitor for upstream patches

golang.org/x/crypto (2 unique vulnerabilities, 4 entries due to scan reporting):

  • Exploitability: Medium (requires SSH connection handling)
  • Impact: Medium (transitive dependency from validator)
  • Mitigation: Add replace directive to force v0.45.0
  • Status: ACTIONABLE - Implement in this PR
  1. 🔴 HIGH PRIORITY: Implement golang.org/x/crypto replace directive (reduces to 4 Medium)
  2. 🟡 MEDIUM PRIORITY: Document accepted risk for Alpine CVEs
  3. 🟢 LOW PRIORITY: Monitor Alpine security advisories for patches

Next Steps

  1. No-cache builds implemented and validated
  2. Add replace directive for golang.org/x/crypto v0.45.0
  3. Run full test suite to validate compatibility
  4. Create accepted-risks.md for Alpine CVEs
  5. Monitor Alpine and validator upstream for patches
  6. Re-scan to verify reduction to 4 Medium vulnerabilities

Conclusion: The --no-cache implementation worked as intended. The 8 Medium vulnerabilities are actual runtime dependencies, not false positives. We can immediately remediate 4 of them (golang.org/x/crypto) and must accept risk for the remaining 4 Alpine CVEs until upstream patches are released.