据我了解,典型的缓冲区溢出攻击发生在攻击溢出堆栈上的内存缓冲区时,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。
当使用盲目地将数据从一个区域复制到另一个区域的函数(例如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 内核在后台的工作方式,缓冲区溢出攻击可能是不可能的?