前言
说到安全就不能不说漏洞,而说到漏洞就不可避免地会涉及到三个核心领域:
漏洞分析、漏洞利用、漏洞挖掘
从个人的经验来看,这三者尽管通常水乳交融、相互依赖,但难度和侧重点不尽相同。本文就这三者分别谈谈自己的经验和想法,并结合网络安全行业的职业发展路径进行详细解析。
漏洞分析
漏洞分析相对基础,通常公开的漏洞报告中会有一两句话描述漏洞的成因。自己拉取代码下来阅读,也能了解个大概。对于一些自己发现的 Bug,从崩溃日志中一般也能比较轻松地进行复现和调试。尽管有的 Bug 排查起来相对繁琐,但总归是可以一步步减少范围锁定最终目标的。因此,网上对于漏洞分析的文章很多,一方面分析起来有迹可循,另一方面分析的漏洞也不一定是自己的'原创'漏洞,素材来源更加广泛。
漏洞分析虽然基础,却是每个安全研究人员的必经之路。就像练武中的扎马步、站梅花桩一样,是日积月累的基本功。之前研究内核时有段时间热衷于写漏洞分析的文章,后来随着日渐熟练,写文章记录的速度已经远远跟不上分析的进度,所以现在往往懒得动笔了。
基本功必不可少,但扎马步扎得再稳也不表示你能独步武林。有大佬曾经说过,如果他想的话,可以一天写好几篇分析文章还不带重样的。毕竟,漏洞分析的目的是为了学习、吸收、转化,以史为鉴,最终形成自己独到的理解。
在实际操作中,漏洞分析通常分为静态分析和动态分析。静态分析主要关注源代码或二进制文件,不运行程序即可发现潜在问题,如缓冲区溢出风险、硬编码密钥等。动态分析则通过运行程序并监控其行为,使用调试器(如 GDB、OllyDbg)或性能分析工具来捕捉运行时错误。结合两者,可以更全面地定位问题根源。
漏洞利用
漏洞利用就相对复杂一点,尤其是对于二进制漏洞,成功的利用需要精巧的内存布局,因此需要对程序涉及到的数据结构要相当的了解。而且并不是所有漏洞都能转换为有效利用的,一般比较容易编写利用的漏洞,我们称之为品相好。对于品相不好的漏洞,我更喜欢将其称之为 Bug。当然也有人认为 Bug 至少造成了程序崩溃,所以可以算一个 DoS(拒绝服务)漏洞。
当然漏洞能否利用其实也是和人有关。对于复杂的系统,你认为无法利用的漏洞,大佬就能以一种你没想到的方式利用成功。比如安卓 CVE-2019-2025(水滴)漏洞,属于 Binder 中的一个条件竞争,竞争窗口只有几条汇编指令。漏洞品相相当不好,连 CVSS 给出的可利用分数 (Exploitability Score) 也只有 1.8 分,但安全团队也通过玩弄调度器进行稳定利用提权了。
因此,关于漏洞利用的文章也就少了很多。一方面处于负责任披露安全问题的考虑,安全研究人员不会给出完整的利用细节,以免脚本小子滥用;另一方面对于公开的利用,你也总不能跟着写一篇文章灌水,毕竟利用思路很多时候是因人而异的,过于雷同就难免有炒冷饭的嫌疑,除非有一些独到的思考补充,或者有新的利用思路。
很多时候漏洞利用的文章看着看着就变成了漏洞利用分析的文章,这也说明了漏洞利用难度颇高,能独立写出原创利用并进行分享的人不多。就我的感觉而言,漏洞利用更像是另一种形式的软件开发,首先通过漏洞构造原语,然后通过原语实现最终的利用程序。
在二进制利用中,常见的技术包括 Shellcode 注入、ROP (Return-Oriented Programming) 链构建、堆风水 (Heap Feng Shui) 以及绕过 ASLR、DEP/NX 等现代防护机制。Web 利用则更多关注逻辑漏洞、SQL 注入、XSS 反射/存储型攻击以及反序列化漏洞。掌握这些底层原理是编写高效 Exploit 的前提。
漏洞挖掘
漏洞挖掘可以说是安全研究人员向往的高地之一,不管你分析了多少漏洞,写了多少利用,如果你没有自己挖掘出过原创的漏洞,那你的安全研究生涯就是不完整的。但是漏洞挖掘这事儿并不是确定性的。漏洞分析只要有漏洞肯定能分析清楚,只不过是时间问题;漏洞利用只要不是明显的无法利用,那至少也存在利用成功的可能性。
漏洞挖掘则不然,即便你盯着某个应用使劲挖,也不能保证有结果,说不定对方根本就没有能触发的漏洞。都说世上没有绝对安全的系统,但是相对安全的系统一抓一大把,至少在出问题之前,你是不知道的。
漏洞挖掘的方法论主要包括以下几种:
- 模糊测试 (Fuzzing):向目标输入大量随机或变异的数据,观察程序是否崩溃或产生异常行为。自动化 Fuzzing 工具如 AFL、LibFuzzer 是常用手段。
- 代码审计:人工或借助工具审查源代码,寻找逻辑缺陷或编码规范违规。这对于闭源软件不可行,但对开源项目至关重要。
- 差分测试 (Differential Testing):对比不同版本或不同实现的程序对同一输入的处理结果,差异点往往隐藏着 Bug。
- 语义分析:基于程序执行路径的分析,识别违反安全策略的行为模式。
提升方法
想要提升漏洞挖掘能力,需要系统化的训练和积累。
- 信息收集:尽可能多地收集目标信息(主域名、IP 段、搜索引擎、GitHub 仓库等)。信息量越大,攻击面暴露的可能性越高。
- 信息扩展:收集好信息后,对信息进行扩展,增加信息收集的量。可以使用 SubDomain 工具批量收集厂商域名信息,域名对应 IP,数据多了之后,就可以拿来分析域名的真实地址、以及潜在的 IP 段。


