据我了解,当攻击溢出堆栈上的内存缓冲区时会发生典型的缓冲区溢出攻击,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。
当使用将数据从一个区域盲目地复制到另一个区域的函数(例如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内核的工作原理,也许不可能发生缓冲区溢出攻击?
答案 0 :(得分:2)
Linux sscanf()
容易受到缓冲区溢出的影响;检查来源显示了这一点。您可以使用width specifiers来限制允许%s
写入的金额。在某些时候,您的str
也必须在其上运行copy_from_user()
。 用户空间可能会将一些垃圾指针传递给内核。
在您引用的Linux版本中,scsi_sysfs.c确实存在缓冲区溢出。最新版本没有。 committed fix应解决您看到的问题。