随着高考的临近,专业选择的问题被提起的越来越多。最近也是校招实习的季节,笔者面试了不少同学,多多少少有一些感触,于是想聊一聊网络安全入门与进阶的途径。在最后也聊了一些网络安全专业选择的问题,需要的同学可以直接跳到文末。
黑客文化
聊网络安全离不开黑客文化,黑客文化的起源可以追溯到20世纪60年代末至70年代初的美国麻省理工学院。在那里,一群极具创造力的学生开始探索如何通过编程和技术创新来扩展和改进计算机系统的功能。这些早期的黑客如 Stewart Nelson 和 Richard Greenblatt,以及后来的Richard Stallman,被认为是黑客文化的先驱。他们的工作不仅仅是为了个人利益,而是出于对技术的热爱和对知识共享的承诺。
随着时间的推移,黑客文化开始分化。一方面,有些人继续遵循早期黑客的理念,专注于开放源代码和自由软件运动,目标是创造和分享免费可用且可以自由修改的软件,如斯托曼在1983年发起的GNU项目,以及1991年Linus Torvalds 创建的Linux内核。
另一方面,随着互联网的普及和计算机技术的发展,一些黑客开始利用他们的技能进行非法活动,如入侵网络系统和传播恶意软件。这导致了公众对“黑客”一词的负面印象,尽管这与早期黑客的理念相去甚远。这种黑客行为通常被称为“黑帽黑客”(black hat),而那些依然坚持技术创新和正面价值的黑客则被称为“白帽黑客”(white hat)。
现代黑客文化是多元化的,包括了从网络安全专家到政治活动家的各种人物。例如, Anonymous 这样的集体利用黑客技术进行政治抗议和网络行动主义。
总的来说,hacking,即探索和创造的精神,始终是网络安全的核心。
入门
如果要给网络安全下一个定义的话,笔者觉得网络安全 = 计算机科学 + 软件工程 + hacking。计算机科学是基石,它研究计算机系统的原理、算法和数据结构,为理解网络安全的基本原理提供了必要的知识。软件工程是应用层面的上层建筑,负责设计、开发和维护网络系统和应用程序。而最后hacking的精神,则是打开网络安全大门的钥匙。
具体到网络安全的入门,也是需要三者兼得。首先,计算机科学是网络安全的知识基础。例如要SQL注入漏洞,在清晰知道SQL的编译流程的前提下,是很容易理解的,也可以轻松扩展到模板注入、命令注入等场景。更深入一步,就容易理解漏洞本质是控制流和数据流的混杂,和二进制溢出漏洞的本质是相同的。反之,如果对漏洞底层机制不了解,这些都是需要重新理解的概念。
学习计算机科学的基础确实可能会感到枯燥,特别是刚开始接触那些复杂的概念和庞大的信息量时。但是,这个领域也是充满了挑战和乐趣的,尤其是开始理解并能够运用这些知识时。
学习计算机基础时,啃源码和文档是学习计算机科学非常传统也非常有效的方法。源码能够让你直接看到理论是如何转化为实际可运行的程序的,而文档则能帮助你理解这些代码的设计理念和使用方式。早期的网络安全从业者和黑客,他们中的很多人并不是通过正规的教育途径进入这个领域的。很多人就是通过自学,强行啃下了大量的技术手册,比如MSDN或Intel的手册,这样的例子不胜枚举。
如果觉得这个学习过程很枯燥,那么可以一步步来,把学习计算机科学想象成是一个拼图游戏,每一块小知识都是拼图中的一部分。比如,第一次遇到Linux共享内存的机制,可以先学机制,第二次遇到,尝试了解相关的系统调用与内核原理,再之后知道底层硬件是如何处理这些内核操作的。每一次都在为自己的知识拼图添加新的一块,逐渐地,这些零散的知识点就会拼成一个完整的图景。只到下次遇到的时候,能够充分理解各个计算机组件的原理和它们是如何相互作用的。基础扎实之后,漏洞挖掘变得无往不利。例如,Dirty Pipe的发现者Max Kellermann并不是安全从业者,他发现漏洞的起因是发现服务器上有日志会偶发问题。通过调试,他找到了相关漏洞并完成了修复,这对他来说只是一个日常调试bug的过程。
如果说计算机基础是网络安全的基石,软件工程更像是上层建筑。软件工程和网络安全,这两个领域紧密相连,在各种意义上发挥不同的作用。
具体的说,安全性是软件工程需要考虑的问题,开发工程师会采用各种方法,比如代码审查、单元测试和安全性设计来减少网络安全风险。而对软件工程有充分理解时,才更容易识别出软件的薄弱点,并有效地挖掘漏洞。
另一个点是,网络安全本身也涉及到很多自动化的部分。早期的漏洞挖掘可能是一个有趣的过程,充满了探索未知的刺激。但随着时间的推移,这个过程可能会变得重复乏味。这时,了解软件工程就能构建自动化的环境,使得漏洞挖掘变得更加高效。CodeQL、SQLMap等优秀的工具,就是这种能力的体现。这样的工具背后,是深厚的软件工程技能和对安全漏洞深刻理解的结合。
总的来说,软件工程和网络安全是相辅相成的。软件工程提供了构建安全软件的方法和实践,而网络安全则不断挑战这些方法和实践,推动它们向更高的标准发展。
再聊聊hacking, 笔者喜欢举的例子是 “impossible->i’m possible”,通过插入一个单引号和空格,词组的意义有了完全不同的改变。hacking是面对看似不可能的挑战时,也能找到方法解决的信心和想法。例如不接入互联网的计算设备,在震网事件被爆出来之前大家都觉得的是安全的,但是震网证明了通过足够的投入,hack被层层保护的设备并非不可能。正所谓没有绝对的安全,hacking是一种不自我设限的精神,网络安全需要打破常规、跳出框架,只有不断学习和适应,突破界限,转变思维,才能在网络安全这个不断变化的领域里越做越好。
进阶
笔者认为,网络安全领域可以为多种路线,包括工业界、学术界和漏洞猎人。以下将分别聊聊这三种路线。工业界主要是指实际应用中,包括安全研发、安全运营、DevSecOps、红蓝对抗等方面,以及就业形势比较糟糕的安全研究等。
工业界的大部分工作其实都是软件工程相关的,安全研发、DevSecOps是软件工程好理解。为什么红蓝也是软件工程强相关呢?有两个原因,其一是不可能每次渗透、漏洞挖掘都是精彩的,很多时候是平凡的重复。打穿第一个内网的时候是刺激的,打穿第二个内网的时候是兴奋的,打穿第三个内网的时候是高兴的,而到了打穿第n个内网的时候可能就是平静甚至无聊的的。其二是工业界必然有人效的要求,刀耕火种的渗透方案是比不过自动化流水线的。
对于刚入门的同学来说,可能还没有感受到重复工作的痛点,因此没有意识到自动化的重要性。下面简单聊聊怎么做网络安全领域的软件工程实践。一个重要的做法是要培养自动化的意识,要认识到任何重复的工作都是自动化的候选对象。带着这种意识,就可以在日常学习、工作中时刻考虑编写脚本或程序来自动化完成任务。在自动化过程中,多写多看是一个好的学习方法。通过编写代码,可以逐渐积累经验,通过阅读别人的代码,可以学习更多的技巧和最佳实践。
如果自己构建一个大项目比较困难,那么参与开源项目是一个很好的选择。很多开源项目都有标记为“good first”的issue,这些问题适合新手尝试解决。通过解决这些问题,不仅可以提高编程能力,还可以学习到项目协作和代码贡献的流程。像nmap这样的成熟项目,贡献代码的过程中可能还会得到经验丰富的开发者的指导。
再聊聊在学术界的发展,主要是读研和读博。首先,做好背景调查非常关键。在选择导师和研究团队时,了解他们的学术背景、研究方向、工作风格以及师生关系是很重要的。糟糕的环境很容易影响学术生涯和个人成长。所以,选择一个能够提供良好学术指导并且能够激励你的导师是非常重要的。
接下来,选好方向也是关键的一点,除了兴趣之外,也建议考虑一些实际的问题。例如有的学术团队在某个方向已经做得很顶尖并持续投入了,那么进入这些领域可能并不是一个好主意,可能会面临激烈的竞争。还有一些方向可能也需要谨慎考虑,例如像设备安全这些需要资金支持购买设备的研究,或者像恶意流量分析这些需要大量数据的方向。
最后,研究的基础是大量阅读论文。刚进入某领域时建议通过阅读Systematization of Knowledge (SoK) 快速地了解某个领域的现状和未来的研究方向,随后根据SoK的指引阅读相关的所有文章。同时建议关注安全领域的四大顶级会议(如ACM CCS, IEEE S&P, USENIX Security, NDSS)和软件工程的会议,紧跟最前沿的研究成果。这些会议的论文往往代表了当前网络安全领域的最高水平,对于研究和学术生涯都是非常有帮助的。
最后是漏洞猎人的路线,主要工作是挖掘网络安全漏洞。常见的做法是刷bug bounty、参与pwn2own等比赛。这条路线对天分和运气都有一定的要求,感兴趣的同学可以自行挑战。
行业选择
在文章的最后,想再聊聊还没有入行或者有余地转行同学的专业选择问题。当然,如果是loki、saelo那样的天才,请无视下面的话。
整体来说,网络安全并不能算是一个很好的从业选择。首先,在很多企业中,网络安全被视为一种成本投入,而非直接产生收益的部门。这直接导致网络安全团队在资源分配和预算方面受到限制。就算互联网整体从业环境大于传统的天坑专业,但是基本能选择安全相关的专业就能选择软件相关的专业。安全行业的人员需求是小于软件行业的人员需求的,也很容易想见,一个初创公司起步,可以有产品、运营、前端后端客户端甚至测试,但大概率是没有安全的。
其二,网络安全从业可能并没有想象中的愉快。一方面,安全是容易受开发讨厌的部门,且预防工作往往不被看见,而事故发生后却要承担责任。对此没有感受的同学不妨回忆回忆名篇:扁鹊见蔡桓公。另一方面,实际的安全从业可能有很多枯燥的工作,涉及大量重复性和细致的劳动,如代码审查、漏洞测试和修复,渗透也好、漏洞挖掘也好,从来都不是影视作品中轻松回车完成的事情。
最后,也是最重要的合法的问题。从事网络安全很容易触及到法律的边界,即使带着好的初心也可能有不那么好的结果,例如乌云平台、世纪佳缘SRC事件。而没有合适指导的话,像渗透、漏洞挖掘、逆向等都可能触犯一些法律法规。
而对于还在初高中阶段的同学们来说,如果未来想参与网络安全相关的工作,建议还是以升学优先,好的教育背景和系统的培养可以为将来的职业生涯打下坚实的基础。