当前位置:Linux教程 - Linux文化 - 自由软件一定安全吗?

自由软件一定安全吗?


作者简历:

1964年出生,山西太谷人。1984年毕业于东北工学院,获得工学学士学位。1991年毕业于北京化工大学,获工学硕士学位(专业方向:自动控制与人工智能:学位论文:《聚脂过程分子量分布控制中专家系统自学习机制及GPC算法的研究》)。中华人民共和国铁道部第三工程局高级工程师,"数码论坛"成员,《计算机世界》专栏作家,并为《中国计算机报》、《信息产业报》、《网络报》、《微电脑世界》、《国际电子报》撰稿人,累计发表约50万字。1999年出版《电脑,穿越世纪的精灵》一书。

对于自由软件,美国自由软件基金会(FSF)主席Stallman在不同的场合强调,“是自由,不是免费”。因为在他的表述里,Free Software中所界定的Free,虽然含有“免费”之意,但决不是“自由软件”所指。

软件与“自由”相关,在给人一种"崇高"的印象的同时,似乎多少显得“文不对题”。这也许是两个方面的原因:对于“崇高”的俗媚已经被俗媚辨认出来,从而失去了感人的前提--时代已经不是“呼喊自由”的时代;其次,将软件,一个极具工程色彩、功能至上的逻辑语言的序列,以“Free”加以命名的时候,总是让更多务实的人关心它是否真的“Free(免费)”,而不是获得精神的解放(Freedom)。

不过,这个问题仍然有足够的理由让人绕不过去:即便所有关于“自由”的解说为普通的大众感到厌倦,感到生命内在的冲动与胀破茧束的疲惫总是与“自由”的任何表述之间,相差“最后一公里”,“自由”,仍然是一个可以利用的符号。

当“软件”,这个无论是未来学家们嘴里的启示福音,还是技术专家手里的百变金刚;无论是商人眼里的摇钱树,还是普罗大众耳边的通俗“新语”,都不可避免这样的事实:已经没有谁,或者很快就可以精确到这样的地步,没有谁,可以逃脱被互联网罩起来的生活,这种生活不能说是1971年(第一块微处理器诞生),或者1975年(微软成立),或者1993年(互联网的商业化)才开始,应当说只是在这些年代越来越走向极至。

可以有足够比例的人知道必须面临的这次“迁徙”是走向一个叫做“互联网”的地方--通俗的说法叫“网络化”,可以有足够多的人稍许了解这个未来的栖息地只是依赖着硅芯片和成百上亿行“语句”构筑而成--通俗的说法叫 “数码化”;但是,并没有足够的理由说明,“自由软件”可以为我们保留的究竟是“自由”,还是仅仅是“免费”。

Stallman非常担心把自由软件的理想庸俗化成不劳而获的“免费午餐”,这本身就说明,自由软件与盖茨软件相比,在承认软件具有清晰的使用价值方面毫无二致--所不同是只是,自由软件以较为开放的姿态来看待软件可以“for sale”这一事实。

对自由软件,说其是在比较级的层次是“开放”的,是因为构成盖茨软件和自由软件的代码基因是一致的,区别只在于人为地使其“是否开放”,此其一;自由软件并不是天才手中的玩具,或者自由软件已经不可能是60年代黑客们独自把玩的游戏,而是可以兑换“商业价值”的“鱼钩”,所钓“鱼儿”就是“眼球”,Red Hat在纽约上市引发的股市爆涨就是证据,此其二。

那么,就有必要审视这个案件。从自由软件所提供的起诉盖茨软件的证据,辨认出它存在理由。

自由软件与互联网

自由软件与互联网之间,已经有了无法割断的联系,审视自由软件,就不可能不审视其赖以生存的环境--互联网。

然而,自由软件本身与互联网之间,需要做很好的区别。从对社会的影响看,作为一种传播模式,互联网的作用要超越自由软件。

自由软件,以当前的解释,毋宁看作是一种携带了某种“诉求”和“指向”的理念或者精神。“提倡传播”的意志,使得自由软件与互联网获得了天然的默契,成为互相佐证的理由。

但是,由于软件的“有用性”或者功能,使得自由软件无论如何不能抹掉作为一种“工具”的印记。问题就在这里。

作为工具,自由软件的可操作性是大可怀疑的。这个问题不属于自由软件独有,而是属于软件。

任何编写过程序的人都承认,阅读软件的难度要大于编写软件。程序员最头痛的问题不是对一个实在对象,对一个求解问题编写软件,而是阅读和理解他人的软件代码。从理论上讲,作为一种“逆向思维”的过程,阅读软件是对“源代码”的重新诠释而不仅仅是理解。

那么,自由软件的“自由”从何谈起? 当然,自由地编写的代码,在被阅读的时候造就的诠释的“不自由”已经是一种反讽;更重要的是,Stallman 坚信的最为充分的理由,即“自由软件经过‘他人’的阅读和诠释,可以获得更好的安全特性和运行特性”,仍然是一个悬而未决的问题。

自由软件的一个重要特性被描述成比之盖茨软件更具安全性的理由是,“任何人都可以发现一个特定的自由软件的漏洞,进而为完善这个软件做出贡献”。这个想法初看起来很对,但问题也随之而来:提升软件的安全性,事实上取决于两件事,其一,“任何人如何发现软件的安全性漏洞”?其二,如何判定任何人对软件的所谓“完善”一定导致安全性的提升?

对自由软件的运行特性的提升的考察,道理是一样的。

自由软件的运行特性的提升

自由软件比盖茨软件优越的假说,与其说在于技术的可实现性,不如说建立在脆弱的自由梦想之上。自由软件的生态环境,可以获得软件安全性提升的的假说,需要预设以下条件:

软件的缺陷可以被发现

这个过程需要使用“软件测试”的概念,需要有充分的证据表明,软件缺陷是“可以发现”的。对于电脑来说,这不但涉及到“发现缺陷的算法”,更涉及到这个算法的有效性问题。后者更为重要。

能不能发现软件的缺陷,需要在软件所表征的各种模态之间建立判定算法,这个判定算法将在软件出现“缺陷”的时候给出恰当的提示。对于一个有限、但足够长的软件代码,这个算法是否存在就是自由软件首先必须解决的问题。

进而,即便存在这样的“缺陷判定”算法,并且是可以“计算”,或者可以“运行”的,但并不能保证是“能行”的,即,并不能保证这样的算法可以在有限的时间内给出所期望的结论。这就是计算机的“能解性问题”,即“NP问题”。(这个问题与图林测试、哥德尔完备性定理有关,我倾向于猜测,软件缺陷的判定问题是一个不可解问题)。

再而,虽然程序员的经验告诉我们,改善软件的唯一途径就是不断“修改”软件,但这只能说明“修改软件的前提是知道源代码”,而不能推证出“知道源代码就一定能修改软件,并且一定修改得比原来的软件要好”的结论。

简单说,就是如何保证软件的缺陷可以被发现?并且在发现缺陷的前提下,一定可以做得更好?

当然利用网络,可以设想为数众多的高手可以共同关心一个具体软件的缺陷问题,大家齐手找毛病,这多少有点象“人工的并行处理”,这种“人工的并行处理”是与计算机并行处理完全不同的模式,甚至我想应该(理论上)高于当前的“计算机并行处理模式”。但是,并行理论能否解决“测试的可解性”问题,似乎仍未有定论。

测试一个软件的功能是否存在缺陷,目前来看,最有效的算法仍然是“穷举法”。而穷举法恰恰是一个NP方法,即不能保证“能行”的算法。

对软件安全的另一个难题是“安全”本身如何定义?

目前软件安全的处境类似波普尔的证伪说:从实证的角度,只要软件截止目前没有出现问题,就认为软件是安全的。

这个推证体系是实证的,而不是理性的。没有关于“安全性”的任何全称判断。

软件的优化问题

一个软件也许可以不认为有缺陷(这需要判定),但存在代码优化问题。但优化本身又成为难题之一:这就是如何确立软件优化的判据?或者问:是否存在普适的“优化”判定体系?对此,也许同样无法获得一致的见解。(之所以如此,是因为比特化将计算机科学牢牢地栓在了“实用科学”的土地上)

以上3个方面的难题,可以简略地说明自由软件与盖茨软件相比,处境并没有本质的改善。或者说,自由软件与盖茨软件在安全问题上,是同级的。

那么,支持自由软件的人,如果仅仅利用“自由”的辞藻,在这些问题上闪烁其辞的话,就无法得出自由软件比盖茨软件优越的结论。

但是,这里没有为盖茨软件辩护。自由软件,必须考察其存在的其他理由。这个“其他理由”,并不是来自安全的提升--即便自由软件比盖茨软件来得安全,也只能说明盖茨软件本身的商业模式,妨害了安全性能的改善,而不能证明自由软件在安全性方面一定优于盖茨软件。

自由软件的安全性是盖茨软件“送”来的机会,而不是自由软件内禀的特性。

需要从另外的角度审视自由软件存在的理由。这个理由来自网络的存在,来自纯粹的商业考虑,来自互联网对软件产业存在模式的彻底颠覆。

这个问题将在另一篇文章里加以探讨。

(全文完)


——摘自:http://china.cnet.com