"매 third-party (OSS) dependency 의 vuln/license/integrity scan — 매 modern app 의 80%+ 가 OSS 코드라는 현실 위의 baseline 통제". 매 Heartbleed (2014), Equifax/Struts (2017), Log4Shell (2021), xz-utils backdoor (2024) 가 매 SBOM + SCA 를 매 NIST/EU CRA/US EO 14028 의 의무 사항 으로 격상. 매 2026 supply chain 공격 시대의 first line of defense.
매 핵심
매 What SCA scans
Direct deps: package.json, requirements.txt, go.mod, Cargo.toml.
Transitive deps: full dependency tree (often 10x direct).
Container images: OS packages + app deps (Trivy, Grype).
importrequestsdefepss_score(cve_id):r=requests.get(f"https://api.first.org/data/v1/epss?cve={cve_id}").json()ifr["data"]:returnfloat(r["data"][0]["epss"]),float(r["data"][0]["percentile"])returnNone,None# Prioritize: high CVSS AND high EPSS (likely exploited in wild)forcveinscan_results:epss,pct=epss_score(cve.id)ifcve.cvss>=7.0andepssandepss>0.5:page_oncall(cve)
Sigstore cosign verification (provenance)
# Verify image was built by trusted GitHub Actions workflow
cosign verify ghcr.io/org/app:v1.2.3 \
--certificate-identity "https://github.com/org/repo/.github/workflows/release.yml@refs/tags/v1.2.3"\
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
VEX statement (CycloneDX)
{"vulnerabilities":[{"id":"CVE-2024-XXXX","ratings":[{"severity":"critical"}],"analysis":{"state":"not_affected","justification":"code_not_reachable","detail":"Vulnerable function in lib X is never called; entrypoint disabled."}}]}
언제: triaging vuln noise (false positive vs real), generating VEX justifications from code context, summarizing CVE for stakeholders, suggesting upgrade paths.
언제 X: as the source of truth for vuln data — use NVD/OSV/GHSA. LLM only for prioritization and explanation.
❌ 안티패턴
Scan once, ship: vulns appear post-release; need continuous monitoring.
Block on every CVE: dev fatigue → bypass culture; use EPSS + reachability.
No transitive scan: direct deps look clean while transitive has critical CVE.
SBOM but no VEX: dump 10k vulns on customers without exploitability context.
Ignore lockfiles: scan only manifest → miss pinned vulnerable transitive.