安全研究员的自我修养
一篇零散的总结,记录了今年的安全研究感悟。
工作
这一年的工作重心跟着团队的方向调整,从业务安全转向了安全研究。说起安全研究,很多人想到的就是分析漏洞、挖漏洞,写利用。当然这是其中一个领域,安全总是和漏洞有着千丝万缕的联系,但漏洞只是一个结果,而研究本身则包含更多。
在企业里搞研究其实是有点尴尬的。本来安全团队在企业里就是不产生效益的边缘支撑角色,忙时救火,闲时背锅;其中安全研究又是边缘中的边缘,每天搞些稀奇古怪的玩意,也不知道有什么用。最重要的是,对于老板而言,没有很好的方式去量化研究性工作的价值。
安全研究体现成果分为两部分,一部分对外,主要包括刷漏洞/致谢,写技术分析文章提高影响力或者写PR文章提高曝光度;另一部分对内,但业务方向本身也有自己的局限性。优秀的设计不一定是新的,但一定是好的;优秀的研究不一定是好的,但一定是新的。正因为如此,在企业中做安全研究有点像是《进击的巨人》中的调查兵团,不仅吃力不讨好,而且经常死在半路上。毕竟大家面临的都是一片荒芜未知,无人之境,一条路走到黑还是及时止损?俗话说,行百里者半九十,掘井九仞犹为弃井,很可能放弃早了就错过了真正有价值的收获。
既然作为一项工作,就总得有产出吧?不管是 KPI 还是 OKR,总会需要一个能够量化结果的指标。优胜劣汰是社会不变的法则,这没什么好说的,只不过任何评价指标都是一把双刃剑,在指标的压力下很容易让人只关注结果。比如漏洞挖掘本身是寻找安全问题,但是指标关注的是漏洞数量而不是漏洞品相,就可能会导致很多人把软件 Bug 当做漏洞提交。一旦只追求结果,人就容易想方设法抄近路,在抄近路的过程中,人又容易迷失真相,做事的干劲也会逐渐消磨殆尽。
安全研究
虽然有很多槽可以吐,但做一行就得做好,因此时常也在想如何才能做好安全研究。鉴于研究二字本身就包含了不可预知的投入,所以目标是很重要的。没有人能告诉你这个方向能不能做,即便有也是站在他们自己的角度,可能并不适用于你。
套用学术界做研究的四阶段:
- 第一阶段,在导师指定的领域去做,不用考虑方向,只需要把事情做到极致;
- 第二阶段,自己找一些方向,然后在导师的建议下筛除一些,最后选定一个方向去做出研究成果;
- 第三阶段,自己去探索方向,自己去判断哪些可做,并且在自己选定的方向有研究成果,这一阶段完全独立完成,不需要导师的参与,因为比你了解这些领域的人不多了;
- 第四阶段,带着第一阶段的人,指引他们去做出自己的研究成果,也就是让自己成为导师。
不过社会和学校的一大不同是,很少有一个那么合适的导师,大部分人都是自学成才,这也是安全研究和学术研究的一大不同。漏洞本身是跟随着系统实现的变化而变化的,而实现又是偏工程化的领域,所以对于安全研究,我更赞同一句话:
Hack to learn, not learn to hack.
知识是无穷尽的,且不说最新的子领域论文一篇接一篇,教材、书籍、文档加起来也够消化一阵。曾经我就淌过这坑,之前在研究蓝牙安全的时候,硬是啃了一个星期的蓝牙核心协议文档,几千页的英文pdf,学到东西了吗?学到了,但是十分有限。从结果而言,还不如直接看 bluez/bluedroid 的代码或者 wireshark 抓包分析理解更深刻。这类的抉择有很多,比如研究 USB,是否需要先把 RFC 看完;想做 ARM 逆向,是否要先把 Cortex 的文档看完,……其实需要的时候再看具体章节即可。
保持克制
前面说到,在研究中找到合适的方向是很重要的一环,但这并不是一件简单的事。实际工作中随着研究的深入,会发现在某些关键点经常碰壁,以至于怀疑这个方向是不是没有搞头。如果正巧这时又有了别的新点子或者新想法,就会有强烈的冲动去换个方向。
这是人之常情,重要的是如何在这种情况下保持理智和专注。有人说真正有追求的人应该选择去挑战那些崇山峻岭,但高山不是一两天可以征服得下来的,甚至不是一两周、一两个月、一两年,……在这个过程中,不可避免地会陷入自我怀疑。要么怀疑自己的能力,要么怀疑自己的选择。
为了避免这种情况,就需要仔细再仔细地挑选目标。人们通常认为专注是对某件需要专注的事情说“好”,但事实并非如此。专注意味着对其他一百个好想法说“不”。
安全研究不是请客吃饭,不能东挖一铲子西挖一铲子。对于打工人而言,时间是尤其宝贵的。这一铲子下去,需要确保有足够的东西出来,要么是足够多的成果,要么是足够多的乐趣。下手之前做好长期坚持坐冷板凳的准备,下手之后就心无旁骛,全力以赴。
保持开放
对于安全研究人员而言,还有很重要的一点是保持开放,不要给自己设限。那位说这不是跟 ”保持克制“ 矛盾了吗?不错,确实是有点矛盾,或许作家协会可以考虑给我颁个矛盾文学奖。但矛盾是无所不在的,我们需要做的是在其间找到一个合适的平衡点。
举例来说,作为一个安全专家,女朋友电脑卡了让你看下,结果你说: “我是搞 Linux 安全的,Windows 我不懂,要不你重装个 CentOS”,—— 这显然不太合适。在研究中总会遇到一些全新的领域,其中某些会发展为未来的主流,有些会随着时代消逝,关键是保持开放的心态,不要把自己限制在狭隘的一个子领域中。
至于怎么选择,笔者认为可以参考自动化法则:
自动化法则: 如果某件事情手工做了三次,那么就应该写个脚本去进行自动化
也就是说,如果在研究中遇到在某个问题卡壳了三次,那么就应该花时间去深入探索。比如在研究 Linux 内核漏洞利用时经常遇到 NUMA node 的疑问,那么就值得花时间了解其原理和实现。这些点在当前上下文也许可以选择性忽略,但自己心里清楚,如果我从这里逃走,困难会在别的地方等着我。同时,让自己保持探索,也是避免思维陷入僵局好方法之一。
最后
2020年是忙碌的一年,曾经如饥似渴地学习各种知识,也曾经摆脱束缚放飞自我。不过最终还是摸索出了自己该走的路,关键在于权衡和取舍。一方面要保持克制,避免陷入知识的诅咒;另一方面要保持开放,避免自己固步自封。啰嗦了那么多,权当是作为自勉吧。