Linux 和开源应用程序
你能信任你的电脑吗?随着消费者和企业都将互联网作为金融交易的媒介,这个问题变得越来越重要。更令人担忧的是,许多连接到互联网的计算机也被用于存储敏感的技术或公司信息。我们认为,通过使用 128 位加密和类似技术,许多用户只是在自欺欺人地认为他们的数据是安全的。
近年来互联网连接的激增是主要的安全隐患的来源。真正的威胁不是通过安全连接传输的数据,而是来自无法保护机器本身上的数据。通过使用开源软件以及多种软件分发渠道,我们相信与网络相关的潜在安全问题可以在很大程度上消除。
信用卡信息通常在使用许多网络浏览器中通过“安全套接字层”提供的 128 位加密在用户和商业服务器之间传输。金融组织内部的信息通常通过专用链接传输,依靠通信运营商的完整性来帮助确保隐私,或者通过虚拟专用网络链接,网络加密设备在其中保护数据。
虽然这些确保传输数据机密性的方法已被证明非常实用,但它们忽略了我们认为可能更严重的安全漏洞:安全链接两端的计算机直接连接到互联网,以及这些机器上存在不可靠的应用程序或操作系统软件。
世界上首次公开宣传的蠕虫(一种类似于病毒的程序,它通过利用安全漏洞在网络中传播)的破坏性潜力发生在 1988 年 11 月 2 日(参见参考资源 1)。一位研究生的蠕虫意外失控,导致构成早期互联网骨干网的数千台 Sun 3 和 VAX 计算机瘫痪。
不太为人所知的是,该蠕虫包含一种高速密码破解算法,旨在使其能够访问更多特权操作系统功能。如果该蠕虫被设计用于间谍活动,并在更低的 CPU 优先级级别下运行,则它很可能已扫描数千台机器以查找“有趣”的信息,并将数据悄悄发送回其作者,而无人察觉。
今天的计算机用户都非常清楚病毒构成的风险。病毒检查程序现在通常用于搜索和销毁可能对计算机系统造成损害的病毒。然而,病毒通常是因为它们发起某些行动来引起人们对自身的注意而被检测到。为间谍活动开发的病毒可能会被明确设计为避免做任何可能引起人们注意其存在的事情。与互联网蠕虫一样,当配备适当的技术来扫描系统以查找有趣的信息时,病毒可以利用连接到互联网的计算机“呼叫家”,报告其发现并等待进一步指示。
如果窥探软件是用户有意加载的,因此永远无法被病毒检查程序检测到呢?彩蛋是大多数常见应用程序软件包中的代码段,可以通过一系列未记录的命令激活。彩蛋通常会做一些与宿主应用程序完全无关且制造商无意做的事情。但这并不是说彩蛋是偶然发生的——它们的出现归功于程序员在未经雇主授权的情况下秘密添加的代码段。
大多数已知的彩蛋都很小且无害,但随着应用程序和操作系统在过去几年中变得越来越大,流氓员工有可能包含更精细的彩蛋,并在成品发布时将其发布。Microsoft Excel 97 中的飞行模拟器(参见参考资源 2)就是一个很好的例子,说明了在一个流行的产品中包含了大量的代码。
Word 97 有一个令人惊讶的字典条目:如果一个句子包含单词“zzzz”,自动拼写检查器会用下划线标记它,并提供“sex”作为更正后的拼写。很明显,微软在发布 Word 97 时并不知道这个条目,这表明制造商无法充分监控其程序员。
几乎所有版本的 Microsoft Windows 和其他供应商的应用程序程序也包含大量的彩蛋(参见参考资源 3)。
后门很容易嵌入到大型程序中。有时,它们具有允许制造商执行远程维护的合法功能。但是,如果制造商嵌入一个秘密后门用于不正当目的呢?用户会注意到吗?
程序当然变得太大,无法检查其可执行代码中可能存在的安全漏洞。通常,我们实际上并不知道文字处理器等程序在任何时候都在做什么——也许它正在保存正在键入的文档的备份副本;也许它正在扫描硬盘以查找信用卡号码。
您正在运行的任何程序是否正在执行您不知道的任务?在撰写本文时,作者的屏幕上出现一个提示,告知他 MS Explorer 执行了非法操作并将关闭——但他从未明确启动过 Explorer。在家启动 Visual C++ 时,Windows 95 尝试连接到 ISP。工作机器上的 Visual C++ 启动时没有发生任何问题,大概是通过其与互联网的永久以太网连接建立的连接。如果不是第一台机器,我们永远不会怀疑正在进行任何网络连接。
早期版本的 Windows 98 也具有一个有趣的功能。由于编程错误,即使在用户明确选择不这样做的情况下,网络注册部分也会将系统和个人身份信息传递给操作系统的制造商(参见参考资源 4)。
某些版本的 Netscape Navigator 存在一个意外的后门式错误,首先由位于丹麦奥胡斯的软件公司 Cabocomm 发现(参见参考资源 5)。网站运营商可以利用此错误来允许他们上传 Netscape 用户硬盘上任何文件的内容,从而使运行 Netscape 2.x、3.x 或 4.x 的机器上的任何内容对即使是没有经验的网页创建者来说也是世界可读的。
鉴于迄今为止讨论的各种选项,渗透尽可能多的计算机并安装数据收集代理的最佳方法是什么?这种程序的理想载体将是像 Microsoft Office 这样的大型应用程序。该产品的巨大成功导致其安装在非常高比例的计算机系统中。当然,诀窍首先是将恶意代码插入到宿主程序中。像大多数公司一样,微软永远不会批准这样的事情。但是,从彩蛋示例中,我们知道常见软件包中确实存在一些未经公司批准的代码段,并且可以包含大量功能。
可以通过加密其大部分内容,并让一些小的代码片段按需解密并激活它来进一步隐藏未经授权的代码。一种更灵活的技术是让一个小彩蛋确定计算机是否连接到互联网,如果是,则打开与某个外国主机的连接。通过在运行时从远程站点下载代码,可以定制彩蛋来对特定计算机或计算机组执行某些操作,而这些操作甚至在创建原始代码时都没有想到。如果彩蛋在 ibm.com 域内的机器上运行,则代码可能会查找计算机原理图,或者在 gm.com 内查找汽车销售数据。随着浏览器功能越来越嵌入到操作系统和应用程序中,再多一个网络连接看起来也像受害者计算机在一天过程中不断进行的数千个其他网络连接一样无害。
现代程序使用的代码量使得少数程序员的任何手动审查都无法提供有意义的验证来证明程序是“安全的”。专家系统,例如用于追踪 Y2K 问题和传统病毒的系统,可以用来尝试发现恶意代码,但加密植入物可能会使这种方法失效。我们的结论是,用户无法有效地审查应用程序的目标代码以确定它是“安全”的。任何软件制造商也无法做到这一点。
一种可能的解决方案是使我们的操作系统更安全。Microsoft Windows NT 在安全性方面比其 Windows 同类产品有了显着改进。NT 提供了良好的密码安全性以及按不同用户类别 регулировать 访问系统资源的能力,并且它具有普遍接受的网络安全功能。
如果操作系统本身不安全怎么办?我们已经提出,大型程序无法通过程序员或专家系统进行安全违规筛查。最新的操作系统当然属于这一类,因此我们无法确定操作系统本身不是主要安全风险的来源。实际上,大多数操作系统也包含各种形式的彩蛋。因此,如果操作系统本身可疑,那么担心应用程序程序的安全风险就毫无意义。
开源软件提供了一种摆脱这种困境的方法。如果源代码是开放的,则可以对其进行检查,并且可以找到并修复安全漏洞。故意的安全违规行为变得更难隐藏,并且几乎肯定会被互联网上成千上万的业余和专业程序员发现。如果源代码是真正开放且广泛分发的,那么各种缺陷都将被发现并在网站和新闻组上公布。这种形式的互动已被证明在使 Linux 成为最稳定(即使不是最稳定)的可用操作系统之一方面非常有效。
通过这种类型的公共代码审查,用户能否合理地确信 Linux 是值得信赖的?用户能否确信,如果在操作系统中加入了足够的安全措施,他们的数据是安全的?Linux 必须使用编译器编译——如果编译器被破坏了怎么办?看来我们现在必须坚持认为,即使是用于编译操作系统的编译器也应该是开源的。对于真正关心的用户来说,即使这样也不够,并且需要一个涉及在不同平台上使用不同初始编译器进行多次编译的程序,才能生成用于编译 Linux 的开源编译器的目标代码。
为了创建一个您可以信任并使用敏感信息的 Linux 构建版本,您首先需要一个已知在编译操作系统时不会插入隐藏代码的编译器。当从不可靠的编译器和操作系统开始时,您如何创建一个受信任的编译器?我们提出以下可能的步骤序列。
让互联网上成千上万的程序员检查编译器/链接器 GNU C++ 的源代码。
通过在许多不同的平台上使用不同的编译器和链接器编译源代码来创建编译器/链接器的可执行文件。
在每个不同的平台上使用新编译的编译器/链接器可执行文件来交叉编译它们自身,以及许多不同的测试程序,到一个单一平台,例如 x86。
然后比较每个不同平台上的交叉编译的编译器/链接器和示例程序可执行文件。如果在字节对字节比较下它们不相同,则一个或多个新生成的编译器/链接器可能存在安全问题,应调查系统和编译器源代码。
假设所有新生成的编译器和示例可执行文件都相同,则可以高度自信地断言,中间编译器/链接器可执行文件和重新编译的编译器/链接器可执行文件都是值得信赖的。
现在已经创建了一个安全的 GNU C++ 版本,下一步是重复该过程以创建安全的 Linux 构建版本
让互联网上成千上万的程序员检查操作系统、关键系统库、实用程序和脚本的源代码。
使用受信任的编译器将操作系统及其库/实用程序的可执行文件交叉编译到通用架构 (x86)。
对可执行文件执行字节对字节比较,如果它们匹配,则声明它们值得信赖。
现在,使用受信任的组件构建一个最小的 Linux 系统安装,并通过认证所有其他组件逐步扩展系统的功能。
一旦创建了受信任的 Linux 平台,就可以使用类似的过程来创建受信任的浏览器。由于浏览器是用于下载其他应用程序以及为电子商务安全通信的应用程序,因此它值得特别关注。要创建受信任的浏览器
让互联网上成千上万的程序员检查源代码。
使用受信任的平台和编译器编译可执行文件。
使用受信任的比较实用程序(在 CD-ROM 上),定期将操作系统、编译器、实用程序和应用程序(包括浏览器)的可执行文件的 CD-ROM 版本与硬盘上当前的版本进行比较,以确保应用程序没有使用一些隐藏代码来破坏平台。
由于 Netscape 公司已主动公开其浏览器代码,因此 Netscape 将是作为受信任浏览器的逻辑选择。理想情况下,所有其他要使用的应用程序也应变得值得信赖,因此应执行上面列出的一组步骤来创建每个新的受信任应用程序。
当然,让用户执行此认证过程是不可能的。真正需要的是软件存储库系统——或“银行”——用户可以从中获取 Linux 和相关应用程序的认证版本。
一个国家组织,例如美国国家安全局,可以验证开源程序,并将源代码和二进制文件都放在网上供立即下载。但是,这种方法会受到与使闭源软件不安全的相同担忧的影响。心怀不满的员工可能会向认证代码添加一些额外内容,或者政府组织可能会认为拥有后门可能对国家安全有用。
显然,任何单一的测试组织都无法信任。更好的方法是拥有三个或更多认证组织,每个组织都有自己的下载站点。美国的国家安全局、英国的通信电子安全组和加拿大的通信安全机构可以各自独立地验证并提供认证的二进制文件。然后,用户可以从所有三个站点下载相同的二进制文件,并且可以确定它们是值得信赖的,条件是并且仅当没有发现差异时。虽然通过互联网下载存在潜在的安全问题(毕竟,一个狡猾的 ISP 可能会拦截 FTP 请求并将其重定向到被操纵的服务器),但这种可能性很小,并且被发现的机会很高。
为了更高的安全性,每个主要的认证站点还将提供认证的 CD-ROM,最好每个 CD-ROM 都带有一个可直接从不可更改的 CD 启动的简单文件比较程序。这样,人们可以从两个或多个认证机构订购认证的 CD,并在它们之间进行快速文件比较作为最终验证。CD 的只写性质还可以防止一张 CD 上的任何损坏污染其他 CD。
当然,信任美国、英国和加拿大的电子间谍机构可能还有些不足之处。通过要求每个认证机构不仅提供其认证的二进制文件,还提供原始源代码,其他国家、公司或个人也可以建立自己的补充认证站点。据推测,数百万互联网用户将持续关注提供认证应用程序和操作系统的各个站点,并且其中一个站点的突然差异将被注意到、调查和揭露。通过让每个认证组织保留自己的一组机密源代码示例来测试正在认证的编译器的输出,可以大大降低智能编译器识别测试代码并在认证期间生成经过清理的可执行文件的可能性。
在这一点上,还值得强调的是,遍布世界各地的开源软件独立认证站点的激增不仅是对抗任何形式的彩蛋或后门的绝佳保障,而且还将确保错误——特别是安全敏感的错误——被暴露并迅速纠正。
闭源软件的固有性质及其在连接互联网的计算机上的使用可能会产生严重的安全问题。虽然有人在流行的操作系统或应用程序程序中植入全球甚至国家破坏性代码段的可能性很低,但此类事件的后果可能过于灾难性而不能忽视。事实上,精心策划的彩蛋攻击可能会使 Y2K 问题相形见绌。为了防范这些问题,解决方案是用经过认证的开源程序替换闭源应用程序和操作系统。提供经过认证的受信任应用程序和操作系统库的组织可以提供重要的公共服务。
Peter F. Jones 是加拿大渥太华 Neptec Communications 的一名研究工程师。他于 1986 年获得理学学士学位,并于 1993 年获得加拿大安大略省金斯顿皇后大学电气工程系的博士学位,同时也是一名执业工程师 (P.Eng)。Peter 曾参与过各种软件项目,包括编写 SVGA 显卡驱动程序、创建 Java 网络搜索引擎,以及为自适应天线相控阵 HF 调制解调器开发基于 Linux 的多声卡接口库。他目前正在进行两个项目:开发用于家庭和办公室应用的小型单板 Linux 计算机,以及研究航天飞机的电视摄像机的特性,以便开发减少图像失真的算法。可以通过电子邮件 pjones@neptec.com 联系 Peter。
Mark B. Jorgenson 就职于加拿大渥太华的 Neptec Communications。他于 1984 年和 1989 年分别获得卡尔加里大学电气工程理学学士和理学硕士学位,同时也是一名执业工程师 (P.Eng)。Mark 的主要研究方向是无线通信,重点是链路层方面。Mark 最近领导开发了一个软件无线电原型,目前正在领导一个团队设计一款先进的 HF 无线电调制解调器。可以通过电子邮件 mjorgenson@neptec.com 联系 Mark。