在过去,相当普遍的称为野指针(dangling pointers)的程序错误经常被看作是质量控制问题而不是安全因素。例如在2005年,一个在IIS5.1上的野指针问题被报告给微软,但是两年多仍没有发布修复补丁,而这种类型的bug完全有可能破坏系统或者引起一个严重的安全威胁。
野指针出现在当程序员创建、使用,然后释放内存中一个对象但却没有相应改变对象指针的值时——在这种情况下,产生了一个无效指针。结果是指针错误地指向了一个已使用的内存位置。当这个指针指向的不再一个合法的对象时,就被认为是“野指针”。因为这个被野指针指向的内存,可能包含完全不同的数据。当一个程序错误地通过野指针访问对象时,不可预期的行为就可能会出现。
最近IBM宣称,在线风险管理公司Watchfire的专家们已经找到一个方法来控制野指针并且使它们指向特定的内存位置。通过发送一个特别精心设计的URL给服务器,研究人员乔纳森•埃佛克和Adi Sharabani发现它们可以破坏一个目标机器并且可以在它上面运行他们自己的加壳代码。用这种方法,一个攻击者可以远程控制或入侵任何一台机器,只要这台机器有一个野指针在它的应用程序中,用大致相同的方法攻击者也可以进行缓冲区溢出攻击。
我们可以看到缓冲区溢出攻击是多么有破坏性和有效性。当一个攻击者可以随便修改计算机内存时,毁坏数据结构、信息泄漏、加大权限和执行恶意代码都是可能出现的后果。尽管野指针在许多成熟的程序中可能被发现,黑客们还是集中关注于网络应用程序,因为在这些程序中包含大量的敏感数据。
野指针很难被程序员定位,因为它们经常是在创造很久后才破坏不相关的数据或者造成系统不稳定。这些bug在低级语言譬如C和C++中很普遍。在像Java和C#高级语言中,野指针是不可能发生的。因为(在Java和C#中),当一个对象被销毁时,指针会被自动处理,并且不用的单元也被回收。不使用这种自动处理指针语言的开发者们需要重新评估他们的应用程序开发步骤。所有的指针在使用后都需要被置为空指针。
灵活的指针是很流行的数据类型,因为它可以很好控制内存。一个灵活的指针很典型的要涉及从计算到回收对象。涉及计算的机器计算那个指向相同对象的指针,一旦计算等于0,对象将被删除。
一些别的防止野指针的方法包括“墓碑方法”和“锁钥算法”。一旦一个对象被废弃,一个相关的墓碑被自动产生来废弃与之相关的指针。在“锁钥算法”设想中,指针访问是通过比较一组有序的关键字中的两个值来决定的。另外有价值的产品比如Valgrind是一组调试设备,Boehm-Demers-Weiser是一种废弃回收的工具,它可以整理代码,同样可以帮助预防野指针。
因为野指针不再被认为是一个良性问题,开发者们需要调整软件开发步骤以避免野指针出现在产品代码中。因为这个问题远离开质量控制阶段变得太严重,保护措施应该被开发周期早期。使用用高级语言开发,进度会相对的顺利些。对那些使用其它语言开发而处于开发和维护中的程序来说,使用上文提到过的最优方法值得推荐。