除以零是安全漏洞吗?

信息安全 开发 攻击 脆弱性
2021-08-11 05:33:47

即使有时将软件错误和漏洞视为同一个概念,但它们之间必须至少有一个不同的方面,我认为最突出的一个是可利用性(后者具有属性)。

我很好奇的是,即使在看到许多将除零错误报告为软件问题的案例之后,我也几乎无法提出任何使用除零错误的攻击(DoS 除外) 。我知道并非所有类型的错误对系统的安全性都有相同的影响,但是是否有任何攻击方法使用除零错误来实现与 DoS 不同的东西,例如权限提升?

4个回答

问题在于将调用异常处理程序来处理除以零。一般来说,攻击者知道异常处理程序没有像常规代码流那样经过良好的测试。您的主要逻辑流程可能是健全且经过全面测试的,但异常处理程序可以由其范围内代码中任何地方发生的中断触发。

int myFunction(int a, int b, SomeState state) {

    state(UNINITIALIZED);
    try {
        state.something(a/b);
        state(NORMAL);
    }
    catch () {
        state.something(b/a);
        state(INVERTED);
    }
    return retval;
}

这种可怕的伪代码说明了可以利用该漏洞的一种方式。假设一个未初始化的状态在某种程度上是脆弱的。如果调用此例程,则状态首先未初始化。如果 b 为零,它会捕获异常并尝试执行一些其他逻辑。但是如果 a 和 b 都为零,它会再次抛出,使状态未初始化。

除以零本身不是漏洞,而是可能被利用的坏代码。

添加另一个人为但基于真实示例的:

许多(许多)个月前,我的高中正在运行 Novell Netware 并对其进行了配置,因此学生不能直接运行 dos 提示符(如果您需要格式化软盘,这很烦人)。然而,我们发现如果您输入的密码超过 X 个字符(即只是按住一个键一会儿),这会导致网络软件崩溃并使系统返回到... dos 提示符。这很可能是缓冲区溢出,但原理是一样的:如果您正在处理的系统(尤其是嵌入式系统)通过让您进入维护模式来处理至少一些意外崩溃,那么就会存在安全问题.

正如其他答案所暗示的那样,它完全取决于整个系统。这不仅仅是代码,还有平台、语言和编译器。

例如在 c++ 中,整数除以零是未定义的行为。关于该特定语言的规则之一是编译器可以假设未定义的行为永远不会发生,并且如果发生,则允许执行任何操作。

任何事情都包括崩溃并出现错误消息并进行清理,崩溃而没有错误消息并使一切都处于奇怪的状态,或者最可怕的尝试继续前进,就好像什么都没发生一样。

现在在实践中,大多数优秀的现代编译器在遇到类似情况时都会尝试彻底崩溃,但这应该清楚地说明为什么假设它是一个漏洞。如果您只是使用不同的编译器或不同的设置构建代码,甚至不更改代码,那么程序所做的事情可能会从彻底崩溃到清除数据库。

连同错误配置的网络服务器,PHP 环境可能会在导致除以零时显示脚本的物理路径(内部路径泄漏):

<?php
$denominator = $_GET['number'];
echo 1/$denominator;

访问 script.php?number=0,我们可以看到:

警告:在第 3 行的 /var/www/html/script.php 中除以零。