计算机系统及信息安全问题是进入信息社会所必须解决的问题,大量Internet应用的出现使这一问题更加突出。近来,随着PIII的序列号和微软操作系统中后门密钥等事件的发生,使我们认识到信息安全“事关重大,刻不容缓”。从事计算机安全领域研究的沈昌祥院士指出:“信息安全保障能力是21世纪综合国力、经济竞争实力和生存能力的重要组成部分,是世纪之交世界各国在奋力攀登的制高点。”
众所周知,我们的计算机系统和网络系统从硬件到软件大多是国外的产品,包括一些相关的安全产品。许多产品在设计时都会留有一些后门供产品测试,也可能存在一些设计缺陷,同时存在有意埋伏安全陷阱的可能,所有这些犹如千里之堤中的蚁穴,甚至更甚于此。记得有这样一个故事,A国在B国使用当地建筑材料修建使馆,结果发现在建筑物中有大量的窃听装置,最后只得不惜代价使用本国工人和建筑材料重新修建。因此“信息安全要打中国牌”,在安全系统中必须采用我们自己的产品。
计算机系统及信息安全可分为安全技术和密码技术两方面,两者缺一不可。具体来说安全技术中关键是操作系统、CPU等,然而我们不具备自己的操作系统和CPU,短期内也不会有,但最终应该有,笔者认为这一事情应该从战略意义上考虑。幸运的是,Linux的出现为建立我国安全、自主的操作系统提供了机遇和挑战,发展自主版权的操作系统具有很大的经济效益和社会效益,笔者认为同时一定要把安全放在首位。
源代码公开就不安全吗?
Linux是一个自由、开放的操作系统软件,其最初设计目标并不是一种安全操作系统,因此Linux在安全方面存在一些不足、漏洞和后门。关于操作系统的安全性,目前除Windows NT是被确定为达到美国安全标准的C2级外,其它都难以定性而论,Linux也是如此。目前关于计算机系统安全的讨论中有许多并非操作系统本身的问题而是应用软件或某些协议带来的,如Sendmail中MIME以及TCP/IP本身的安全问题等,这里只简单介绍Linux内核存在的几个主要问题,借以指出建立安全、自主的操作系统应注意的几个方面。
Linux属于自由软件,其源代码是公开的,有人认为这是不安全因素。其实不然。首先,这种开放源码的系统软件恰有非自主的黑箱操作系统所不具备的一个安全特点,就是用户可以对它有较深的理解,发现问题可很快解决,而不必苦苦等待软件补丁和升级版;其次说句题外话,在密码算法安全性研究中,前提是算法公开———即假设攻击者已知算法,细节需要保密的算法没有研究和利用价值。
Linux哪儿不安全?
Linux的第一个问题是利用启动盘可以启动计算机,或利用LILO进入单用户模式,无须root口令而获得root用户具有的权限。这一点已被许多Linux文章书籍中作为忘记root口令时的解决方案介绍。这是个很大的安全问题,因为它使root口令失去了意义。
其次是Linux的口令问题。Linux存放的是用户口令明文的One Way Hash运算结果,加上用户选择易记口令等因素,容易采用词典攻击,同时用户远程登录时传送的是口令明文,易于窃听。目前Linux的发行版本中都采用了Shadow技术,首先将口令作扩充(Padding)处理再作One Way Hash计算,结果存放在只有root用户可访问的文件中,其中Padding的数据是伪随机数。这样提高了口令的安全性。但密码学的有关研究表明,仅仅采用对称密码算法或Hash算法是不够的,不能构成安全的口令认证方案。
第三,SETUID问题。SETUID是为解决某些普通用户执行的但执行时须暂时获得root特权的程序的执行问题,这也是一个安全隐患。黑客可以在有root权限时将其黑客程序设置SETUID,以后就可以以普通用户登录运行该程序,此举具有很大的隐蔽性,不易觉察。
第四,缓冲区溢出问题。当输入数据超出所分配存储空间而系统又没有对此作直接处理时导致缓冲区溢出问题。缓冲区溢出会导致程序退出、数据丢失以及其它不可预计的结果。由于C、C++编译器对缓冲区溢出、指针越界等不作检查,因此会发生缓冲区溢出问题。如果缓冲区溢出发生在可执行堆栈中,则会覆盖堆栈中原有的程序执行信息,导致系统执行错误的指令。因此,黑客程序可以故意安排堆栈溢出时,系统就可能转而执行黑客程序,该黑客程序获得正在执行的程序的权利(通常是root特权),系统被破坏或失去控制权。
第五,计算机病毒和特洛伊木马程序问题。如今PC平台计算机病毒和特洛伊木马程序层出不穷,破坏力增大,人们对其防不胜防,Unix/Linux上的病毒却不是很多,这除与操作系统机制有很大关系外,也与Unix/Linux未广泛流行有关。由于Linux存在SETUID问题和缓冲区溢出等问题,这为计算机病毒和特洛伊木马程序提供了入口。
另外还有其它一些问题以及具体操作、设置中存在的问题,在此不一一列举。
如何保证Linux的安全?
针对Linux存在的一些安全问题,在建设安全、自主的操作系统时应注意把握以下几点:首先是系统引导问题,必须保证对用户的身份认证。其次是口令机制,应该研究结合公钥密码算法的安全口令认证方案。第三,Linux中用简单的方法实现进程管理和调度,从安全和完成复杂任务角度看都略嫌不足。需要研究更好的文件权限、进程管理和执行权限管理方案。解决缓冲区溢出问题一方面是严格编译器的检查,另一方面是寻求动态解决方案,确保系统的控制权,并力求减少损失。
同时笔者认为安全的操作系统应该具有一定的防病毒和特洛伊木马程序的能力,在设计操作系统内核时要结合反病毒的有关技术,使之在根本上具有一定的免疫力。
Linux出现为我国建立安全、自主的操作系统提供了机遇和挑战,但是,Linux到底安全不安全?安全在哪儿?不安全在哪儿?我国在发展Linux的时候如何扬长避短?本栏目欢迎广大读者就Linux的安全问题进行广泛深入的探讨。