有源代码就可控了吗?——SE Linux疑云

斯诺登的爆料使全世界都带着怀疑的目光重新审视NSA,对他们所做的每一件事情充满怀疑。NSA刚刚推出SELinux那几年,人们就不断地追问,NSA的代码是否可信赖?是否有后门?但SELinux是开源的,理论上人人都可以去看源码里面有没有后门,也从没有人发现过后门,所以讨论渐渐偃旗息鼓。可到了2013年,斯诺登横空出世,这个怀疑再度喧嚣尘上。

SELinux是一个Linux内核模块,2000年底在GPL许可下发布,2003年8月进入2.6.0-test3内核,为Linux提供了一个DOD(Department of Defense,指美国国防部)风格的强制访问控制(MAC/Mandatory Access Control)(0)安全策略。所谓强制访问控制,简单的说,就是禁止用户自己改变程序对文件的读写权限,一切访问控制规则都由系统策略管理者事先确定。

在不支持强制访问控制(即“自主访问控制”)的系统里,系统管理员的权限不受限制。比如Linux系统中,root用户可以做任何事情,权限不受限制,一个rm–rf /就可以把整个系统毁掉,或者某个有root权限的进程被攻击者插入执行指令,那么整个系统就都在攻击者的控制之下了。这个问题其实早在SELinux出现一年半之前就有人意识到。

1999年,正在读中科院计算所读研究生的Huagang研究内核的虚拟文件系统VFS源代码时冒出一个想法,很快他动手实现了一个内核补丁,给内核增加了强制访问控制,这就是LIDS项目(1)。那时候的内核版本应该还是2.2。2000年,LIDS被nmap用户评为Top 50 Security tools之一,那时候SELinux还不存在。2006年的DEF CON上Huagang同学用流利的英文讲解了他的LIDS项目(2)。NSA在开发SELinux的过程中是否学习了LIDS?我们不得而知。

现在SELinux已经是内核的一部分,所有的主流的发行版都内置了这个模块。基于Linux内核的Android在4.3以后也启用了SELinux。如今,全世界运行的基于Linux内核的设备超过10亿台,如果SELinux代码里有NSA隐藏的后门,后果难以想象。

2013年,斯诺登事件爆发之后的一次Linux大会上,有人问Linus Torvalds(Linux的发明者,也是现在的内核代码维护者):美国政府有没有接触他,要求在Linux内核中加入后门。Linus当时的回答耐人寻味,他嘴上说“No”,同时却用点头表达了“Yes”的意思。随后他声明说那样的表达是想开个玩笑。两个月后,他的父亲,欧盟议会的芬兰议员Nils Torvalds在一次听证会上在(3)作证说,他的儿子Linus这样的表达是为了避免受到法律追究,每个人都应该明白,NSA确实接触过Linus。

不要觉得这些人太神经兮兮,因为有前车之鉴。NSA在椭圆曲线算法ECDSA标准中写入了几个神秘的参数,使得SECP256r1曲线被弱化。弱化到何种程度?如何利用?到现在为止除了NSA自己还没有人清楚(4)。此外,NSA还对欧盟很多国家领导人的通话进行了长期的监听,欧洲人对此非常谨慎是有道理的。

代码开源,但其中的问题但一直没人发现,隐藏多年突然爆出,造成巨大安全影响,这种事情太多了。去年的OpenSSL的Heartbleed和Bash的破壳漏洞就是两个重量级的例子。专门有一个“有猫腻的C代码”的比赛,目的是写出看起来毫无问题的C代码,里面却偷偷地藏着后门。觉得不可能?去这个网站看看吧(5)。2014年获奖者的代码是利用malloc函数不清除释放内存内容的问题,偷偷获取本不应该获得的数据。值得一提的是,Heartbleed就是这个问题造成的。

如果不进行代码审计,以为有源代码就“可信”了,就可以在上面开发“自主可控”的国产软件了,这种想法颇为天真。曾经以及现在,微软应某国政府的要求,以只能局部翻阅的方式把Windows源代码“开放”出来供审查,来证明自己没有后门。只能说,这些大公司像城里人一样,真会玩。

SELinux的故事没有结论。因为没有可信的机构对这些至关重要的源代码进行过安全审计。随着开源代码的规模和复杂度急剧增长,代码审计越来越难做到。但无论如何,把宝压在别人的人品上,靠其他人的眼睛找问题,都是不够谨慎的做法。开源软件是财富,但只伸手索取而不做出共享,问题不仅仅是被鄙视,还在于被动,以及,比别人承担了更大的风险。

(0)MAC这个术语最早是美国国防部在1985年的橘皮书(http://csrc.nist.gov/publications/history/dod85.pdf)里定义的,所以说它带有DOD风格。这个橘皮书一般称为DOD85,定了可信计算机系统评估准则TCSEC(TrustedComputer System Evaluation Criteria),是后来一系列技术标准的基础,包括ITSEC/通用评估准则CC/ISO15408等等。到了中国,DOD85变成了非技术标准《等级划分准则GB17859》及其后等级保护系列标准,CC及ISO15408变成了GB/T18336。

(1)https://en.wikipedia.org/wiki/Linux_Intrusion_Detection_System

(2)https://www.youtube.com/watch?v=YfC_yV3ZGd0

(3)https://www.youtube.com/watch?v=wwRYyWn7BEo

(4)http://rump2007.cr.yp.to/15-shumow.pdf

(5)http://www.underhanded-c.org/

[via@网安志异]