适用:Java/Python/Go/JS 等项目、容器镜像、CI 流水线、业务系统;目标:识别开源组件漏洞、许可证风险、供应链投毒,落地常态化自查,满足等保、信创、数据安全合规要求。 核心思路:清单梳理 → 漏洞扫描 → 风险定级 → 验证修复 → 基线管控 → 持续监控
一、自查前置准备
1. 梳理开源资产(最基础一步,很多项目漏做)
需要收集项目所有引入的开源依赖,包含直接依赖 + 间接传递依赖:
自查要点:
区分直接依赖(自己代码显式引入)和传递依赖(第三方组件间接带入,高危漏洞高发区)
记录组件名称、版本、许可证、用途、引入时间
排除:仅开发环境依赖(devDependencies/test 依赖),生产环境依赖重点核查
容器场景:不仅查应用代码依赖,还要查操作系统包(apt/yum/apk 包)
输出物:《开源软件资产清单》
2. 明确风险判定来源
漏洞数据源优先使用:
NVD(美国国家漏洞库)CVE 编号
CNVD、CNNVD(国家信息安全漏洞库,国内合规必备)
OSV(开源漏洞数据库,Google 维护,覆盖多语言)
厂商安全公告:Apache、Spring、Node、Python 安全公告
风险类型不只有 CVE 漏洞,还要同时检查三类风险:
安全漏洞:远程代码执行 RCE、注入、越权、信息泄露、DoS
许可证风险:GPL 强传染、AGPL、未授权商用、许可证冲突(容易引发知识产权纠纷)
供应链风险:组件投毒、名称混淆包、废弃组件(项目停止维护)、恶意代码
二、分层自查手段(从轻量手工 → 自动化工具)
🔹 第一层:手工快速自查(小项目、临时抽查)
检查依赖版本:是否存在多年未更新的老旧版本
查已知高危 CVE:把组件 + 版本去 CNVD/NVD 检索
废弃组件判断:GitHub/Gitee 仓库是否归档、最近提交时间、是否有维护者
许可证检查:是否允许商用,是否需要开源衍生代码(GPL/AGPL 坑)
缺点:无法覆盖传递依赖,适合小项目快速摸底
🔹 第二层:开源工具自动化扫描(推荐,可集成 CI)
全部开源,无授权成本,可本地化部署
OWASP Dependency-Check(首选,多语言) 支持 Java、JS、Python、Go、Rust,扫描依赖,匹配 NVD,输出漏洞报告,支持 CI 集成。
# 示例 dependency-check --project="demo" --scan="./" --out ./reportOSV-Scanner(Google,轻量,基于 OSV 漏洞库) 自动读取 lock 文件,扫描 CVE,支持本地扫描
osv-scanner scan .Trivy(容器 + 代码 + 依赖全能,强烈推荐容器场景) 扫描镜像、文件系统、仓库、IaC,同时查系统包与应用依赖漏洞
# 扫描本地镜像 trivy image myapp:latest # 扫描项目目录 trivy fs .Snyk Open Source(开源 CLI,免费额度有限,本地可用)
LicenseFinder:专门扫描开源许可证风险
工具说明:工具仅做漏洞发现,工具报出的漏洞存在误报,必须人工复核,不能直接采信扫描结果。
🔹 第三层:代码级深度自查(高危系统、核心业务)
查看开源组件源码:重点看网络请求、文件读写、反序列化、命令执行逻辑
检查组件是否存在硬编码密钥、后门
重点关注:反序列化、XML 解析、文件上传类开源组件(历史漏洞高发)

三、漏洞风险定级标准(可直接用于内部报告)
参考 CVSS 评分,结合业务影响自定义定级:
额外加权规则:
组件暴露在公网 → 风险等级 + 1 级
组件处理用户输入 / 敏感数据 → 风险等级 + 1 级
组件无维护、无补丁 → 风险等级上调,考虑替换
四、漏洞验证、修复与缓解方案(核心落地环节)
1. 漏洞复核(消除误报,必不可少)
扫描工具经常误报,复核三步走:
确认实际引入版本:区分声明版本和最终打包生效版本(传递依赖经常版本不一致)
确认漏洞触发条件:是否满足攻击前提(如特定参数、特定版本配置)
确认业务是否用到漏洞相关代码路径:很多组件功能只引入但没有调用,无法触发漏洞
2. 修复方案优先级(从优到劣)
升级组件版本:优先升级到官方修复漏洞的稳定版本;⚠️升级前做单元测试、回归测试,防止版本兼容性问题
依赖排除:Maven/Gradle 等排除存在漏洞的传递依赖,替换安全版本
临时缓解(无法升级时)
网络层面:防火墙、WAF 限制访问入口
代码层面:禁用漏洞相关功能、输入校验
容器:最小权限运行,限制 capability
组件替换:项目已停止维护、无补丁,直接更换替代开源库
风险接受:评估后确认无法触发漏洞,走内部审批,留存风险评估报告,定期复审
❌禁止做法:直接注释掉工具漏洞告警、忽略高危漏洞不做台账。
五、CI/CD 流水线集成(常态化自动自查)
建议把开源依赖扫描嵌入 CI 流水线,提交代码 / 构建镜像时自动扫描,阻断高危组件进入生产:
代码提交阶段:OSV-Scanner /dependency-check 扫描依赖
镜像构建阶段:Trivy 扫描容器镜像,发现严重 / 高危漏洞直接阻断构建
版本发布前:生成开源组件清单 + 漏洞报告,作为发布准入检查项
策略:开发环境可以放行中低危;生产包构建,阻断 Critical/High 漏洞(特殊情况走审批豁免)
六、持续监控与台账管理
建立开源资产台账:组件名、版本、许可证、CVE 列表、风险等级、修复状态、责任人、截止时间
定期复测
核心业务系统:至少每月一次全量扫描
普通业务:每季度一次
新增 / 升级依赖:必须触发一次即时扫描
漏洞情报订阅:订阅 CNVD、NVD、开源项目安全公告,持续跟踪已引入组件新披露漏洞
退役管理:下线业务系统,同步清理开源资产台账
七、常见坑点自查清单(检查项)
是否只扫描直接依赖,忽略传递依赖漏洞(最高发问题)
是否区分开发依赖和生产依赖
容器镜像是否只查应用代码,没有扫描操作系统 rpm/deb 包漏洞
是否存在依赖版本锁定文件被删除,打包自动拉取最新版本
升级组件只看 CVE 修复,未做兼容性测试,引发业务故障
许可证风险未评估,GPL/AGPL 组件用于商用产品
使用已经归档停止维护的开源组件
漏洞仅工具扫描,没有人工复核,大量误报堆积
没有漏洞台账,无跟踪闭环机制
八、输出交付物清单(可直接用于安全评审 / 等保自查)
《开源软件资产清单》
《开源组件漏洞扫描原始报告》
《漏洞风险评估与复核报告》(剔除误报)
《漏洞修复计划台账》
《开源软件许可证风险评估报告》
CI 流水线开源安全扫描配置文档
九、极简自查执行流程(一页版)
导出所有生产依赖清单(含传递依赖)
使用 Trivy + Dependency-Check 执行扫描
人工复核,剔除误报,风险定级
制定修复计划,高危优先处理,无法修复则落实缓解措施 + 风险审批
资产和漏洞录入台账,跟踪闭环
接入 CI,构建时自动扫描,阻断高危组件发布
定期复测 + 持续监控新漏洞
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢