2002年,黑客一个叫“Weld Pond”的漏洞家伙在Black Hat大会上演示了如何用一台笔记本电脑,在几分钟内让思科路由器彻底瘫痪。发掘他用的术电书不是什么零日漏洞,而是黑客一个已经公开了三个月的BGP协议实现缺陷。厂商补丁早就发了,漏洞但全球仍有超过十万台设备没打。发掘这件事说明了一个很朴素的术电书道理:漏洞挖掘的核心不在于你掌握了多少别人不知道的秘密,而在于你是黑客否愿意去看那些别人懒得看的地方。
《黑客之道漏洞发掘的漏洞艺术》这本书,英文原名叫《The 发掘Art of Software Security Assessment》,两位作者Mark Dowd和Justin Schuh都是术电书实打实在安全一线干了十几年的人。Dowd在IBM做过X-Force的黑客研究员,后来去了谷歌,漏洞Schuh在NSA待过。发掘这俩人写书不是靠拼凑文档,而是把自己踩过的坑一个个摊开给你看。书厚得离谱,一千多页,但每一章都像是他们在你旁边坐着,指着一段代码说:“你瞧这儿,正常人觉得没问题,但你换个角度想——”
书里有个细节我印象很深。讲整数溢出的时候,作者没有一上来就甩概念,而是先给了一段看似无害的代码:void *buf = malloc(size * sizeof(struct item));。然后他问你,如果size是一个用户可控的整数,而sizeof(struct item)是16,当size等于0x10000000的时候,乘法结果会怎样?在32位系统上,结果会回绕成0,malloc返回一个极小的缓冲区,后面往里面写数据就是堆溢出。这种例子在书里到处都是,每一个都来自真实的CVE。不是编出来的教学案例,是有人真的因为这个丢了数据、丢了钱、丢了工作。
很多人以为漏洞挖掘需要天赋,需要那种一眼看穿代码本质的直觉。Dowd在书里明确反驳了这一点。他说自己刚入行的时候,看什么都觉得安全,后来强迫自己养成一个习惯:每次看到memcpy,先不看上下文,直接问三个问题——源缓冲区多大?目标缓冲区多大?长度参数谁控制的?这三个问题问下来,大部分低级漏洞就现形了。剩下的时间,才是用来对付那些真正狡猾的逻辑漏洞。这种“笨办法”贯穿全书,没有什么玄学。
书的后半部分转向了Web和协议层。讲HTTP请求走私那一段,作者花了整整四十页,从RFC文档的模糊地带讲到不同服务器对Content-Length和Transfer-Encoding的处理差异。读的时候你会觉得他啰嗦,但合上书一想,正是这些啰嗦的细节构成了攻击面。一个前端代理认为请求在Content-Length处结束,后端服务器却按Transfer-Encoding解析,中间那段“灰色数据”就成了走私通道。2019年那波HTTP/2降级攻击,本质上还是同一类问题,只是换了层皮。
这本书不适合想找“速成秘籍”的人。它没有一键getshell的脚本,也没有“三步拿下域控”的流程图。它更像是一本代码审阅的田野调查笔记,告诉你哪里可能有坑,为什么会有坑,以及怎么用最小的代价验证这个坑能不能踩。读完之后你未必能立刻挖到CVE,但至少再看代码的时候,眼睛会不自觉地往那些犄角旮旯的地方瞟。这大概就是“艺术”两个字的真正含义——不是炫技,是耐心和视角。