在 Linux 作業系統中,核心模組(LKM)是擴展核心功能的重要方式。本文將從核心模組開發的基礎概念出發,探討系統呼叫表(sys_call_table)的運作原理,以及程序訊號處理機制,供安全研究與作業系統學習參考。
一般來說,使用者可以透過 kill 指令發送訊號來終止進程。常見的訊號包括 SIGTERM(預設終止訊號)與 SIGINT(Ctrl-C 對應的中斷訊號),進程通常可以攔截這兩種訊號並自行處理。然而,SIGKILL(kill -9)則是由核心直接處理,使用者無法攔截,因此常被視為「最終殺手」。
在安全研究中,我們有時會探討如何讓特定進程在異常情況下保持運行,例如透過雙進程互相監控,當一方終止時立即重新啟動另一方。這種機制常用於高可用性服務,而非惡意用途。
所有的 kill 操作最終都會經由系統呼叫進入核心態。在核心態中,程式碼擁有較高的權限,可以更靈活地操作處理序與身份認證。這正是核心模組開發需要格外謹慎的原因:任何錯誤都可能導致系統不穩定,因此必須嚴格遵守程式碼審查與測試流程。
sys_call_table 的位置因核心版本與編譯設定而異,通常可透過系統映射檔案查詢:
cat /boot/System.map-`uname -r` | grep sys_call_table
在核心模組中,開發者可以取得該位址以進行相關研究,但必須注意現代核心已引入 KPP(核心頁面保護)與 SMEP/SMAP 等機制,直接修改系統呼叫表在生產環境中風險極高,僅適合在隔離的實驗環境中進行。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init lkm_init(void)
{
printk(KERN_INFO "LKM module loaded\n");
return 0;
}
static void __exit lkm_exit(void)
{
printk(KERN_INFO "LKM module unloaded\n");
}
module_init(lkm_init);
module_exit(lkm_exit);
MODULE_LICENSE("GPL");載入模組後,可透過 dmesg 查看核心訊息,確認模組是否成功啟動。若需隱藏模組,則應僅在合法的安全審查與滲透測試環境中進行,並取得適當授權。
核心模組開發是理解作業系統內部運作的重要切入點。透過學習系統呼叫表、訊號處理與核心態執行,開發者能更深入掌握 Linux 的安全機制,進而編寫更穩健的系統軟體。