4

据我了解,典型的缓冲区溢出攻击发生在攻击溢出堆栈上的内存缓冲区时,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。

当使用盲目地将数据从一个区域复制到另一个区域的函数(例如sscanf)时,这是一个常见的问题,检查一个区域是否有终止字节:

char str[8];                               /* holds up to 8 bytes of data */
char *buf = "lots and lots of foobars";    /* way more than 8 bytes of data */
sscanf(buf, "%s", str);                    /* buffer overflow occurs here! */

我注意到 Linux 内核中的一些sysfs_ops store函数是使用 Linux 内核版本的sscanf函数实现的:

static char str[8];    /* global string */
static ssize_t my_store(struct device *dev,
                        struct device_attribute *attr,
                        const char *buf, size_t size)
{
        sscanf(buf, "%s", str);    /* buf holds more than 8 bytes! */
        return size;
}

假设此store回调函数设置为可写sysfs属性。恶意用户是否能够通过write调用故意溢出缓冲区?

通常,我希望防范缓冲区溢出攻击——例如限制读取的字节数——但我在很多函数中都没有看到(例如在drivers/scsi/scsi_sysfs.c 中)。

是否执行Linux内核版本sscanf防止缓冲区溢出攻击;还是还有其他原因——考虑到 Linux 内核在后台的工作方式,缓冲区溢出攻击可能是不可能的?

4

1 回答 1

3

Linuxsscanf()容易受到缓冲区溢出的影响;对来源的检查表明了这一点。您可以使用宽度说明符来限制 a%s允许写入的数量。在某些时候,您str一定也曾使用过copy_from_user()它。用户空间可能会将一些垃圾指针传递给内核。

在您引用的 Linux 版本中,scsi_sysfs.c确实存在缓冲区溢出。最新版本没有。提交的修复应该解决您看到的问题。

于 2013-05-02T00:50:19.520 回答