据我所了解,典型的缓冲区溢出攻击发生在攻击者将一个栈上的内存缓冲区溢出时,从而允许攻击者注入恶意代码并重写栈上的返回地址以指向该代码。
当使用函数(例如
假设将此
通常,我期望防止缓冲区溢出攻击的保护措施,例如限制读取的字节数,但是我在许多函数中都看不到这些措施(例如在drivers/scsi/scsi_sysfs.c中)。
Linux内核版本的
当使用函数(例如
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内核工作原理下缓冲区溢出攻击是不可能的?
sscanf()
本身并不是不安全的,只有当攻击者可以传递给它错误的参数时才会出现不安全情况。 - Pascal Cuoqsysfs
还不是很熟悉。如果一个属性是可写的,那么恶意用户是否可以通过向属性文件进行write
调用来故意溢出缓冲区呢? - Vilhelm Gray