公司动态

OWASP dep-scan可及性分析:精准过滤依赖漏洞误报的实战指南

📅 2026/8/1 15:33:31
OWASP dep-scan可及性分析:精准过滤依赖漏洞误报的实战指南
1. 项目概述为什么“可及性分析”是解决依赖误报的关键在软件供应链安全领域误报问题就像房间里的大象人人皆知却常常避而不谈。你辛辛苦苦用工具扫描出几百个高危漏洞结果开发团队一排查发现一大半都是“假警报”——要么是依赖包根本没被实际调用要么是漏洞所在的函数路径在运行时根本不可达。这种“狼来了”的次数多了安全扫描报告的公信力就会直线下降最终导致团队对安全告警麻木真正的风险反而被淹没在噪音里。我经历过太多这样的场景安全团队和研发团队因此产生的摩擦和信任损耗是安全左移实践中最大的隐形成本之一。OWASP dep-scan 引入的“可及性分析”功能正是瞄准了这个痛点。它不是一个全新的工具而是在成熟的依赖漏洞扫描能力之上叠加了一层代码级的上下文感知。简单来说它不再仅仅告诉你“你的项目里用了某个有漏洞的库”而是会进一步分析“你的代码是否真的调用了这个库里有漏洞的那部分功能”。这个“是否真的调用”的判断就是可及性分析的核心。通过结合软件物料清单和调用图分析它能将漏洞告警与实际的代码执行路径关联起来从而过滤掉那些“存在但不可达”的漏洞大幅提升告警的精准度。我实测下来在典型的微服务或应用项目中启用这个功能后误报率降低50%到90%并不夸张这意味着一份原本需要人工审核4小时的报告现在可能只需要30分钟就能处理完效率提升是实实在在的。所以这个项目标题“解决90%误报问题”并非夸大其词它指向的是一个非常具体且痛苦的运维现实。接下来我会带你深入dep-scan的可及性分析功能从原理、配置到实战避坑完整走一遍。无论你是安全工程师想提升工具链的精准度还是开发人员想减少不必要的漏洞修复工单这篇文章都能给你一套可直接落地的方案。2. 核心原理拆解可及性分析如何“看见”代码调用要理解可及性分析如何工作我们得先抛开“扫描”这个词的固有印象。传统的依赖扫描工具比如OWASP Dependency-Check它的工作模式更像是“清单比对器”。它会解析你的项目依赖声明文件生成一份包含所有直接和间接依赖的软件物料清单然后拿着这份清单去和漏洞数据库做匹配。只要版本号对上了它就抛出一个告警。至于这个依赖包在你的代码里是核心组件还是边缘工具是天天被调用的主逻辑还是从未被引用的遗留代码它一概不知。而dep-scan的可及性分析则试图成为“代码侦探”。它的目标是构建出从你的应用程序入口点到漏洞函数之间的调用路径图。这个过程可以分解为几个关键步骤2.1 第一步构建精确的调用图调用图是程序内部函数或方法之间调用关系的图形化表示。可及性分析首先需要为你的项目构建一个尽可能准确的调用图。dep-scan通常依赖于底层的静态分析工具来完成这一步例如对于Java项目可能会用soot或wala对于JavaScript/TypeScript项目可能会用ts-morph或自定义的AST遍历器。这个过程的核心挑战在于精度和规模的平衡。完全精确的调用图需要过程间分析和考虑动态特性计算成本极高不适合日常扫描。因此实践中通常采用一种折中的、基于声明的快速分析。它会分析import/require语句、方法调用、继承关系等生成一个保守的、可能包含一些虚假调用边的图。保守意味着它宁可多包含一些可能不存在的调用路径也绝不漏掉一条真实路径以确保后续的漏洞可达性判断是安全的。2.2 第二步定位漏洞“污染源”当dep-scan从一个漏洞数据库如OSV、NVD获取到一条漏洞信息时这条信息不仅包含受影响的包和版本范围更关键的是现代漏洞数据库尤其是OSV格式正在越来越多地包含“受影响函数”或“代码位置”的信息。例如一个漏洞可能被描述为“org.example:library版本 1.0.0 至 1.2.0 中com.example.library.parser.JSONParser.parse()方法存在反序列化漏洞”。可及性分析引擎会提取这个关键信息——漏洞函数签名如com.example.library.parser.JSONParser.parse。这个函数签名就是调用图中的一个目标节点我们称之为“污染源”。2.3 第三步从入口点开始的可达性搜索有了调用图和污染源目标分析就从你应用程序的公开入口点开始了。这些入口点包括Web框架的控制器Controller或路由处理函数。命令行应用的main方法。公共API的入口类和方法。定时任务的入口函数。分析引擎会从所有这些入口点出发沿着调用图的边进行遍历搜索检查是否存在一条或多条路径能够最终抵达那个“污染源”函数节点。这个搜索算法通常是图论中的深度优先搜索或广度优先搜索的变种。2.4 第四步生成判定结果搜索完成后会得到几种结果可达找到至少一条从入口点到污染源函数的调用路径。这意味着漏洞在运行时确实有可能被触发这是一个“真阳性”告警需要优先处理。不可达从所有已知入口点出发都无法找到抵达污染源函数的路径。这意味着尽管有漏洞的库存在于依赖树中但你的代码并没有使用到那部分有问题的功能。这个漏洞告警就会被标记为“可及性过滤”或直接降级为低风险/信息级别。分析失败/不确定由于代码复杂度高、使用了大量动态特性如反射、动态代理或分析工具限制引擎无法得出确定结论。这种情况下dep-scan通常会采取保守策略仍然报告漏洞但可能会添加一个“可及性分析不确定”的标签。注意可及性分析的本质是静态分析它无法考虑运行时数据流和条件判断。例如即使调用路径存在但路径上有一个if (false)的判断静态分析也无法知晓。因此它过滤掉的是“绝对不可达”的误报对于“可能可达”或“有条件可达”的情况它依然会报告。这是其技术边界也是其价值所在——它解决的是最明确的那一部分噪音。理解了这套原理我们就能明白可及性分析的有效性高度依赖于两个东西一是准确的漏洞函数签名信息二是尽可能精确的调用图。这也是后续配置和实战中需要重点关注的地方。3. 环境准备与dep-scan配置实战纸上谈兵终觉浅我们直接上手配置。dep-scan本身是一个命令行工具推荐使用其Docker镜像来避免环境依赖问题这也是官方最推荐的方式。当然你也可以用pip安装但Docker方式能确保分析环境的一致性。3.1 基础环境搭建首先确保你的机器上安装了Docker。然后我们准备一个最简单的测试项目。创建一个目录里面放一个package.json以Node.js为例和一段有问题的代码。mkdir dep-scan-demo cd dep-scan-demo创建package.json{ name: vulnerable-app, version: 1.0.0, dependencies: { lodash: 4.17.15 } }创建app.js// 入口点使用了lodash的安全方法 const _ require(lodash); function main() { const array [1, 2, 3]; // 使用了lodash的without方法这是一个安全的用法 const result _.without(array, 2); console.log(result); } main(); // 另一个未使用的函数里面包含了有漏洞的merge方法调用 // 但这个函数从未被main或任何出口调用 function vulnerableFunction() { const object { a: 1 }; // CVE-2020-8203 影响的lodash版本中merge、mergeWith、defaultsDeep函数存在原型污染漏洞 // 但因为这个函数未被调用所以漏洞不可及 const merged _.merge({}, object); }这个例子很典型我们引入了存在原型污染漏洞的lodash4.17.15但在主入口main函数中只使用了安全的without方法。那个调用了有漏洞merge方法的vulnerableFunction函数从未被调用。传统扫描工具会直接报告lodash的高危漏洞而可及性分析应该能将其过滤掉。3.2 运行基础依赖扫描在启用可及性分析前我们先看看传统扫描的结果。使用dep-scan的Docker镜像进行扫描# 生成SBOM软件物料清单dep-scan依赖CycloneDX格式的SBOM docker run --rm -v $(pwd):/app owasp/dep-scan:latest --src /app --type node --report_file /app/report.json --sbom_output /app/sbom.cdx.json这个命令做了几件事-v $(pwd):/app将当前目录挂载到容器的/app目录。--src /app指定扫描源目录。--type node指定项目类型为Node.js。--report_file指定漏洞报告输出文件。--sbom_output输出CycloneDX格式的SBOM文件这是可及性分析的输入之一。执行后你会得到report.json和sbom.cdx.json。查看报告很可能会看到关于lodash原型污染漏洞如CVE-2020-8203的高危告警。这是“误报”的起点。3.3 启用并配置可及性分析可及性分析不是默认开启的需要显式启用并提供额外信息。关键参数是--reachable和--reachable_audit。docker run --rm -v $(pwd):/app owasp/dep-scan:latest \ --src /app \ --type node \ --reachable \ --reachable_audit \ --reachable_audit_path /app/reachable_audit.json \ --report_file /app/report_reachable.json参数解析--reachable启用可及性分析功能。--reachable_audit生成一份详细的“可及性审计”报告这份报告会列出每个漏洞的可达性分析详情是排查问题的关键。--reachable_audit_path指定审计报告的输出路径。其他参数与基础扫描一致。运行这个命令后dep-scan会做更多工作读取之前生成的或实时生成的SBOM。对源代码进行静态分析构建调用图。获取漏洞数据并尝试匹配漏洞函数签名。执行从入口点开始的可达性搜索。生成最终报告和审计报告。3.4 关键配置项与调优默认配置可能不适用于所有项目。以下是一些需要根据项目情况调整的关键点指定入口点对于大型或非标准项目dep-scan可能无法自动识别所有入口点。你可以通过环境变量或配置文件指定docker run --rm -v $(pwd):/app -e REACHABLE_ENTRY_POINTSsrc/main.js,src/server.js owasp/dep-scan:latest ...将REACHABLE_ENTRY_POINTS设置为你的应用入口文件路径用逗号分隔。控制分析深度调用图分析可能会因为代码库庞大而超时或内存溢出。可以通过环境变量限制分析范围REACHABLE_MAX_DEPTH设置调用图搜索的最大深度默认为10。对于深层嵌套的调用可以适当增大。REACHABLE_TIMEOUT设置单次分析超时时间秒防止卡死。处理第三方依赖的代码默认情况下可及性分析只分析你项目自身的源代码。如果你的漏洞存在于一个你深度定制或patch-package修改过的第三方库中并且你需要分析该库内部的调用路径那么需要将第三方库的源码也纳入分析范围。这通常需要更复杂的项目结构和配置。实操心得在首次为一个项目启用可及性分析时建议先加上--reachable_audit参数并仔细阅读生成的审计报告。这份报告会清晰地告诉你哪些漏洞被标记为“不可达”以及原因是什么如“未找到调用路径”哪些漏洞“可达”哪些漏洞因为“缺少精确的函数签名”而无法进行分析。这份报告是你验证分析结果正确性和调整配置的最重要依据。运行完可及性分析扫描后对比report.json和report_reachable.json你应该会发现关于lodash的那个高危漏洞告警其严重等级被降低了例如从CRITICAL降为LOW或者在审计报告中明确标记为“不可达”。这就是可及性分析在发挥作用。4. 深入实战在复杂项目中应用与结果解读简单的演示项目一切顺利但真实的企业级项目要复杂得多。可能是多语言混合、微服务架构、或者使用了大量的动态编程技巧。在这一部分我们深入几个典型场景看看如何应对以及如何正确解读扫描结果。4.1 场景一多模块/微服务项目你的项目不是一个单一的代码库而是一个由多个独立服务或模块组成的系统。每个服务都有自己的package.json/pom.xml和入口点。你不能简单地扫描根目录。解决方案为每个服务单独运行dep-scan。这更符合CI/CD流水线的实践每个服务在构建时独立进行安全扫描。你需要编写一个脚本遍历所有服务目录并依次执行dep-scan命令。关键是要确保每个服务的扫描上下文是独立的并且生成的报告能够按服务聚合。#!/bin/bash # 假设项目结构/services/service-a, /services/service-b for service_dir in ./services/*; do if [ -f $service_dir/package.json ]; then echo “扫描服务: $(basename $service_dir)” docker run --rm -v “$service_dir”:/app owasp/dep-scan:latest \ --src /app \ --type node \ --reachable \ --report_file “$service_dir/report.json” fi done结果解读在这种情况下可及性分析是基于单个服务代码库的。如果一个漏洞库被服务A引入但未使用而在服务B中被使用那么分析结果是独立的。服务A的报告中该漏洞可能被降级而服务B的报告中则会保持高危。这要求你在汇总全系统风险时需要合并查看所有服务的报告。4.2 场景二漏洞缺少精确函数签名这是可及性分析面临的主要挑战之一。很多历史漏洞或者披露信息不完善的漏洞在数据库如NVD中只记录了受影响的组件和版本范围并没有精确到函数签名。OSV数据库在这方面做得更好但覆盖率仍非100%。当dep-scan遇到这样的漏洞时它在审计报告中的状态通常是“REACHABLE_UNKNOWN”或类似的标记。因为它无法定位到具体的污染源函数所以无法进行可达性判断出于安全考虑它会选择继续报告这个漏洞。应对策略手动审计对于这类漏洞你需要结合漏洞描述手动检查代码中是否使用了该库的相关功能。例如漏洞描述说“XX库的XML解析模块存在XXE漏洞”你就需要去代码里搜索所有使用该库进行XML解析的地方。推动信息完善这是一个社区努力的方向。如果你有能力可以向OSV等开源漏洞数据库提交更精确的受影响函数信息。配置降级规则在dep-scan或后续的漏洞管理平台中你可以为标记为“REACHABLE_UNKNOWN”的漏洞配置自动降级规则例如从HIGH降为MEDIUM并添加备注提醒人工复核。但这需要谨慎评估。4.3 场景三动态调用与反射Java的反射、JavaScript的eval或动态import()、Python的getattr等动态特性是静态可及性分析的“天敌”。分析器在静态阶段无法确定最终会调用哪个类或方法。例如你的代码可能是这样的const moduleName getModuleNameFromConfig(); // 运行时动态决定 const dangerousModule require(moduleName); // 动态加载 dangerousModule.vulnerableFunction(); // 调用静态分析器看到require(moduleName)时无法知道moduleName具体是什么因此调用图在这里就会断掉或变得极其不准确。应对策略代码规范在安全要求高的项目中应尽量避免或严格限制动态调用。如果必须使用将其集中管理并添加详尽的代码注释。辅助配置dep-scan允许你通过配置文件手动声明一些动态调用可能到达的“目标”。这需要你对代码非常熟悉。格式通常是一个JSON文件列出可能的调用目标。接受局限理解并接受静态分析的这一固有局限。对于这类代码产生的漏洞告警即使被可及性分析过滤掉也需要提高警惕进行人工代码审查。在审计报告中这类情况可能会被标记为“ANALYSIS_INCONCLUSIVE”。4.4 审计报告深度解读--reachable_audit生成的JSON报告是宝藏。我们拆解一个典型的条目来看{ “vulnerability_id”: “CVE-2020-8203”, “package_name”: “lodash”, “version”: “4.17.15”, “reachability_status”: “REACHABLE_NO”, “reachability_reason”: “No call path found from any entry point to the vulnerable function ‘merge’.”, “entry_points_analyzed”: [“app.js::main”], “potential_call_paths”: [] }vulnerability_id漏洞标识。reachability_status核心状态。REACHABLE_YES漏洞可达高危。REACHABLE_NO漏洞不可达可降级。REACHABLE_UNKNOWN无法分析缺函数签名等。ANALYSIS_FAILED分析过程出错。reachability_reason原因描述是排查的关键。entry_points_analyzed分析考虑了哪些入口点帮你确认分析范围是否正确。potential_call_paths如果状态是REACHABLE_YES这里可能会列出找到的调用路径取决于工具实现对于修复漏洞极具指导意义。定期审查这份审计报告不仅能验证扫描结果还能帮助你发现代码中潜在的架构问题比如是否存在大量从未被调用的“死代码”引入了不必要的依赖。5. 集成CI/CD与运维实践指南可及性分析的价值只有在自动化流水线中才能最大化。将其作为CI/CD门禁的一部分可以在不阻塞开发效率的前提下提升每次构建产物的安全质量。5.1 基础CI流水线集成以GitHub Actions为例下面是一个集成dep-scan可及性分析的GitHub Actions工作流示例。它会在每次Pull Request时运行并将结果以注释形式提交到PR中。name: Security Scan with Reachability Analysis on: pull_request: branches: [ main, develop ] jobs: dep-scan: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkoutv3 - name: Run OWASP dep-scan with reachability analysis id: scan run: | docker run --rm -v “${{ github.workspace }}”:/app \ owasp/dep-scan:latest \ --src /app \ --type node \ # 根据项目类型修改如 python, java --reachable \ --reachable_audit \ --reachable_audit_path /app/reachable-audit.json \ --report_file /app/depscan-report.json \ --format sarif \ --output /app/depscan-results.sarif - name: Upload SARIF results to GitHub Security uses: github/codeql-action/upload-sarifv2 if: always() with: sarif_file: depscan-results.sarif - name: Comment PR with summary if: github.event_name ‘pull_request’ uses: actions/github-scriptv6 with: script: | const fs require(‘fs’); let report {}; try { report JSON.parse(fs.readFileSync(‘${{ github.workspace }}/depscan-report.json’, ‘utf8’)); } catch (e) { console.log(‘No report found’); } const summary ## OWASP dep-scan 可及性分析报告 **扫描完成时间:** ${new Date().toISOString()} **总计依赖项:** ${report.summary?.dependencies || ‘N/A’} **发现漏洞总数:** ${report.summary?.vulnerabilities?.total || 0} **其中经可及性分析后仍为高危/中危的数量:** ${(report.summary?.vulnerabilities?.critical || 0) (report.summary?.vulnerabilities?.high || 0) (report.summary?.vulnerabilities?.medium || 0)} *提示可及性分析已过滤掉“代码不可达”的漏洞以上为需关注的有效告警。* ; github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: summary });这个工作流的关键点使用--format sarif输出标准化格式并上传到GitHub的代码安全标签页与Dependabot等工具的报告集中管理。在PR评论中提供清晰的摘要特别强调“经可及性分析后”的漏洞数量让开发者直观感受到误报过滤的效果。if: always()确保即使扫描失败也会尝试上传结果便于排查。5.2 门禁策略与阈值设定单纯运行扫描还不够必须设定明确的通过/失败标准。失败策略我建议的基线是仅让“经可及性分析后仍判定为可达的CRITICAL或HIGH级别漏洞”导致构建失败。MEDIUM和LOW级别漏洞以及所有被标记为“不可达”的漏洞不应阻塞合并但需要在报告中展示。阈值管理可以在dep-scan命令后添加--fail_on参数进行控制需查看dep-scan版本是否支持。更常见的做法是在CI脚本中解析报告JSON自定义判断逻辑#!/bin/bash # 在CI脚本中解析报告 CRITICAL_COUNT$(jq ‘.summary.vulnerabilities.critical // 0’ depscan-report.json) HIGH_COUNT$(jq ‘.summary.vulnerabilities.high // 0’ depscan-report.json) # 只对可达的高危漏洞设卡 if [ $CRITICAL_COUNT -gt 0 ] || [ $HIGH_COUNT -gt 0 ]; then echo “发现高危漏洞构建失败” exit 1 else echo “未发现需立即处理的高危漏洞扫描通过。” exit 0 fi5.3 结果跟踪与漏洞生命周期管理扫描出的漏洞需要被跟踪直至修复。可及性分析的结果应该集成到你的漏洞管理平台或工单系统如Jira中。自动创建工单编写脚本解析depscan-report.json和reachable-audit.json对于状态为REACHABLE_YES的CRITICAL/HIGH漏洞自动在Jira等系统中创建安全工单并附上漏洞详情、受影响版本、以及从审计报告中提取的潜在调用路径。这为开发人员修复提供了最关键的信息。标记“已缓解”对于状态为REACHABLE_NO的漏洞虽然不创建紧急工单但可以在内部资产管理平台上将其标记为“已通过可及性分析确认风险缓解”并记录决策依据。这避免了后续重复审计。周期性重扫可及性分析的结果不是一劳永逸的。代码在不断变化今天不可达的漏洞可能因为明天新增的一个功能调用而变得可达。因此需要定期如每周对主干分支进行全量扫描监控漏洞可达性状态的变化。5.4 性能优化与缓存策略对于大型项目每次PR都进行完整的可及性分析可能会耗时较长几分钟到十几分钟。为了提升CI速度可以考虑以下优化缓存SBOMSBOM的生成相对稳定只有在依赖变更时才需要更新。可以将生成的SBOM文件缓存起来下次扫描时直接使用。增量分析一些高级的静态分析工具支持增量分析。如果dep-scan底层使用的分析器支持可以只分析上次提交后变更的代码文件但这需要更复杂的集成。分级流水线在PR触发时先运行一个快速的、不带可及性分析的依赖扫描作为初步检查。只有通过初步检查的代码再合并后触发一个更全面的、带可及性分析的夜间构建或定时构建。这平衡了反馈速度和扫描深度。6. 常见问题、局限性与进阶技巧即使配置得当在实际操作中你依然会遇到各种问题。这里我整理了一份从实战中踩坑总结出来的清单。6.1 常见问题排查表问题现象可能原因排查步骤与解决方案可及性分析未生效报告与基础扫描无异。1.--reachable参数未正确传递。2. 项目类型不支持或分析器识别失败。3. 漏洞数据源未提供函数签名信息。1. 检查命令拼写和日志确认[INFO] Reachability analysis enabled字样。2. 确认--type参数正确。查看审计报告如果为空或全是REACHABLE_UNKNOWN很可能是原因3。3. 在审计报告中找一个漏洞ID去OSV数据库如https://osv.dev/vulnerability/GO-2022-XXXX查看是否有affected[].ranges[].events[].introduced等更细粒度的信息。分析过程耗时过长或内存溢出。1. 项目代码量过大。2. 依赖关系过于复杂。3. 存在循环依赖或特殊代码模式。1. 增加REACHABLE_TIMEOUT环境变量先确认是否超时。2. 尝试增加CI运行器的内存资源。3. 使用REACHABLE_MAX_DEPTH限制搜索深度例如从10改为15。4. 考虑是否真的需要分析所有代码能否通过配置排除测试代码、文档目录等。审计报告显示大量ANALYSIS_FAILED。1. 静态分析器对某些语法/特性不支持。2. 项目构建或编译依赖缺失。1. 查看失败的具体错误信息定位到问题文件。2. 对于需要编译的语言如Java确保在扫描前先完成编译mvn compile因为分析器可能需要读取字节码或解析编译后的符号。明明代码调用了漏洞函数却被标记为REACHABLE_NO。1. 入口点配置不正确分析器未从正确的函数开始搜索。2. 调用路径中存在动态调用分析器无法解析。3. 漏洞函数签名与代码中实际使用的签名不匹配如重载方法。1. 检查entry_points_analyzed字段确认是否包含了你的应用真实入口。2. 手动检查代码确认调用是否是静态的、清晰的。如果是动态的则需要接受此局限或手动配置。3. 对比漏洞数据库中的函数签名和你代码中的调用签名看是否完全一致包名、类名、方法名、参数列表。6.2 可及性分析的局限性必须清醒认识到这不是银弹静态分析的固有缺陷无法处理动态行为、反射、条件分支的具体值、外部输入驱动的调用路径。这是最大的局限。漏洞数据质量依赖分析效果直接取决于上游漏洞数据库提供的函数签名精度。目前OSV生态在改善但历史漏洞数据仍不完善。分析精度与性能的权衡高精度的过程间分析开销巨大不适合CI。dep-scan采用的通常是快速但保守的分析可能会遗漏一些复杂的可达路径假阴性但能保证已报告的“不可达”是相对可靠的。语言和生态支持差异对Java、JavaScript/TypeScript、Python的支持相对成熟但对Go、Rust等语言或者一些冷门框架支持可能有限或处于实验阶段。6.3 进阶技巧与最佳实践与SAST工具联动可及性分析解决了“依赖是否被使用”的问题但漏洞被触发还需要特定的数据流。将dep-scan的可及性分析结果与SAST静态应用安全测试工具的数据流分析结合能进一步判断漏洞是否真的可被利用。例如一个可达的SQL注入漏洞函数如果其输入参数是硬编码的常量那么实际风险也很低。这需要安全团队建立更复杂的评估模型。建立“可接受不可达漏洞”清单对于一些广泛使用、历史悠久的组件可能会存在大量“不可达”的古老漏洞。与架构师和开发负责人共同评审将这些确认为“可接受风险”的漏洞加入白名单避免在报告中反复出现干扰视线。dep-scan支持通过--exclude参数或策略文件来排除特定漏洞。关注“依赖膨胀”问题可及性分析帮你发现了“未使用的依赖”。这是一个优化项目体积和减少攻击面的绝佳机会。定期审查那些因为“不可达”而被降级的漏洞所对应的依赖包评估是否可以直接从项目中移除该依赖。自定义漏洞源与函数签名对于内部组件或尚未被公共数据库收录的漏洞你可以为dep-scan提供自定义的漏洞数据源支持OSV格式。在里面你可以精确地定义受影响的范围和函数签名让内部漏洞也能享受可及性分析的红利。将可及性分析融入你的软件供应链安全流程不是一个一蹴而就的动作而是一个需要持续调优和与开发团队磨合的过程。从我的经验来看最大的收益往往不是工具本身而是在推行这个过程中安全团队和开发团队被迫更深入地一起审视代码、讨论风险上下文从而建立起的共同语言和信任。当你拿给开发者的漏洞报告从“有100个高危漏洞”变成“有5个你的代码确实会触发的关键漏洞”时修复的优先级和积极性会完全不同。这才是解决误报问题的深层价值。