PB173 - Ovladače jádra - Linux XI. Jiří Slabý ITI, Fakulta Informatiky 7. 12. 2010 J. Slabý (ITI) PB173/01 7. 12. 2010 1 / 1 Část I Komunikace mezi procesy J. Slabý (ITI) PB173/01 7. 12. 2010 2/1 Komunikace mezi procesy LDD3 část kap. 6 (zastaralá) • Čekání na událost a Buzení procesů J. Slabý (ITI) PB173/01 7.12.2010 3/1 Jednoduchá komunikace a 2 procesy (producent-konzument) » A: čeká na nějakou hotovou práci • B: udělá nějakou práci a oznámí A dokončení • A: pokračuje API • linux/completion.h, struct completion • DECLARE_COMPLETIONs, init_completionD a Cekání: wait_f or.completion, wait.f or.completion.interruptible (retval) • Dokončení: complete, complete_all static DECLARE.COMPLETION(my.comp) ; static char *str ; A B wait.for.completion (&my.comp) ; strcpy(str, "Ahoj"); printk (KERN.DEBUG "%s\n" , str); complete(&my.comp) ; J. Slabý (ITI) PB173/01 7.12.2010 4/1 Úkol Použití completion O Doplnit do pb173/11/events completion O Číst se bude, až někdo dokončí zápis • Čekání v read je možné přerušit signálem (wait_f or_completion_interruptible) O Spustit 2 instance cat /dev/my_name O Pozorovat, co se děje O Spustit několikrát echo XXX > /dev/my_name J. Slabý (ITI) PB173/01 7. 12. 2010 5/1 Složitější komunikace • Čekání na více místech na jinou událost « 3 procesy • A: plní buffer • B: čeká na 100B • C: čeká na200B API • linux/wait. h, wait_queue_head_t • DECLARE_WAIT_QUEUE_HEADS, init_waitqueue_heado • Cekání: wait-event, wait_event_interruptible • Dokončení: wake.up, wake_up_all • completion je obalená wait.queue J. Slabý (ITI) PB173/01 7. 12. 2010 6/1 Složitější komunikace - příklad static DECLARE_WAIT_QUEUE_HEAD( my.wait) ; static atomic.t my.cnt = ATOMIC.INIT(O) ; static char *str ; A while (1) { str [ atomic.inc.return (&my.cnt) - 1] = 'A'; wake.up.all (&my.wait) ; msleep(1 0) ; } B wait-event ( my.wait , atomic.read(&my.cnt) > 100); p r i n t k (KERN JDEBUG "%s\n", str); C if ( wait .event J nterru pti ble ( my.wait , atomic, read (&my_cnt) > 200)) { printk (KERN.WARNING " interrupted \n") ; return ; } p r i n t k (KERN JDEBUG "%s\n", str); J. Slabý (ITI) PB173/01 7. 12. 2010 7/1 Úkol Použití wait_queue O MÍStO completion, použít V pb173/11 /events wait-queue O Číst se bude, až někdo zapíše více než 5 znaků J. Slabý (ITI) PB173/01 7. 12. 2010 8/1 Scheduler • Celé je to instruování plánovače • Ve skutečnosti je wait.event a wake.up: • Nastavení stavu procesu: set_current_state • Uspání procesu: schedule • Probuzení procesu: wake_up_process • Popř. S Obsluhou Signálů: signal_pending • linux/sched.h • completion a wait_queue ulehčuje práci o Pamatováním si, koho vzbudit • Případnou kontrolou signálů • Případnou kontrolou vypršení timeoutu • completion navíc řeší předání čítače (kolik procesů vzbudit) J. Slabý (ITI) PB173/01 7. 12. 2010 9/1 Část II Hackovací techniky J. Slabý (ITI) PB173/01 7. 12. 2010 10/1 Hackovací techniky Z pohledu jádra • Zabít stroj (DoS) • Zneužít stroj 7. 12. 2010 11/1 Zabít stroj • Jednodušší » Stačí provést něco zlého • Předat špatný ukazatel • Vytvořit příliš procesů • Naalokovat hodně paměti • Jádro udělá dereferenci a spadne • Nejčastější druhy • DDoS • Paket smrti • Neočekávaný vstup od uživatele 7. 12. 2010 12/1 Zneužít stroj a K získání administrátorských oprávnění • Složitější • Musí se předat „divný" ukazatel • Jádro udělá dereferenci a spustí náš kód • Obtížná část: • Zjistit, jak se dá díra zneužít • Vyrobit správná data, která podstrčit • Nepřepsat toho příliš mnoho, aby nedošlo k pádu J. Slabý (ITI) PB173/01 7. 12. 2010 13/1 Vyrobit si e-mail relay pro spamy Upravit jakoukoliv službu Ukrást peníze/vědomosti (vláda, armáda) Skrýt se v systému (rootkit) a sbírat data • Změnit tabulku systémových volání • is /proč a ps neuvidí proces • Napsat vlastní readdir s patřičným filtrem • Najít tabulku např. přes /proc/kallsyms • Změnit tabulku a volat původní readdir • Podobně pro přerušení • Stisky klávesnice (hesla) apod. Úkol Buffer overflow příklad O Prostudujte pb173/11/hack • Uživatelský proces: user • Jaderný modul: kern 0 Přeložit a vložit modul O Nastavit práva /dev/my_name na 666 O Pod běžným uživatelem spustit pb173: • pbl73 0 /dev/my_name (nezneužít díru) • pbl73 1 /dev/my_name (zneužít díru) 0 Opravit díru ve write • pbi73 i /dev/my_name nesmí skončit s úspěchem J. Slabý (ITI) PB173/01 7. 12. 2010 15/1