3. 漏洞发现阶段:内部发现、外部发现、自动化扫描、人工渗透测试

漏洞发现,说白了就是「找茬」。但找茬也得讲规矩。我见过不少团队,漏洞发现全靠运气——谁今天心情好扫一把,或者哪个研究员心血来潮报一个。这不行。合规流程下,漏洞发现必须是有序的、可追溯的、覆盖全面的。

我个人习惯把漏洞发现分成四个维度:内部发现、外部发现、自动化扫描、人工渗透测试。它们不是互斥的,而是互补的。你想想看,一个完整的漏洞发现体系,应该像一张网,而不是一根针。

3.1 内部发现:自己人先动手

内部发现,就是组织内部人员主动发现的漏洞。这包括开发人员、测试人员、运维人员,甚至产品经理。嗯,别小看产品经理,他们有时候能发现逻辑漏洞。

我在项目中遇到过一件事:一个开发同学在写代码时,发现了一个 SQL 注入的隐患。他随手改了,但没记录。后来合规审计时,我们拿不出任何证据证明这个漏洞被「发现」过。你说冤不冤?

所以,内部发现必须要有流程支撑:

  • 发现即记录:任何人在任何环节发现疑似漏洞,必须第一时间录入漏洞管理系统。
  • 分级上报:低危漏洞走常规流程,高危/严重漏洞需要 24 小时内通知安全负责人。
  • 奖励机制:内部发现也要有激励。我建议设立「内部挖洞奖」,哪怕是一个小小的 XSS,也值得鼓励。
我的小技巧:内部发现的漏洞,建议在系统中标记为「内部来源」。这样在统计时,可以区分是主动发现还是被动暴露。合规审计时,这个数据很有说服力。

3.2 外部发现:来自第三方的「惊喜」

外部发现,指的是来自组织外部的漏洞报告。这包括:

  • 安全研究员:通过漏洞赏金计划(Bug Bounty)提交的漏洞。
  • 客户/用户:用户在使用产品时发现的安全问题。
  • 公开渠道:如 GitHub Issues、安全社区、暗网论坛等。
  • 监管通报:监管部门或行业组织通报的漏洞。

外部发现有个特点:你控制不了来源。我曾经遇到一个案例,一个研究员在 Twitter 上公开了一个 0day,我们团队是看到推文才知道的。那叫一个被动。

所以,外部发现的核心是「响应速度」和「渠道管理」:

渠道类型 响应时限 处理流程
漏洞赏金平台 48 小时内确认 平台自动通知 → 安全团队评估 → 修复 → 奖励发放
客户报告 24 小时内回复 客服转安全团队 → 确认漏洞 → 修复 → 客户告知
公开渠道 4 小时内响应 监控告警 → 紧急评估 → 启动应急响应
监管通报 按监管要求 合规部门牵头 → 安全团队配合 → 正式回复
注意:外部发现的漏洞,尤其是通过公开渠道发现的,一定要先确认漏洞是否真实存在。我曾经见过一个乌龙:有人在论坛上发了一个「严重漏洞」,结果是我们一个废弃接口的 404 页面。白白浪费了应急资源。

3.3 自动化扫描:机器替你干活

自动化扫描,是漏洞发现的主力军。说白了,就是让工具替你跑一遍。常见的扫描类型包括:

  • DAST(动态应用安全测试):黑盒扫描,模拟攻击者行为。
  • SAST(静态应用安全测试):白盒扫描,分析源代码。
  • SCA(软件组成分析):检查第三方组件和依赖库的已知漏洞。
  • IAST(交互式应用安全测试):结合运行时数据,精度更高。

自动化扫描的好处是「快」,坏处是「吵」。我见过一个团队,每天跑一次 DAST,结果告警邮件堆了上千条,没人看。这跟没扫有什么区别?

我的建议是:

  1. 定频扫描:核心系统每天一次,非核心系统每周一次。
  2. 结果去重:同一个漏洞反复报,只保留一条。
  3. 误报过滤:建立误报库,自动忽略已知误报。
  4. 分级推送:高危漏洞直接推送到负责人手机,低危漏洞走邮件周报。

一个实用的扫描策略:

# 扫描频率配置示例
# 核心业务系统
scan_frequency:
  core:
    daist: daily
    saist: on_commit
    sca: weekly
  non_core:
    daist: weekly
    saist: on_release
    sca: monthly

# 告警规则
alert_rules:
  critical: push_notification + email
  high: email + slack
  medium: weekly_report
  low: monthly_report

3.4 人工渗透测试:机器做不到的事

自动化扫描能发现「已知的已知」,但「已知的未知」和「未知的未知」怎么办?这就需要人工渗透测试了。

人工渗透测试的价值在于:

  • 逻辑漏洞:比如越权、业务逻辑绕过,机器很难识别。
  • 组合攻击:多个低危漏洞组合成高危攻击链。
  • 0day 挖掘:自动化扫描依赖已知规则,人工可以探索未知。

我记得有一次,自动化扫描报告说系统「安全」。但人工渗透测试时,我们发现了一个「密码重置链接未失效」的问题——攻击者可以无限次使用同一个链接重置密码。这种漏洞,扫描器根本扫不出来。

人工渗透测试的流程,我建议这样走:

  1. 范围确认:明确测试目标、测试深度、禁止操作。
  2. 信息收集:子域名、API 接口、技术栈等。
  3. 漏洞挖掘:手动测试 + 工具辅助。
  4. 漏洞验证:确认漏洞可复现,排除误报。
  5. 报告输出:包含漏洞描述、复现步骤、修复建议。
避坑指南:我曾经遇到过,渗透测试团队在测试时不小心删了生产数据库。从那以后,我要求所有人工渗透测试必须使用「只读账号」,并且测试前要签「免责协议」。别嫌麻烦,这是保护双方。

3.5 四种发现方式的协同

四种方式不是孤立的。我画了一张图,帮你理解它们之间的关系:

漏洞发现方式协同关系图 漏洞发现方式协同关系 内部发现 外部发现 自动化扫描 人工渗透测试 漏洞库汇聚 协同说明 • 内部发现 + 外部发现: 覆盖所有来源 • 自动化扫描 + 人工渗透: 广度与深度结合 • 所有漏洞汇聚到统一库: 避免重复、遗漏 • 汇聚后统一评估、修复 • 形成闭环管理

你看,内部发现和外部发现负责「来源覆盖」,自动化扫描和人工渗透负责「深度覆盖」。所有漏洞最终汇聚到统一的漏洞库,再进行评估、修复、验证。这样才不会漏掉任何一个。

嗯,这里要注意:汇聚不是简单的合并。我建议在漏洞库里给每个漏洞打上「发现方式」的标签。这样后续分析时,你可以知道哪种方式最有效,从而优化资源配置。

总结一下我的经验:

  • 内部发现:靠制度,靠激励,别让好人吃亏。
  • 外部发现:靠渠道,靠速度,别让报告者等太久。
  • 自动化扫描:靠频率,靠去重,别让告警变噪音。
  • 人工渗透:靠经验,靠流程,别让测试变事故。