中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么增強Linux內核中的訪問控制安全

發布時間:2021-10-24 16:30:38 來源:億速云 閱讀:489 作者:小新 欄目:系統運維

這篇文章主要為大家展示了“怎么增強Linux內核中的訪問控制安全”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么增強Linux內核中的訪問控制安全”這篇文章吧。

Linux中常見的攔截過濾

  • 用戶態動態庫攔截。

  • 內核態系統調用攔截。

  • 堆棧式文件系統攔截。

  • inline hook攔截。

  • LSM(Linux Security Modules)

動態庫劫持

Linux上的動態庫劫持主要是基于LD_PRELOAD環境變量,這個環境變量的主要作用是改變動態庫的加載順序,讓用戶有選擇的載入不同動態庫中的相同函數。但是使用不當就會引起嚴重的安全問題,我們可以通過它在主程序和動態連接庫中加載別的動態函數,這就給我們提供了一個機會,向別人的程序注入惡意的代碼。

假設有以下用戶名密碼驗證的函數:

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char **argv) { char passwd[] = "password"; if (argc < 2) { printf("Invalid argc!\n"); return; } if (!strcmp(passwd, argv[1])) { printf("Correct Password!\n"); return; } printf("Invalid Password!\n"); }

我們再寫一段hookStrcmp的程序,讓這個比較永遠正確。

#include <stdio.h> int strcmp(const char *s1, const char *s2) { /* 永遠返回0,表示兩個字符串相等 */ return 0; }

依次執行以下命令,就會使我們的hook程序先執行。

gcc -Wall -fPIC -shared -o hookStrcmp.so hookStrcmp.c export LD_PRELOAD=”./hookStrcmp.so”

結果會發現,我們自己寫的strcmp函數優先被調用了。這是一個最簡單的劫持  ,但是如果劫持了類似于geteuid/getuid/getgid,讓其返回0,就相當于暴露了root權限。所以為了安全起見,一般將LD_PRELOAD環境變量禁用掉。

Linux系統調用劫持

最近發現在4.4.0的內核中有513多個系統調用(很多都沒用過),系統調用劫持的目的是改變系統中原有的系統調用,用我們自己的程序替換原有的系統調用。Linux內核中所有的系統調用都是放在一個叫做sys_call_table的內核數組中,數組的值就表示這個系統調用服務程序的入口地址。整個系統調用的流程如下:

怎么增強Linux內核中的訪問控制安全

當用戶態發起一個系統調用時,會通過80軟中斷進入到syscall  hander,進而進入全局的系統調用表sys_call_table去查找具體的系統調用,那么如果我們將這個數組中的地址改成我們自己的程序地址,就可以實現系統調用劫持。但是內核為了安全,對這種操作做了一些限制:

  • sys_call_table的符號沒有導出,不能直接獲取。

  • sys_call_table所在的內存頁是只讀屬性的,無法直接進行修改。

對于以上兩個問題,解決方案如下(方法不止一種):

  • 獲取sys_call_table的地址 :

  • grep sys_call_table /boot/System.map-uname -r
  • 控制頁表只讀屬性是由CR0寄存器的WP位控制的,只要將這個位清零就可以對只讀頁表進行修改。

/* make the page writable */ int make_rw(unsigned long address) { unsigned int level; pte_t *pte = lookup_address(address, &level);//查找虛擬地址所在的頁表地址 pte->pte |= _PAGE_RW;//設置頁表讀寫屬性 return 0; }
/* make the page write protected */ int make_ro(unsigned long address) { unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte &= ~_PAGE_RW;//設置只讀屬性 return 0; }

1. 開始替換系統調用

本文實現的是對 ls這個命令對應的系統調用,系統調用號是__NR_getdents。

static int syscall_init_module(void) { orig_getdents = sys_call_table[__NR_getdents]; make_rw((unsigned long)sys_call_table); //修改頁屬性 sys_call_table[__NR_getdents] = (unsigned long *)hacked_getdents; //設置新的系統調用地址 make_ro((unsigned long)sys_call_table); return 0; }

2. 恢復原狀

static void syscall_cleanup_module(void) { printk(KERN_ALERT "Module syscall unloaded.\n"); make_rw((unsigned long)sys_call_table); sys_call_table[__NR_getdents] = (unsigned long *)orig_getdents; make_ro((unsigned long)sys_call_table); }

使用Makefile編譯,insmod插入內核模塊后,再執行ls時,就會進入到我們的系統調用,我們可以在hook代碼中刪掉某些文件,ls就不會顯示這些文件,但是這些文件還是存在的。

堆棧式文件系統

Linux通過vfs虛擬文件系統來統一抽象具體的磁盤文件系統,從上到下的IO棧形成了一個堆棧式。通過對內核源碼的分析,以一次讀操作為例,從上到下所執行的流程如下:

怎么增強Linux內核中的訪問控制安全

內核中采用了很多c語言形式的面向對象,也就是函數指針的形式,例如read是vfs提供用戶的接口,具體底下調用的是ext2的read操作。我們只要實現VFS提供的各種接口,就可以實現一個堆棧式文件系統。Linux內核中已經集成了一些堆棧式文件系統,例如Ubuntu在安裝時會提醒你是否需要加密home目錄,其實就是一個堆棧式的加密文件系統(eCryptfs),原理如下:

怎么增強Linux內核中的訪問控制安全

實現了一個堆棧式文件系統,相當于所有的讀寫操作都會進入到我們的文件系統,可以拿到所有的數據,就可以進行做一些攔截過濾。

以下是我實現的一個最簡單的堆棧式文件系統,實現了最簡單的打開、讀寫文件,麻雀雖小但五臟俱全。

https://github.com/wangzhangjun/wzjfs

inline hook

我們知道內核中的函數不可能把所有功能都在這個函數中全部實現,它必定要調用它的下層函數。如果這個下層函數可以得到我們想要的過濾信息內容,就可以把下層函數在上層函數中的offset替換成新的函數的offset,這樣上層函數調用下層函數時,就會跳到新的函數中,在新的函數中做過濾和劫持內容的工作。所以從原理上來說,inline  hook可以想hook哪里就hook哪里。

怎么增強Linux內核中的訪問控制安全

inline hook 有兩個重要的問題:

  • 如何定位hook點。

  • 如何注入hook函數入口。

1. 對于***個問題:

需要有一點的內核源碼經驗,比如說對于read操作,源碼如下:

怎么增強Linux內核中的訪問控制安全

在這里當發起read系統調用后,就會進入到sys_read,在sys_read中會調用vfs_read函數,在vfs_read的參數中正好有我們需要過濾的信息,那么就可以把vfs_read當做一個hook點。

2. 對于第二個問題:

如何Hook?這里介紹兩種方式:

  • ***種方式:直接進行二進制替換,將call指令的操作數替換為hook函數的地址。

  • 怎么增強Linux內核中的訪問控制安全

  • 第二種方式:Linux內核提供的kprobes機制。

其原理是在hook點注入int  3(x86)的機器碼,讓cpu運行到這里的時候會觸發sig_trap信號,然后將用戶自定義的hook函數注入到sig_trap的回調函數中,達到觸發hook函數的目的。這個其實也是調試器的原理。

LSM

LSM是Linux Secrity  Module的簡稱,即linux安全模塊。是一種通用的Linux安全框架,具有效率高,簡單易用等特點。原理如下:

怎么增強Linux內核中的訪問控制安全

LSM在內核中做了以下工作:

  • 在特定的內核數據結構中加入安全域。

  • 在內核源代碼中不同的關鍵點插入對安全鉤子函數的調用。

  • 加入一個通用的安全系統調用。

  • 提供了函數允許內核模塊注冊為安全模塊或者注銷。

  • 將capabilities邏輯的大部分移植為一個可選的安全模塊,具有可擴展性。

適用場景

對于以上幾種Hook方式,有其不同的應用場景。

  • 動態庫劫持不太完全,劫持的信息有可能滿足不了我們的需求,還有可能別人在你之前劫持了,一旦禁用LD_PRELOAD就失效了。

  • 系統調用劫持,劫持的信息有可能滿足不了我們的需求,例如不能獲取struct file結構體,不能獲取文件的絕對路徑等。

  • 堆棧式文件系統,依賴于Mount,可能需要重啟系統。

  • inline hook,靈活性高,隨意Hook,即時生效無需重啟,但是在不同內核版本之間通用性差,一旦某些函數發生了變化,Hook失效。

  • LSM,在早期的內核中,只能允許一個LSM內核模塊加載,例如加載了SELinux,就不能加載其他的LSM模塊,在***的內核版本中不存在這個問題。

以上是“怎么增強Linux內核中的訪問控制安全”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

容城县| 博白县| 富宁县| 霍州市| 土默特左旗| 巩留县| 罗江县| 吉林省| 揭阳市| 河间市| 绥阳县| 新乐市| 张家界市| 彰化县| 抚州市| 峨眉山市| 上虞市| 新野县| 绵阳市| 临高县| 肥乡县| 利辛县| 固镇县| 密山市| 方正县| 合肥市| 宁安市| 耿马| 巴南区| 伊川县| 洮南市| 策勒县| 水城县| 巴彦淖尔市| 大兴区| 苍溪县| 固阳县| 渝中区| 时尚| 潜江市| 疏勒县|