Undoubtedly there are all sorts of languages in the world, yet none of them is without meaning. | |
1 Corinthians 14:10 (NIV) |
有许多特定语言的安全问题。许多可以做如下总结:
在实际可行的地方打开所有可用相关的警告和保护机制。对于编译语言,这包括编译机制和运行机制。一般情况下,与安全相关的程序应该在打开所有告警的条件下顺利编译。
应该避免语言中危险和不赞成的操作。所谓“危险”,是指很难正确使用的操作。
应该确保语言的基本结构(如运行库)是可用和安全的。
自动收集垃圾字符串的语言应该特别小心地立刻清除秘密数据(特别是密钥和密码)。
准确地了解所用操作的语法。从文档中查看操作的语法。除非可以确信返回值是不相关的,否则不要忽视它们。对于像C那样不支持异常的语言这一点很难做到,但事情就是这个样子。
C和C++程序最大的安全问题就是缓存溢出;参见有关缓存溢出一章以了解更多信息。C还有个额外的弱点就是不支持异常,这就使得在编程时很容易忽略关键的错误状态。
对于使用gcc进行C或C++编译,应该至少使用以下编译标识(打开一大批告警信息)并力图消除所有告警(注意,使用-O2是由于有些告警只能被在更高的优化情况下执行的数据流分析所检测到):
gcc -Wall -Wpointer-arith -Wstrict-prototypes -O2 |
对于发现潜在的安全漏洞可能会找到有些很有用的审计工具。下面就是几个这样的工具:
可靠软件技术(RST)的ITS4静态地检查C/C++代码。ITS4通过对源码执行模式匹配来进行工作,寻找已知可能危险的模式(如特定的函数调用)。ITS4对于非商业用途是免费的,包括其源码和特定的修改与重新发布的权利。警告,该工具的许可声明可能最初被误用。RST宣称ITS4是“开放源码”,但实际上它的许可证并不符合开放源码定义(OSD)。特别是ITS4的许可不符合第六点,即禁止在开放源码许可中存在“只用于非商业用途”的条款。可惜的是RST坚持用“开放源码”一词来描述他们的许可。ITS4是个优秀的工具,发布所用的许可证对于商业软件而言相当慷慨,虽然这样使用“开放源码”一词会给人以试图在没有真正开放源码的情况下赢得开放源码的名声的感觉。RST说他们只是不接受OSD的定义,希望换用一个不同的定义。从法律的角度而言,没人反对他们这么做,只是使用OSD定义的包括超过5000个软件计划(至少那些由位于http://www.sourceforge.net的SourceForge主持的软件计划是这样的)、Linux发行商、Netscape(现在是AOL)、W3C、记者(如Economist的记者)以及其它组织。大多数程序员不想艰难地通过许可协议,所以使用其它的定义会造成混乱。我不相信RST有意制造误解;他们是一家声誉良好的公司,其人员也是声誉良好而且诚实。不幸的是他们采用的特殊姿态导致了(以我的观点)不必要的混乱。不管怎样,可以从 http://www.rstcorp.com/its4 获得ITS4。
LCLint是静态检查C程序的一个工具。最低程度LCLint也可以作为更好的lint。如果增加了程序注解,LCLint就可以在标准lint功能之外执行更进一步的检查。该软件使用GPL许可证,可以从 http://lclint.cs.virginia.edu 处获取。