如何避免编程小错误留下严重安全漏洞
时间:08-19
来源:TechTarget
点击:
在过去,人们称作"悬摆指针"的非常普通编程错误常常被看作是软件质量问题而不是安全问题。例如,在2005年,互联网信息服务器5.1版中的一个悬摆指针问题报告给了微软。虽然这个软件瑕疵能够造成系统崩溃和出现严重的安全威胁,但是,这个问题两年多都没有修复。
悬摆指针是在程序员创建、使用、然后释放内存中的一个对象的时候出现的,但是,并不改变这个对象相应的指针值。在这种情况下是零指针。相反,这个指针不正确地指向已经释放的内存的存储位置。由于这个指针指向不再存储合法对象的内存,这个指针被认为是"悬摆指针"。由于内存可能包含完全不同的数据,当程序员错误地参考这个指针访问这个对象的时候,就可能导致意想不到的行为。
最近被IBM收购的在线风险管理公司Watchfire的专家发现了一种控制悬摆指针并且让这些指针指向具体内存位置的方法。研究人员Jonathan Afek和Adi Sharabani发现,通过向一台服务器发送特别制作的URL,他们能够造成目标机器的崩溃并且在目标机器上执行他们自己的壳代码。攻击者使用这种方法能够远程控制或者感染任何在应用程序中存在悬摆指针安全漏洞的计算机,就像攻击者利用缓存溢出安全漏洞一样。
我们都曾看到过缓存溢出安全漏洞能够造成的破坏和有效性。当攻击者鼓捣计算机内存的时候,损坏的数据结构、信息泄漏、提升权限和执行恶意代码等都是可以利用的漏洞。虽然悬摆指针在大多数成熟的应用程序中都是可以被发现的,但是,黑客把攻击重点放在网络服务器应用程序方面,因为这种应用程序通常包含大量的敏感数据。
程序员要发现悬摆指针错误是很困难的,因为悬摆指针通常破坏没有关联的数据或者创建以后很长时间才引起系统不稳定问题。这种软件瑕疵多数出现在低级编程语言中,如C或者C++。在Java和C#等高级编程语言中,不可能出现悬摆指针的问题。指针在这里是自动处理的,当一个对象被消除时,会出现一些隐含的废物。使用没有自动处理指针功能的编程语言的开发人员需要对他们的应用程序开发过程进行重新评估。在使用之后,所有的指针都需要设置到空指针。
智能指针是一种流行的数据类型,能够更好地管理内存。一个智能指针通常使用参考计数声明对象。参考计数机制计算指向同一个对象的智能指针,一旦这个计数等于零,这个对象就被删除。
其它防御措施包括"tombstones method(墓碑方式)"和"locks-and-keys method(锁与钥匙方式)"。一旦一个对象死亡,一个相关的墓碑就自动把可能指向这个对象的任何指针变成空指针。在"锁与钥匙方式"中,指针的访问是通过对比一对密钥的两个值来确定的。其它可用的产品有套装调试设备Valgrind和清理代码工具贝姆垃圾收集器(Boehm-Demers-Weiser garbage collector)。这些工具都可以帮助清理悬摆指针。
由于悬摆指针不再被看作是一个良性的问题,开发人员需要调整软件开发流程,这样就可以防止悬摆指针成为生产代码。由于这个问题在质量控制阶段之前是不能留下的严重问题,应该在开发生命周期的早期阶段采取保护性措施。使用高级语言,这个流程将相对简单一些。对于使用其它语言开发和维护程序的那些人来说,建议使用上面提到的一些最佳做法。
悬摆指针是在程序员创建、使用、然后释放内存中的一个对象的时候出现的,但是,并不改变这个对象相应的指针值。在这种情况下是零指针。相反,这个指针不正确地指向已经释放的内存的存储位置。由于这个指针指向不再存储合法对象的内存,这个指针被认为是"悬摆指针"。由于内存可能包含完全不同的数据,当程序员错误地参考这个指针访问这个对象的时候,就可能导致意想不到的行为。
最近被IBM收购的在线风险管理公司Watchfire的专家发现了一种控制悬摆指针并且让这些指针指向具体内存位置的方法。研究人员Jonathan Afek和Adi Sharabani发现,通过向一台服务器发送特别制作的URL,他们能够造成目标机器的崩溃并且在目标机器上执行他们自己的壳代码。攻击者使用这种方法能够远程控制或者感染任何在应用程序中存在悬摆指针安全漏洞的计算机,就像攻击者利用缓存溢出安全漏洞一样。
我们都曾看到过缓存溢出安全漏洞能够造成的破坏和有效性。当攻击者鼓捣计算机内存的时候,损坏的数据结构、信息泄漏、提升权限和执行恶意代码等都是可以利用的漏洞。虽然悬摆指针在大多数成熟的应用程序中都是可以被发现的,但是,黑客把攻击重点放在网络服务器应用程序方面,因为这种应用程序通常包含大量的敏感数据。
程序员要发现悬摆指针错误是很困难的,因为悬摆指针通常破坏没有关联的数据或者创建以后很长时间才引起系统不稳定问题。这种软件瑕疵多数出现在低级编程语言中,如C或者C++。在Java和C#等高级编程语言中,不可能出现悬摆指针的问题。指针在这里是自动处理的,当一个对象被消除时,会出现一些隐含的废物。使用没有自动处理指针功能的编程语言的开发人员需要对他们的应用程序开发过程进行重新评估。在使用之后,所有的指针都需要设置到空指针。
智能指针是一种流行的数据类型,能够更好地管理内存。一个智能指针通常使用参考计数声明对象。参考计数机制计算指向同一个对象的智能指针,一旦这个计数等于零,这个对象就被删除。
其它防御措施包括"tombstones method(墓碑方式)"和"locks-and-keys method(锁与钥匙方式)"。一旦一个对象死亡,一个相关的墓碑就自动把可能指向这个对象的任何指针变成空指针。在"锁与钥匙方式"中,指针的访问是通过对比一对密钥的两个值来确定的。其它可用的产品有套装调试设备Valgrind和清理代码工具贝姆垃圾收集器(Boehm-Demers-Weiser garbage collector)。这些工具都可以帮助清理悬摆指针。
由于悬摆指针不再被看作是一个良性的问题,开发人员需要调整软件开发流程,这样就可以防止悬摆指针成为生产代码。由于这个问题在质量控制阶段之前是不能留下的严重问题,应该在开发生命周期的早期阶段采取保护性措施。使用高级语言,这个流程将相对简单一些。对于使用其它语言开发和维护程序的那些人来说,建议使用上面提到的一些最佳做法。
- 我之ADSL入侵 (03-24)
- 抵御网页攻击 快速解决iFrame漏洞问题(05-26)
- Windows Vista中IE漏洞击穿系统防线(06-04)
- 经典合集:ASP注入应用漏洞解决方法整理 (06-29)
- Microsoft Excel 中的远程执行代码漏洞(08-07)
- 拒绝安全隐患 详解主动防御技术(08-13)