安全研究者的自我修养

在上篇文章《推荐今年 C3 黑客大会上的几个议题》中提到 ”Attacking Chrome IPC“ 这个议题,我觉得该议题最大的亮点是在前半场,作者 nedwill 是之前在 hack2win 大赛上因攻破 Chrome 浏览器而一战成名,他讲了如何训练漏洞研究能力的过程,讲述自己这几年在漏洞研究上的历程和心得,很励志,其建议也非常具有可操作性,值得效仿学习。我反复看了多遍,对其作了一些总结和补充。

1、刻意练习 10000 小时

这份“鸡汤”道理,想必大家都懂,就不解释了,不懂的自行百度,或者去读读《异类》这本经典书籍。

作者建议以月为单位来制定研究目标,他曾连续花了 6 个月的时间来研究 Chrome Sandbox,但最终一无所获。

所以,有时坚持了不一定能达到目标,但不坚持,就更没戏了。

2、训练挖洞的双技能

(1)看洞:哪里看?历史漏洞的 git log、bug 报告、代码质量报告等等

(2)识洞:就是肉眼看代码找漏洞,即代码审计,难点也就是在这上面,训练方法继续往下看

3、代码审计训练

(1)根据自己目标定位,寻找相应的历史漏洞案例进行学习,比如要搞 chrome 就找 chrome 的历史漏洞

(2)掌握漏洞所在的模块或子系统,但不看完整的漏洞细节描述,尝试在漏洞版本中找出对应的漏洞

(3)如果(2)中未能找出漏洞,就去看漏洞细节描述,对比自己的审计过程,看遗漏了哪一步骤

(4)不断重复上述训练,直至相信:挖洞只是体力消耗,而非能力问题

这第 4 点说得,非常励志,因为挖洞挖久了,有时真的容易怀疑自己的能力,目标难度越大,越容易打击人。

作者第一次训练的漏洞是 j00ru(Project Zero 成员)的 IDA 漏洞:

SECURE 2014 slide deck and Hex-Rays IDA Pro advisories published | j00ru//vx tech blog

2014 年的文章了

4、3~5 年的训练计划

1~2 年:做做 CTF 或 WarGames 题目,网上有很多 CTF writeup 可以参考学习

2~3 年:简单点的目标,就是找相对容易挖的产品

3~5 年:困难点的目标

目标的难易程度可以直接参考相应的产品的漏洞奖励计划或私有市场的价格,挑选出一份目标清单,按难易程度排序,逐一去实现它。

5、Fuzzing 训练

作者代码审计 2 年后,才开始尝试 Fuzzer 开发。

(1)拿已公开的历史漏洞问自己:如何写 fuzzer 挖掘到此漏洞?

(2)如果自己不知道此漏洞,那又能够挖掘到呢?

(3)不断重复训练并改进 fuzzer,相信会有更多漏洞被意外发现

6、努力往往比运气和天赋更重要

虽然挖洞也需要一定运气和天赋,但多数你认为的挖洞天才,其实只不过是花了比你多 100 倍,甚至更多的时间在这项技术研究上而已

7、进入研究者团队或社区,互相学习

国外的交流氛围会比国内的更好一些,也更愿意分享。

很多时候自己的交流圈,大多是一些熟识的同行,或者同事,一般可交流的人还是比较少的。

经常在网上看到不少人会问,如何认识 xx 大牛、黑客,但其实很多时候却是:

努力提高自己的专业能力,圈子最终会吸纳你进去认识更多圈内人。

8、建立自己的漏洞信息来源

RSS 订阅无疑是自己最好的方式,这个需要依赖平时自己去不断收集订阅。

很多漏洞相关的博文,往往曝露出某些软件新的攻击面,抢占先机就显得尤为重要,比如当年 Android stagefirght mp4 漏洞、word 公式编辑器、adobe 图片转换器等等,如果能及时关注并尝试去挖掘,往往可以收获不少漏洞的。

9、收集和学习开源的漏洞挖掘工具

比如 afl、honggfuzz、libfuzzer 等很多优秀的漏洞挖掘工具,都是值得好好阅读代码,学习其中的 fuzzing 思路,可以更好地应用到未来的漏洞挖掘研究上。

10、很多不愿搞研究工作的挖洞人,只不过是为了权衡利弊

在《从 0 到 1:开启商业与未来的秘密》一书中有一章叫做“秘密”,漏洞研究可以当作挖掘秘密,为什么人们不探索秘密呢?书中提到4种原因,我觉得同样适用于漏洞研究领域:

(1) 渐进主义 :把目标定得低一些,更容易取得好成绩;

(2) 风险规避 :人们害怕秘密是因为怕犯错,除此之外,可能也担心 KPI 没法完成,又或者挖洞拿到的奖金又该如何跟公司“分赃”呢?

(3) 自满 :很多时候,某些人可以坐享其成,又何必自己去挖掘秘密;国内研究氛围又喜欢搞营销吹牛逼,牛逼吹多了吹大了,有时连自己都信了;

(4) 扁平化 :任何一个拥有雄心壮志的人,在涉及某一研究领域之前都会问自己一个问题:如果有可能挖掘到漏洞,难道全球人才库中更加聪明、更加有技术能力的人还没有发现吗?这种怀疑的声音阻止了不少人去探索秘密,从事研究工作,因为身处的世界似乎大到任何个人都无法做出独特的贡献。

11、工具与方法论沉淀

虽说代码审计是项必备技能,但终究是项体力活。

有些漏洞(比如逻辑漏洞)可能就需要人工审计,但也有不少漏洞是可以自动化 Fuzzing,一些能自动化或半自动化实现的,尽量写程序自动化。

因为,纯人工审计终究熬不过年纪,熬不过团队人员的离散变迁,熬不过互联网的快速发展……

比如,2012 年刚开始写《漏洞战争》时,单身一人,从早上 8 点多起床吃饭,然后开始调代码、看代码,一直奋战到晚上 12 点,身体无压力。近 7 年过去了,现在要是这么折腾,身体就要散架了……

比如,团队里的人分工做不同领域的代码审计,若无工具和方法论沉淀,那么有人走的话,此人对应的领域可能就无法持续产出;若有新人加入,代码审计的技能又不好传承,很多得自己重头来。所以,一直觉得,好的团队应该是,即使人员离散变迁,依然能够独立运作、持续产出的。

比如,Linux 内核在 2018 年净增 87 万行代码,很多类似复杂庞大的项目,看代码有时看都看不过来,一般都是针对性地挑模块作代码审计。

比如,Fuzzer 开发里面就有很多共用功能是可以直接做成框架沉淀下来,文件变异、崩溃监控、样本去重精简等等,很多时候有个新的攻击面需要测试,就可以直接在框架的基础上写 fuzzer,将会高效很多。下文提到的一个 IE 漏洞挖掘案例就是基于这思路挖到的。

我曾经想开发两个漏洞挖掘系统,一个二进制,一个 Web,名字都想好了,合称” 冰弓玄箭 “,但业余一直都没什么时间开发,仅写了个界面,希望 2019 年能够完成:

”冰弓“的 Logo 直接用的是“破甲弓”,感觉很酷……

再说说方法论,这词虽有点虚,但其实本质上就是一种技术方法的总结而已。

比如,渗透测试的时候,总有些人每次都能搞到 RCE,无论啥网站,完全摆脱“随机挖洞”的命运。多数情况下,他们都会有一套自己测试方法,或者将一些经验转换成工具,测试时就拿自己的工具和以往总结的方法论开搞。

比如,STRIDE 威胁建模本身就是一套方法论,一套简单的风险助记符,当然我这里不是说安全研究要用它,只是举个方法论的例子,它也没有那么万能。

写这么多,总结起来就一句话:多总结,多沉淀!

12、漏洞研究风向标:安全公告

如果大家有关注四大厂商(Google、Microsoft、Apple、Adobe)的安全公告的话,会发现有段时间会出现很多类似漏洞的公告,出现一个新的攻击面之后,一帮研究人员就蜂捅而上狂刷一波。

这种情况一向是先下手为强,而上文提到的工具和方法论就更显得尤为重要了,否则最后都只能捡剩的。

比如本周 Microsoft 安全公告出来后,我仔细分析了下,然后下班回家写了个 Fuzzer,挂着跑了一天,出来个Crash,再用几分钟成功构造出 PoC,实现 IE 浏览器的远程代码执行,可见也是个品相极佳的神洞:

但不幸的是,我打了 1 月的补丁后,发现修复了,成功“撞洞”,真的是欲哭无泪……

但至少证明,通过安全公告寻找新的攻击面,然后挖掘一些类似漏洞,一直是一种高效的漏洞研究方式。

13、老一辈研究者都去哪儿了?

最近腾讯 AILab 张潼离职的事传得很火,还有之前各大厂聘请的 AI 科学家陆续辞职,回归学术界,很多人因此唱起科学家之于科技公司的无用论,主要有以下几点原因:

1、 研究成果无法落地为产品 :做安全研究也是如此,很多事情是无法落地的,圈内很多研究团队都是拿漏洞来打比赛赚影响力,真正能实现为公司营利的(打比赛赚奖金的忽略不计,因为那些都不够给研究者们的工资),我只知道有 1 个研究团队/实验室今年营利了。

2、 长期无产出,KPI压力大 :研究了很长时间,最后仍一无所获,那 KPI 咋办、PPT 怎么写、晋级怎么答辩。安全行业有句老话来形容安全研究工作,叫“三年不开锅,开锅吃三年”,但多数个人和企业都等不到三年。之前同事说王小云为何能破解出 MD5,是因为她在学校里很长时间没搞出东西的时候,领导没找她麻烦,没有 KPI 压力,以致能够长期专注于此。具体原因我不确定,但学术界自然是没有企业有这般 KPI 压力。

3、 业务数据不共享 :业务部门的产品数据基本不太可能共享给实验室作研究的,一般都是实验室以 SDK 的形式提供给业务用,数据由业务自主控制。这种情况对于安全研究的影响相对较少一些。

头两点是多数安全研究者的困境,也跟圈内同行讨论过,下面聊聊这帮老一代“知青”最后都去哪儿了?这里我主要总结一些圈内人的应对方法(其实多数都是转型),具体不作点评,总结为主,也欢迎私信讨论(新注册的公众号已不允许留言)。

1、 坚持研究 :这帮人主要还是那些研究能力较强的,且有一定研究成果的人,围观下各大实验室就知道个大概,不多说;

2、 转型安全产品开发与运营 :有产品就能解决落地问题,帮助企业解决实际问题,有不少人走这条道,去做威胁情报系统、漏洞扫描器、WAF、云安全产品等等;

3、 转型业务安全 :跟研究工作差异较大,因为业务安全的主要问题很多时候并非漏洞,而是跟业务产品相关的黑灰产对抗等等;

4、 自由研究者 :国外很多此类研究者,靠拿漏洞赏金过活,俗称“赏金猎人”,国内相对少一些,也有一些国内自由研究者后来又进企业做研究的,这里讲的几种转型都可以来回转换,有些人就干过。

5、 创业 :这里包括安全行业内的创业,也包括那些开淘宝店、奶茶店、服装生意、卖水果的……

14、个人终究干不过团队

有时想搞的研究太多了,但发现一个人根本搞不过来,需要多人协作才可能完成。但需要多人在研究领域上有交集,否则拉在一块也是各搞各的。

前篇第7点讲到“进入研究者团队或社区,互相学习”,也是一大影响因素,互相学习也是一种提高效率和产出的方式。

算了,不多说了!

后话

这次真的结束了,没有续篇了。

思考了很多,总结了很多,有些也是写了删,删了写。

安全研究领域一直也没人写过这些,出来唠叨几句,也欢迎大家私信讨论。

最后奉一首酒桌上的《苦行僧》结束本话题,听过这首歌很多个版本,包括原唱,但终究还是觉得视频里这位老哥唱得更具江湖气、更具情感、更具感染力……旁边一老哥听着听着都偷偷抹泪了!

之所以点这首歌,是因为: 每一个研究者都是独立自行的苦行僧!

3 个赞