security - 如何防止我们程序中的任意代码执行漏洞?

标签 security execution platform-independent

当您的系统或浏览器或任何程序更新它们修复了一个错误,使攻击者可以使用伪造的网站在您的计算机中执行任何代码,或使用精心伪造的数据包攻击您的计算机等时,您总是会阅读更改日志...

因为你经常阅读它意味着任何程序都可能有类似的漏洞......这是什么原因造成的?如何设计我们的程序以防止类似问题?

最佳答案

一个错误如何创造利用机会的例子:

假设您在程序中有一个子例程,用于修改字符数组中的数据。假设它还包含一个错误,即当数组具有特定大小或数组包含特定字符时,子例程会无意中写入字符数组的末尾。

这本身似乎不是一个很好的机会,但取决于执行如何到达子例程以及它如何实现和编译的其他工件,它可以用作执行任意代码的跳板。

在传统编程(C、C++)中,字符数组(缓冲区)通常存储在程序堆栈中。对于小的临时数据,堆栈是非常快速和容易的内存分配。

存储在堆栈中的另一件事是函数调用返回地址——该函数退出时返回的代码地址。

现在您拥有了制造灾难所需的所有部分:如果您可以将正确的数据传递给该子例程以使其覆盖堆栈,并且覆盖它足以覆盖也在堆栈上离数据不远的函数返回地址缓冲区,那么您就有可能改变函数退出时程序执行将返回的位置。它可以“返回”(实际上是跳转)到 Halt() 或 Format() 或 PhoneHome(),而不是返回给调用者。此时可以访问当前进程引用的任何库或 DLL 中的任何函数。

这只是任意执行漏洞的一个示例。有几十种这样的模式。

阻止此特定漏洞的最简单方法是确保您的代码遵守数据缓冲区的边界。对于大多数编译器,这意味着打开范围检查或类似的运行时检查。在访问数组中的内存位置之前,编译器将发出代码以验证数组索引值是否在范围内。

关于security - 如何防止我们程序中的任意代码执行漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2565396/

相关文章:

amazon-web-services - 是 AWS ARN 的 secret 吗?

mysql - 允许漫游用户访问 MySQL 数据库的最佳方式

c# - 在 C# 中无限/定期执行代码的最佳实践

执行存储在数据段中的 x86 指令的性能损失?

c++ - 线程和非线程函数调用的执行顺序是什么?

java - Gradle 依赖项 (org.apache.commons ) 是否也受到当前 log4j 漏洞的影响?

php - PHP 中的 AES-256 加密

java - java 真的是平台独立的吗?

asp.net-core - .NET Core 是如何实现跨平台或平台无关的?

c++ - 最易于使用、轻量级、独立于平台的 C++ 图形库