Linux

如何在沒有 grsecurity 的情況下模擬 /proc/sys/kernel/grsecurity/deny_new_usb?

  • February 24, 2019

如何在沒有 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.

引用自:https://unix.stackexchange.com/questions/497463