据我所知,典型的缓冲区溢出攻击发生在攻击溢出堆栈上的内存缓冲区时,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。
在使用盲目地将数据从一个区域复制到另一个区域的函数(如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内核在幕后的工作方式,缓冲区溢出攻击是不可能的?
发布于 2013-05-02 08:50:20
Linux sscanf()容易受到缓冲区溢出的攻击;检查源代码会发现这一点。您可以使用width specifiers来限制允许%s写入的数量。在某些情况下,您的str上一定也运行了copy_from_user()。用户空间可能会向内核传递一些垃圾指针。
在您引用的Linux版本中,scsi_sysfs.c确实存在缓冲区溢出。最新版本不支持此功能。committed fix应该会解决您看到的问题。
https://stackoverflow.com/questions/16324626
复制相似问题