Grsecurity 패치 없이 런타임 시(이러한 장치를 담당하는 드라이버 코드 실행) 새 USB 장치 삽입을 유연하게 활성화 및 비활성화하려면 어떻게 해야 합니까?
이 기능을 갖기 위한 다른 방법이나 대체 커널 패치가 있습니까?
재개장:제안된 중복 질문에 대한 의견 불일치 및 의견USB 플래시 드라이브/장치를 Linux 컴퓨터에 안전하게 삽입하는 방법은 무엇입니까?
- 연결된 질문은 항상 특정 장치를 선택적으로 수락하는 방법에 대해 묻고, 이 질문은 선택한 시점에 모든 장치를 수락하고 다른 순간에는 모든 장치를 거부하는 방법에 대해 묻습니다.
- 주요 답변(USBGuard)는 사용자 모드 솔루션입니다. udev 작업만 차단하는 것 같습니다. 블록 장치의 파티션 스캔, 네트워크 인터페이스 생성 및 메타데이터 쿼리 또는 특정
/dev/input/eventX
노드 등록을 방지할 가능성은 거의 없습니다. 커널 내부의 공격 표면이 노출된 것으로 보입니다. - 또 다른 대답Grsecurity와 부분적으로 연결되어 있으므로 질문의 진술은 이를 명시적으로 제외합니다.
제가 기억하는 한, 화면 잠금 데스크톱 Linux 시스템에서는 화면 잠금이 해제될 때까지 USB 장치를 허용하지 않도록 할 계획이 있었습니다. 이는 어딘가에 이에 대한 패치가 있을 수 있음을 의미합니다.
답변1
이것은 Linux 커널 버전 4.19.18용 패치입니다.
From e5be5f1e696f5d41d992ac67d688c40045e81e95 Mon Sep 17 00:00:00 2001
From: Vitaly _Vi Shukela <[email protected]>
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
.