Linux
如何在沒有 grsecurity 的情況下模擬 /proc/sys/kernel/grsecurity/deny_new_usb?
如何在沒有 Grsecurity 更新檔的情況下在執行時靈活啟用和禁用插入新的 USB 設備(執行負責這些設備的驅動程式碼)?
是否有其他方法或具有此功能的替代核心更新檔?
**重新打開:**關於提出的重複問題的差異和評論如何安全地將 USB 記憶棒/設備插入 Linux 電腦?
- 連結的問題詢問總是選擇性地接受某些設備,這個問題詢問在選定的時間接受所有設備(並在其他時間拒絕任何事情)。
- 主要答案(USBGuard)是使用者態解決方案。它似乎只能阻止 udev 操作。它不太可能阻止掃描塊設備以查找分區、創建網路介面和查詢其元數據或註冊某些
/dev/input/eventX
節點。核心中的攻擊面似乎暴露了。- 另一個答案部分連結到 Grsecurity,這個問題的陳述明確排除了這一點。
據我記得,有計劃讓螢幕鎖定的桌面 Linux 系統在螢幕解鎖之前不接受任何 USB 設備。這意味著某處可能有一些關於此的更新檔。
這是我的 Linux 核心版本 4.19.18 的更新檔:
From e5be5f1e696f5d41d992ac67d688c40045e81e95 Mon Sep 17 00:00:00 2001 From: Vitaly _Vi Shukela <vi0oss@gmail.com> Date: Tue, 29 Jan 2019 21:01:08 +0300 Subject: [PATCH] Introduce dev.deny_new_usb sysctl flag --- drivers/usb/core/hub.c | 9 +++++++++ kernel/sysctl.c | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index cc62707c0251..fb4483b80bac 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -46,6 +46,9 @@ * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ static DEFINE_SPINLOCK(device_state_lock); +/* Skip handling of USB device plugging. Like /proc/sys/kernel/grsecurity/deny_new_usb. */ +int deny_new_usb __read_mostly = 0; + /* workqueue to process hub events */ static struct workqueue_struct *hub_wq; static void hub_event(struct work_struct *work); @@ -4933,6 +4936,12 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, goto done; return; } + + if (deny_new_usb) { + printk(KERN_WARNING "Denying insertion of new USB device because of /proc/sys/dev/deny_new_usb is set to nonzero"); + goto done; + } + if (hub_is_superspeed(hub->hdev)) unit_load = 150; else diff --git a/kernel/sysctl.c b/kernel/sysctl.c index f77df9f5fdb5..b0c14ad347c7 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -114,6 +114,8 @@ extern unsigned int sysctl_nr_open_min, sysctl_nr_open_max; extern int sysctl_nr_trim_pages; #endif +extern int deny_new_usb; + /* Constants used for minimum and maximum */ #ifdef CONFIG_LOCKUP_DETECTOR static int sixty = 60; @@ -1905,6 +1907,13 @@ static struct ctl_table debug_table[] = { }; static struct ctl_table dev_table[] = { + { + .procname = "deny_new_usb", + .data = &deny_new_usb, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, { } }; -- 2.20.1
它基於來自 Grsecurity 的程式碼。它使用
/proc/sys/dev/deny_new_usb
而不是/proc/sys/kernel/grsecurity/deny_new_usb
.