C签名整数攻击

时间:2014-01-19 14:22:58

标签: c++ c security

我正在阅读this question,其中一条评论提到基于C签名整数的攻击

我知道int溢出是什么,但我不明白如何将其用于攻击 一个程序 攻击程序究竟是什么意思?如果您知道该程序有此错误,您如何使用它?
这仅限于signed int 如果是,那为什么呢? 在C ++中是什么情况?
如果问题很简单,我道歉

5 个答案:

答案 0 :(得分:6)

例如,FreeBSD的getpeername函数中存在一个错误。

为了说明这一点,让我们从一个受限制的内存区域void copyFromKernel(char* dest, int size)字节中复制一个函数size

正如您可能已经知道的那样,memcpy函数声明如下:

void * memcpy ( void * destination, const void * source, size_t num );

其中size_t是无符号类型。如果在我们的函数中,我们执行类似的操作:

void copy_from_kernel(void *user_dest, int maxlen) {
    int len = KSIZE < maxlen ? KSIZE : maxlen;
    memcpy(user_dest, kbuf, len);
}

,其中KSIZE是我们希望允许用户复制的最大字节数。如果调用者为maxlen发送正值,则该函数按预期工作。但是如果调用者为maxlen发送一个负值,那么比较将通过,memcpy的第三个参数将是负值。当它被转换为无符号时,复制的字节数会很大,因此调用者可能会获得受限制的数据。

答案 1 :(得分:3)

在以下示例中,一个非常简单的情况可能是id上的溢出。想象一下id是用户的id。你创建了大量的假用户,或者我不知道创建溢出。 0是管理员的ID。

if (id > 0) {
   // you don't have many privileges
} else {
   // you are basically root and can do evil stuff.
}

答案 2 :(得分:1)

大多数“反溢出”代码是范围检查的组合,然后使用索引访问内存。因此,如果你可以使用int wrap-around传递范围检查(例如“if(index&lt; max)”,索引为负)那么你可以访问预期目标之外的内存(例如“array [index] = value”) 。这种编码错误不太可能使用无符号。

答案 3 :(得分:0)

阅读有符号和无符号整数的位表示。

基本上如果int被签名...并且用户可以访问它(例如,它是从用户输入加载的)...如果用户输入一个更大的数字然后整数可以包含,则int将结果是否定的......

如果这个int是程序中某个东西的大小,那么它将变为负数。

无符号整数没有这样的问题

答案 4 :(得分:0)

您可以将它与sql注入进行比较 您为输入提供了一个非常大的整数,整数无法存储,程序可能会显示未定义的行为 每当我们存储一个更大的no时,int的容量就会被包裹,并且可能会变成负数,这可以被攻击者使用。例如: -

   int j ; 
   cin>>j ; 
   for(i=0;i<j;++i)
   {
        // Do some stuff 
   }

现在,如果攻击者输入更大的no,则j变为wrapping around的负面消息,并且程序会跳过for循环代码。