我想知道是否可以通过物理访问合理安全的计算机的人利用 USB。例如信息亭或附在桌子上的笔记本电脑。
显然,引导顺序应该是安全的(BIOS/UEFI 设置为“仅限内部磁盘”并受密码保护......)。此外,挂载选项应使用nodev,nosuid,noexec
. 此外,文件应由防病毒/反恶意软件分析。.. 等等。
我真的很担心DMA 攻击等漏洞,用户只需插入 USB 设备即可在内存中提取信息。
可以禁用哪些功能以仍然允许鼠标和键盘但减少攻击面?
我想知道是否可以通过物理访问合理安全的计算机的人利用 USB。例如信息亭或附在桌子上的笔记本电脑。
显然,引导顺序应该是安全的(BIOS/UEFI 设置为“仅限内部磁盘”并受密码保护......)。此外,挂载选项应使用nodev,nosuid,noexec
. 此外,文件应由防病毒/反恶意软件分析。.. 等等。
我真的很担心DMA 攻击等漏洞,用户只需插入 USB 设备即可在内存中提取信息。
可以禁用哪些功能以仍然允许鼠标和键盘但减少攻击面?
在我们开始之前,简要介绍一下 USB 的工作原理。USB 设备连接到计算机内部称为 USB 主机控制器的硬件。这将解码复杂的 USB 协议,该协议与 TCP 等网络协议非常相似,包含数据包、校验和、SYN、ACK 等的等效项。USB 主机控制器解码每个单独连接的 USB 设备并将其呈现给操作系统,其中它可以随心所欲地解释它(例如,作为一个块设备,或鼠标,甚至是拨号调制解调器,你可以命名它)。USB 控制器本身通过 PCI 连接到 PCH(类似于中继站)。它不是一个庞大的 PCI 插槽,但它仍然是 PCI。当您查看系统上 lspci 的输出并看到提到 USB 时,您会看到 USB 控制器。你可能有几个 USB 控制器,每个都通过 PCI 连接到 PCH。PCH 依次连接到 CPU。看这个很棒的 Stack Exchange 帖子,对 USB 控制器的解剖结构进行了非常好的图形描述。
现在让我们将可能的攻击类型分为三个部分。
故意行为
大多数 Linux 发行版会自动挂载带有文件系统的 USB 设备,有些甚至可以自动运行,尽管默认情况下很少启用。在过去的 Windows 中,这更像是一个问题,而在 Linux 中从来都不是真正的问题。但是,USB 3.1 确实支持 DMA,因此您可能希望避免这种情况。我确实相信它默认情况下是禁用的,所以这不是一个巨大的风险。请注意,USB 控制器允许它。
利用软件
分区表解析代码中存在多个漏洞实例,只需插入 U 盘即可通过专门设计但损坏的分区表来利用系统。虽然这种情况非常罕见(我只知道有两个允许任意代码执行),但考虑到文件系统的复杂程度,自动挂载文件系统的漏洞更为常见。它们解析大量结构,并将性能置于几乎所有其他之上,因此除非必要,否则通常不会进行完整性检查。这让位于越来越多的漏洞。但是,即使您没有受到任何这些影响,您最喜欢的桌面环境以及它如何管理显示文件夹内容(例如缩略图生成)也存在大量漏洞......
利用硬件
这是迄今为止最可怕和最难缓解的。虽然(大多数)USB 协议不允许使用 DMA,并且默认情况下也不允许使用,但 USB 控制器通过具有 DMA 功能的 PCI 连接到 PCH。当然,USB 控制器承诺永远不会做坏事,并承诺如果任何恶意 USB 设备拒绝遵循协议,它将告诉他们 fsck 关闭,但控制器肯定有可能被恶意 USB 设备劫持它带有损坏的数据包。一旦它获得了协议的控制权,它就拥有了完整的 DMA 并且可以做任何它想做的事情。避免这种情况的唯一方法是使用 IOMMU 隔离 PCI 设备。有几种方法可以做到这一点,例如使用 Qubes OS,虽然它也有一些缺点,但它专门设计用于防止诸如此类的硬件攻击。或者你可以有创意。我制作了自己的小型可启动 Linux 发行版,我将它与 QEMU/KVM、一种称为 VFIO 的技术、一种称为 usbip 的驱动程序以及一些可以缓解该问题的自定义脚本和程序结合使用。但是如果你依靠你的 IOMMU 来保护你,只要确保它支持中断重映射。否则,它可以很容易地被绕过并且几乎没有安全优势。
USB 3.0 尤其成问题。我不是在谈论 3.1 在主机说 OK 时允许 DMA,而是在内核之外运行。USB 3.0 在 BIOS 中作为二进制 blob 运行,与 Intel 管理引擎非常相似。看到这个和这个。它有一个非常大的攻击面,增加了 USB 主机控制器硬件已经很大的表面积。您可以在许多 BIOS 中禁用它,通常使用“xHCI 控制器”之类的名称。这样做会有效地将所有 3.0 端口转换为 2.0 端口,这会降低它们的速度,但会大大提高安全性。在偏执安全方面,1.0 不好,2.0 不好,3.0 是噩梦。
有一个名为 grsecurity 的内核补丁,它具有大量的安全功能,极大地提高了 Linux 内核的安全性。其中一项安全功能是“拒绝访问新的 USB 设备”,正如它听起来的那样。切换单向设置后或启动后,将不再允许所有新的 USB 设备访问。所有处理 USB 设备的复杂的、可能易受攻击的内核代码都被禁用。它将完全缓解前两个问题,但不幸的是根本没有缓解第三个问题。即使编译自定义内核并删除 USB 驱动程序也不能缓解第三个问题。
是的。一些非常安全(和离线)的网络的利用已经通过 USB 完成。
“noexec”和其他功能并不总是足以防止键盘记录器和其他恶意设备运行。
一个相当好的解决方案是阻止所有 USB 设备,除了那些在 VID/SID(即供应商 ID 和序列号)的小白名单中的设备。只要您保护谁有权访问受信任的 VID 和 SID 列表,这将为您提供良好的安全性。
WINDOWS:在多个版本的 Windows 上执行此操作的软件是:http: //www.newsoftwares.net/usb-block/