在很多数人眼中,操作系统内核是神秘的,安全是说不清的,内核安全则是子虚乌有的。如果说内核是一座险峻的高山,内核安全则是隐藏在高山之中的一个深不可测的洞窟。
即使对内核开发人员,内核安全也是陌生的。Linux的创始人Linus Torvalds就曾说他不懂安全。内核开发人员不了解安全的原因主要有两个:其一,内核安全涉及领域太多了,Linux是庞大的,很少有人能对所有领域都了解;其二,如Linus Torvalds所说,安全是“软”科学,没有一个简单的量化的指标去衡量安全,开发人员自然是重视实实在在的功能,而轻视“虚无缥缈”的安全。
我十二岁的儿子看到我整日为内核安全而忙碌,就问我什么是内核,什么是安全。经过我的解释,他对内核的印象就是隐藏在网络中的一个坚硬的“蛋”,内核安全就是“蛋”里面隐藏的“武林高手”。当不怀好意的攻击者攻击系统时,“蛋”中隐藏的“武林高手”就会跳出来保卫系统。基于这种理解,他画出了下面这幅画:
上面这幅童真的绘画表达了三个意思。其一是网络,在万物互联的今天,安全越来越难以忽视。其二是内核,处于底层的内核为上层的用户态应用提供支持和保障,其中也包含安全保障。其三是内核安全,今天的Linux内核已经拥有相当多的安全机制来应对各种安全威胁。但是Linux内核安全十分复杂,不易掌握。至本书成稿时,国内外还没有一本系统、全面地介绍Linux内核安全的书。
屈指算来,我从事内核安全相关工作已是第八个年头。当年的一个面试邀请电话让我在一个仲春的清晨伴着蒙蒙细雨步入了Linux内核安全领域。几年后,就在我对内核安全有了一点点理解,并沾沾自喜时,我亲耳聆听了Linux内核安全领域负责人James Morris的演讲。我突然发现他讲的大部分东西我都听不懂。好吧,不懂可以学。本书的提纲可以说是James Morris提供的。我将他演讲中提到的内核安全相关内容研究了一遍,呈现在这里。
本书的内容有相当一部分出自我对Linux内核源代码代码的分析。很多内核安全模块缺少文档,读代码是了解它们最直接、最准确的方式。代码面前,了无秘密。但是为了不让读者因为陷入代码的细节之中,而失去对软件框架的掌握,本书尽量避免简单罗列源代码,所列代码一般是关键代码,用省略号表示略去的不重要的部分。本书也列出了一些用户态工具的用例,讲解用户态工具的使用不是本书的目的,列出工具的用例是为了让读者对内核安全有些感性认识。