Linux内核是一款免费开放源代码的操作系统内核,最初由Linux Torvalds编写。 Linux内核在处理文件描述符时存在问题,本地攻击者可以利用这个漏洞进行拒绝服务攻击。 近来的Linux内核保留一套为root用户进程使用的文件描述符,根据默认配置:./include/linux/fs.h:#define NR_RESERVED_FILES 10 /* reserved for root */ 文件中为ROOT用户进程使用的文件描述符大小为10。不过fs/file_table.c程序中对特权用户权限的检查存在问题: struct file * get_empty_filp(void) { static int old_max = 0; struct file * f; file_list_lock(); if (files_stat.nr_free_files > NR_RESERVED_FILES) { used_one: f = list_entry(free_list.next, struct file, f_list); [...] /* * Use a reserved one if we\'\'re the superuser */ [*] if (files_stat.nr_free_files && !current->euid) goto used_one; 任意非特权用户在打开所有系统文件描述符后,通过打开执行几个一般的SUID属性的程序如passwd,su而消耗完所有为root用户保留的文件描述符,造成系统产生拒绝服务攻击。
Linux内核是一款免费开放源代码的操作系统内核,最初由Linux Torvalds编写。 Linux内核在处理文件描述符时存在问题,本地攻击者可以利用这个漏洞进行拒绝服务攻击。 近来的Linux内核保留一套为root用户进程使用的文件描述符,根据默认配置:./include/linux/fs.h:#define NR_RESERVED_FILES 10 /* reserved for root */ 文件中为ROOT用户进程使用的文件描述符大小为10。不过fs/file_table.c程序中对特权用户权限的检查存在问题: struct file * get_empty_filp(void) { static int old_max = 0; struct file * f; file_list_lock(); if (files_stat.nr_free_files > NR_RESERVED_FILES) { used_one: f = list_entry(free_list.next, struct file, f_list); [...] /* * Use a reserved one if we\'\'re the superuser */ [*] if (files_stat.nr_free_files && !current->euid) goto used_one; 任意非特权用户在打开所有系统文件描述符后,通过打开执行几个一般的SUID属性的程序如passwd,su而消耗完所有为root用户保留的文件描述符,造成系统产生拒绝服务攻击。