前言
本文主人公目前是微软的一名漏洞研究员,他讲述了将挖洞当作爱好和当作职业的笑与泪,以及一些建议忠告。
我写的通常都是自己挖到的有意思的浏览器 bug,希望能借读者一臂之力,应用这些经验或思路。不过这次我写的是将挖洞作为业余爱好与从事漏洞研究工作的不同之处。下面我将和你分享我的遗憾、惊喜和建议。虽然仅是一家之言,很可能无法代表你的观点。不过我仍然希望你能从中获得一些启发。
背景介绍
2015 年年初,我获得了人生中的第一份官方漏洞奖励,也是从那时开始,我踏入了猎洞这一行。我挖的第一个漏洞是位于 O365 中的 XSS 漏洞。之后,我在 Firefox 挖到了第一个有效的浏览器漏洞。从此之后,我基本上是在查找浏览器漏洞。
1、200 份很多已经买不到的绝版电子书 2、30G 安全大厂内部的视频资料 3、100 份 src 文档 4、常见安全面试题 5、ctf 大赛经典题目解析 6、全套工具包 7、应急响应笔记 8、网络安全学习路线
2020 年的后知后觉
我犯的最大一个错误是认为,由于自己几乎只专注于浏览器漏洞,对信息安全的热爱无法转换成安全职业。
从某种程度上讲,浏览器漏洞研究是一个细分领域,似乎我认识的多数漏洞猎人早期都是从 web 应用安全开始,而且通常会一直专注于这个领域,而我却对浏览器情有独钟并一头扎下去。这一事实让我的错误假设似乎成了板上钉钉的事。
但实际上正是因为浏览器安全领域的细分程度如此之高,所以符合主流浏览器厂商提出的浏览器安全职位要求的求职者并不多。如今我进入微软工作已超过一年,梦想照进现实,我们来聊聊本来可以如何更好地获得这个职位。
我从未想到自己会找到和浏览器安全相关的职位,于是忽视了企业为保护浏览器安全所做的一些事情。
我挖洞的主要方式是尽可能地阅读与浏览器及其安全相关的资料,之后手动测试自己的想法:虽然这种方法很耗时间,但我发现自己乐在其中,那种感觉和冥想差不多。大不了就当自己了解了一个新的 Web API,但如果能找到一个有意思的安全漏洞就是双赢的结果了,而付出的成本不过是时间。
换句话说,我不仅从未真正进入 fuzzing 阶段,还对这种方法有了一种错误的看法,以为 fuzzing 就像是挖币,认为自己只需要运行一个 fuzzer 并滥用 CPU,等待有价值的崩溃发生即可。
我心中一直有个小人说这是浏览器安全的下一个阶段,但可能我掉入了固有方法的舒适区。
一言以蔽之:找到你的细分领域,就是让你兴奋而且能坚持下去的东西。做自己乐于做的事情你总会赢。
要想着修复漏洞
作为猎手,我所关心的就是找到有效的安全漏洞,提交,也可能还会为此进行讨论,之后继续去寻找下一个漏洞。这种做法让我的技能集出现了缺口,也错过了很多了解漏洞产生原理的学习机会。如果你也想尽快提交漏洞以免和别人重复,那么最起码应该花点时间研究下补丁。
我曾以为,'为啥我要免费给别人做事?'是吧?事实并非如此。这种思维为何会降低效率的原因如下:
1、了解了有问题部分的代码,假以时日你最终会了解到:比如 Chromium 的代码库以及其中的运行方式,它会让你挖洞越挖越顺;
2、一旦发现了漏洞根因,你就可以查找这种存在漏洞代码的其它实例,最后,一个漏洞可能就变成了多个漏洞;
3、有了这种洞察力,你最终可能发现稍加修改,漏洞的严重程度就要比最初想的要更高;
4、你也可以付费为 Chrome 等编写补丁,从而增加可获得的漏洞赏金。
在挖洞过程中,我做对的一件事就是参与漏洞报告和推特讨论。我阅读每个评论而且这些讨论中往往暗藏宝石。我也从来不遮掩对漏洞评估的反对意见,因为手握证明,我也会接收拒绝并愉快地继续前进。作为员工了解了后台的问题处理方式后,我发现很多事情都是合理的。之前不了解这一切时,我对结果是不接受的。
现在我的工作不仅要提交安全漏洞,而且还要和开发人员一起修复漏洞。
有时漏洞易于修复但并非一直如此。在提交漏洞时我必须额外注意,因为不仅要确保复现用例是最小化的,而且还要附上根因分析并给出修复建议。有时我会通过漏洞奖励计划提交漏洞,有时我会补充报告,便于开发人员能快速理解问题。
我们收到的大多数漏洞并非真正的漏洞。多数是重复提交的、设计问题以及无法复现或无效。很多时候漏洞描述并不直接,因此所有相关人员会一起讨论交流。这些会话中包含很多有意思的洞见,我总是很期待阅读这些邮件内容,如上所述,这些讨论内容中暗藏着宝石。
我经常会解释为何某些是漏洞某些不是,虽然这和此前的工作大不相同但仍然是类似的。因此,很明显之前报告的漏洞以及阅读评论的做法使我能够应付工作。
漏洞是不可避免的。随着 Edge 浏览器的发展,会出现新的特性、变更及改进,引入的代码自然会越来越多,产生的漏洞数量也会越来越多。更具体来说,漏洞是由如下方面引起的(适用于开发人员和安全团队):
- 经验不足。
没有人天生就理解庞大的 Edge 代码库的原理。理解需要时间,而犯错就是我们学习的方式。
不要假定最糟糕的情况。在保护安全方面,适度水平的焦虑是有帮助的;总是把假定的最糟糕情况作为潜在担忧并告知安全团队。
- 缺乏安全教育。
我在计算机科学本科学习期间,学校并未开设安全课程。虽然课堂上可能会提到最佳编程实践,但它并非重点且远远不够,因此自学一些常见漏洞起着重要作用。


