/dev/mem (was: SucKIT)

Jirka Kosina jikos na jikos.cz
Čtvrtek Březen 28 12:41:09 CET 2002


On Thu, 28 Mar 2002, Karel Zak wrote:

> > >  Proc potrebuje nejaky program _celou_ pamet kernelu? Nebylo by
> > >  cistejsi mit nejake blize specifikovane API?
> > Mozna bylo. Ale problem je v tom, ze se to pouziva pro primy pristup
> > k hw zarizenim (napr. graficke karte), a lepsi zarizeni (jak napr. lepsi
> > graficke karty) vetsinou umi nejake DMA a podobne veci, takze ten, kdo
> > chce skodit, si stejne pristup ke zbytku fyzicke pameti zaridi.
>  Snad by bylo v silach jadra hlidat kam v tech souborech (pameti) kdo
>  leze (pise) a nektere casti napr. sys_call_table ohodnotit SIGKILL
>  pro dany program. Nevim do jadra nedelam...

No, zmenu sys_call_table pres /dev/kmem by snad melo jit chytit nejak 
trivialne takhle, ne?

--- ./kernel.orig/drivers/char/mem.c    Fri Dec 21 18:41:54 2001
+++ ./kernel/drivers/char/mem.c Thu Mar 28 12:35:05 2002
@@ -21,6 +21,7 @@
 #include <linux/raw.h>
 #include <linux/tty.h>
 #include <linux/capability.h>
+#include <linux/sys.h>

 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -41,7 +42,9 @@
 #if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
 extern void tapechar_init(void);
 #endif
-
+
+extern void *sys_call_table;
+
 static ssize_t do_write_mem(struct file * file, void *p, unsigned long 
realp,
                            const char * buf, size_t count, loff_t *ppos)
 {
@@ -119,6 +122,7 @@
                return 0;
        if (count > end_mem - p)
                count = end_mem - p;
+       if (p >= sys_call_table && p <= sys_call_table + (NR_syscalls*4)) 
return -EPERM;
        return do_write_mem(file, __va(p), p, buf, count, ppos);

Nejsem si jisty, jestli SuckKIT nedela to, ze v IDT misto toho rovnou 
premlaskne celou obsluhu interruptu 0x80 nekam na svuj handler...

>  Problem veci jako je SickKIT je, ze v idelanim pripade, ze ten kit
>  neopsahuje zadny bug tak ho nemuzete detekovat.

Ale lze zabranit jeho natazeni.

-- 
JiKos.




Další informace o konferenci Linux