Linux是开放源代码的操作系统。 Linux execve()系统调用存在竞争条件漏洞,本地攻击者可以利用这个漏洞读取某个本无权读取的SUID程序的内容。 execve()函数存在如下代码(fs/binfmt_elf.c): static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs) { struct file *interpreter = NULL; /* to shut gcc up */ [...] retval = kernel_read(bprm->file, elf_ex.e_phoff, (char *) elf_phdata, size); if (retval < 0) goto out_free_ph; retval = get_unused_fd(); if (retval < 0) goto out_free_ph; get_file(bprm->file); fd_install(elf_exec_fileno = retval, bprm->file); 在执行新的二进制程序中,把打开的可执行文件描述符放到当前进程(当前execve()调用者)文件表中,并执行。这可以通过系统clone系统调用在父子进程间创建共享文件描述符然后读取该文件描述符。这允许攻击者读取suid程序的内容(即使攻击者本无权读取)。攻击者也有可能利用这一漏洞以特权状态下执行任意代码,但目前尚未经证实。
Linux是开放源代码的操作系统。 Linux execve()系统调用存在竞争条件漏洞,本地攻击者可以利用这个漏洞读取某个本无权读取的SUID程序的内容。 execve()函数存在如下代码(fs/binfmt_elf.c): static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs) { struct file *interpreter = NULL; /* to shut gcc up */ [...] retval = kernel_read(bprm->file, elf_ex.e_phoff, (char *) elf_phdata, size); if (retval < 0) goto out_free_ph; retval = get_unused_fd(); if (retval < 0) goto out_free_ph; get_file(bprm->file); fd_install(elf_exec_fileno = retval, bprm->file); 在执行新的二进制程序中,把打开的可执行文件描述符放到当前进程(当前execve()调用者)文件表中,并执行。这可以通过系统clone系统调用在父子进程间创建共享文件描述符然后读取该文件描述符。这允许攻击者读取suid程序的内容(即使攻击者本无权读取)。攻击者也有可能利用这一漏洞以特权状态下执行任意代码,但目前尚未经证实。