我的问题是关于我使用的缓解措施是否适合我的威胁模型。请不要在没有首先阅读我的威胁模型之前就下结论说“你需要使用锁”或“你不能让你的计算机无人看管”。我不是在为一个看门人辩护,他受贿 200 美元从廉价的 1U 服务器上抢夺硬盘。此外,对大多数面向网络的软件(如浏览器)的利用超出了范围。我在软件级别上有足够的保护,这不是问题(使用自定义 seccomp 过滤器进行强大的权限分离以减少内核攻击面)。如果答案是“绝对没有不涉及定制设计硬件的解决方案”,我会感到失望,但我会接受。
我有一台工作站计算机,我必须 24/7 全天候离开,所以它每天有好几个小时无人看管。它也有很高的计算需求,所以我不能用低功耗版本替换组件(例如,独立的英特尔爱迪生肯定更能抵抗内存获取,但它对我的目的来说太弱了)。大多数寻求物理服务器或工作站安全性的人都认为攻击者具有非常短暂或间歇性的访问权限,而物理锁可以将他们拒之门外。不幸的是,在我的情况下,这几乎完全没用,尽管我当然会锁门。最近我一直在考虑一些更偏执的解决方案,我想要一些建议以确保它正确涵盖我的威胁模型,这样我就可以确定我不会在不需要的领域投入太多精力担心,或忽略我已经敞开的区域。是的,我知道风险评估,这在很大程度上是假设的。我不会把自己置于危险的境地,除非我已经足够熟悉我不需要在这里问的主题。
威胁模型
我的对手有能力:
- 绕过所有物理威慑措施,没有时间限制。
- 在攻击开始时立即拒绝我访问我自己的硬件。
- 将我的硬件运送到远程设施进行扩展分析,而不会失去电源。
- 拥有最先进的取证硬件,如总线分析仪和高级冷冻喷雾。
- 可能会访问我可能使用的硬件组件的商业机密设计文档或数据表,以查找可用于获取访问权限的错误(谁知道 ASPEED 芯片的安全性如何?)。我不知道这种可能性有多大。
- 长时间观察我的公开和在线行为以定制他们的攻击。
但是它们的局限性是:
- 当他们攻击时,我会一直保持警惕,所以他们只有一枪。因此,我不需要篡改证据。
- 他们不能强迫我为他们提供访问权限(不允许使用 5 美元的扳手)。
- 如果计算机已开机但已锁定,则他们无法猜测密码。如果计算机关机,他们无法破解加密密钥。
- 它们还没有达到 NSA 的水平,因此还不允许进行功率分析攻击或硬件后门等尚不实用的攻击。
他们的目标是:
- 获取正在运行的系统的部分或完整但对取证有用的内存映像。
- 获取所有附加存储设备的完整明文内容。
我的目标是以下任何一个:
- 强化系统,使物理访问不足以让我的对手实现他们的目标。
- 让系统在未经授权的物理访问的几秒钟内自行关闭,从而导致物理内存消失。
- 让系统在未经授权的物理访问时对内存造成大量损坏,从而使任何后续的内存转储在取证上毫无用处。
如果在系统没有注意到并自行关闭的情况下获得物理访问,则可能出现内存获取方法的示例:
- 嗅探暴露的总线,例如 PCI、QPI 等。
- 利用暴露的 GPU 硬件通过 PCI 获得 DMA(例如重置 GPU 处理器然后使用 JTAG?)。
- 从英特尔获取 JTAG SDK,然后直接劫持我的主板(到目前为止,除了拆焊之外,我想不出任何可靠的缓解措施,但我会尝试找到一些)。
- 利用我没有限制且我不知道的外围设备处于危险之中。
- 以某种方式硬重启 CPU,这样调试寄存器就不会被清除,并读取它们(以窃取 TRESOR 密钥)。我相信标准规定,在所有重置中,英特尔 CPU 都应该清除调试寄存器,但可能会有一些我不知道的例外情况。
换句话说,他们是州级对手,但不完全是国家安全局的级别。我有一些缓解措施。如果您不想阅读以下文字墙,则可能有不准确的简化的 tl;dr 是:
- 我受到来自大多数受损 PCI 设备的 DMA 攻击的保护。
- 我的存储加密密钥受到冷启动攻击的保护。
- 某些高风险进程的内存部分加密,密钥也位于 RAM 之外。
- 整个内存被轻微加扰,尽管它可能很容易被破坏(编辑:是的,加扰使用 LFSR 进行加扰,这是被破坏的)。
- 如果机箱打开,系统将断电。
- 如果我在系统解锁时从系统中删除,它将关闭。
- 如果被冷冻喷雾击中,内存会自行擦除。
- 如果系统在紧急情况下被不当关闭,加密密钥将变得更难破解。
- 理论上可以修改硬盘驱动器以检测硬件写入阻止程序,并在使用时自行擦除。
- 实时 BIOS 修改将被检测并失败。
- 计算机用摄像头观察自己,如果检测到运动就会关闭。
这些是更详细的缓解措施,以及它们应该缓解的内容:
使用 VFIO 进行 DMA 保护
因为攻击者只会得到一枪,我不必担心他们会取出一些 PCI 设备并用恶意设备替换它,这会发起 DMA 攻击。然而,他们可能能够利用现有的和受信任的 PCI 设备。因此,我使用 VFIO 限制了大多数敏感的 PCI 设备。本质上,我已经将一个包含不受信任的 PCI 设备的 IOMMU 组绑定到 QEMU 中的一个非常小的实时系统,并让 QEMU 将所有通信转发到主机。如果其中一个 PCI 设备遭到破坏,它将只能看到 QEMU 已分配的 32 MiB。到目前为止,所有 USB 控制器都是以这种方式隔离的。网络也通过 USB,而不是以太网,因此大多避免通过英特尔管理引擎。LPC 的 DMA 功能也被禁用,尽管在许多主板上,它成为总线主机的能力在硬件中被禁用。其他 PCI 设备也被简单地禁用。SATA 控制器和 GPU 尚未受到保护,尽管理论上是可行的,我正在努力。虽然 GPU 非常安全(它仅通过 /dev/dri/* 公开,除非 EDID 标头等完全由 GPU 自己的硬件解析),但考虑到 SATA 控制器非常复杂和 NCQ,它确实应该是安全的如果主机允许,则支持客户端->主机 DMA。如果在运行时插入了许多类型的外围设备(不包括一些无害的外围设备,如 PS/2 和串行端口),自定义内核补丁会触发内核恐慌,并且伪硬件 (BIOS) 看门狗会在不久后关闭系统。
TRESOR
磁盘加密密钥使用名为TRESOR的 Linux 内核补丁存储在 x86 调试寄存器中。这确保了密钥本身永远不会碰到 RAM,从而完全缓解了冷启动攻击和被动 DMA 攻击。使用此补丁禁用对调试寄存器的访问以完成保护。缺点是硬复位,例如由三重异常故障触发的硬复位,可能保留调试寄存器,以便引导到的操作系统可以访问它们。当然,ring 0 也可以访问它们。不幸的是,它们只是加密密钥,未加密的进程数据、内核数据、文件系统缓存等仍然存在,因此 TRESOR 远不是一个完整的解决方案。我想我可以创建 /dev/ram0,使用 TRESOR 对其进行加密,然后使用支持 DAX(直接访问,一种完全绕过页面缓存的文件系统功能)的文件系统对其进行格式化,但这也不是一个完整的解决方案。
RamCrypt
最近创建了一个修改版本的 TRESOR,称为RamCrypt,它加密了目标进程的大部分内存,默认情况下只有 4 页未加密。虽然在大多数硬件上 4 个页面只有 16 KiB 的未加密内存,这非常好,但标有 VM_SHARED、VM_IO 或 VM_PFNMAP 的页面未加密。这意味着可能对取证有用的信息仍然可以保持未加密状态。此外,RamCrypt 只加密单个进程,但不加密这些进程的元数据或内核中进程的 task_struct 或其他类似的东西。因此,虽然 Firefox 可能大部分是加密的,但内核中处理 TCP 的平板可能仍会泄露已查看的网站,考虑到与网络堆栈相关的平板是延迟到 RCU 进行销毁的平板,因此它们会徘徊大约最长。如果这还不够糟糕的话,
内存加扰
现代 DDR3 和 DDR4 内存控制器支持一种称为内存加扰的功能,该功能旨在减少内存中相邻线路上过多的 di/dt(换句话说,它可以防止连续的 1 或 0 对内存总线造成电磁干扰)。每次启动时,加扰种子都会重新初始化,可能是由 UEFI 进行的。它足够强大,逆向工程师 Igor Skochinsky 显然无法轻易破解它,但我不知道他是否尝试过。内存加扰可以减轻简单的冷启动攻击,但种子可能在密码学上不安全,特别是考虑到目标只是增加 1 和 0 的分布。如果内存正常,快速阅读部分 Coreboot 源代码会使它看起来可能只有 32 位。可悲的是,市场上似乎没有完整的内存加密解决方案。PrivateCore 声称拥有完全加密内存的 VPS(他们的 vCage 产品线),而 Xbox 据称加密其内存以挫败 RE,但仅此而已。
编辑: 正如我认为加扰不是加密安全的。看起来执行种子恢复的步骤相当复杂,尤其是由于交错会增加丢失数据的数量,而这可能会提供少量保护。而且目前还没有关于DDR4内存的分析,可能会使用更强的种子。希望在未来,英特尔将在他们的 MCH 中使用非常快的密码,例如Simon来进行内存加扰。
在线机箱入侵检测
我的 BIOS 和硬件内置了机箱入侵检测。虽然我还没有实现这一点,但我相信有可能每 0.5 秒左右轮询一次 /dev/nvram 并解析它以获取存储机箱入侵计数的任何值,并且检测到入侵事件后立即关闭系统。如果操作系统无法获取该信息,那么我可能必须实际修改硬件并让它使用 GPIO 或其他东西,但我对此不太熟悉。
腕带
锡纸时间!我打算制作一条腕带,连接到我桌子上的一个设备上,只需轻轻一点力就可以将其拉出。如果我被强行移出该区域,皮带会被拉出,系统会自行关闭。虽然这看起来有点矫枉过正,但它可以让我在最敏感的时候几乎完全安全:我的电脑解锁了一个 root 提示坐在我面前,只是在等待有人 insmod ./crashdev.ko 并从中读取所有物理内存/开发/崩溃。在不使用腕带的所有其他时间,系统将使用 vlock 锁定,其设计方式几乎不可能出现错误。如果 vlock 程序崩溃,您只是被锁定在计算机之外,
RAM 温度轮询
据我所知,冷启动攻击可以通过两种方式进行:1)系统可以重置,并引导到一个提取内存内容的实时系统,或者 2)内存模块被冷却到低温,移除(并可选择进一步冷却),然后插入不同的主板或总线分析仪以进行刷新并直接读取。前者可以通过 BIOS 密码部分缓解,但可以通过移除 CMOS 电池或短接正确的引脚来轻松解决。后者可能会通过反复轮询 DMI 表以获取内存模块温度来击败,如果遇到突然的、莫名其妙的温度下降,则擦除内存然后关闭。我目前使用一个简单的 C 程序来执行此操作。将来,我可能会通过调用它直接从内存中擦除密钥crypt_wipe_key()来自内核模块,并发出 HLT。
因不当停机而硬化
除非正在发生攻击,否则系统不应不正确地关闭。我可以通过两个 LUKS 键槽来利用这一点,它们都使用相同的密码。第一个键槽需要 5 秒的 PBKDF2 时间来处理,而第二个键槽需要非常长的时间(例如 72 小时)。当系统启动时,一个 init 脚本将第一个键槽复制到 tmpfs 并擦除它。当系统正常关闭时,它会将密钥槽写回 LUKS 标头。如果系统在紧急情况下关闭,则该密钥槽将永远丢失,唯一剩下的就是需要很长时间才能散列的密钥槽。最坏的情况是我不小心输入了 poweroff -f 之类的东西,我必须等待 72 小时才能知道我是否输入了密码错误。最好的情况是我的对手几乎完全无法攻击系统,因为任何时候,物理磁盘都将使用密钥加密,该密钥可以以每隔几天尝试一次的速度猜测。在旁注中,我也可以利用 /dev/nvram 的短暂特性,假设它是真正的 NVRAM(如果 /dev/nvram 的大小为 144 字节,则应该是这种情况)而不是 CMOS EEPROM 或某种模拟 NVRAM。它的大部分内存没有被利用,因此它可以(ab)用作一种穷人的 SED,而不是依赖于“企业”近线 SATA 驱动器的闭源固件中设计不良的 SED。假设它是真正的 NVRAM(如果 /dev/nvram 的大小为 144 字节,则应该是这种情况)而不是 CMOS EEPROM 或某种模拟的 NVRAM。它的大部分内存没有被利用,因此它可以(ab)用作一种穷人的 SED,而不是依赖于“企业”近线 SATA 驱动器的闭源固件中设计不良的 SED。假设它是真正的 NVRAM(如果 /dev/nvram 的大小为 144 字节,则应该是这种情况)而不是 CMOS EEPROM 或某种模拟的 NVRAM。它的大部分内存没有被利用,因此它可以(ab)用作一种穷人的 SED,而不是依赖于“企业”近线 SATA 驱动器的闭源固件中设计不良的 SED。
击败硬件写阻止程序
获取合法磁盘映像的一种常见方法是使用硬件写入阻止程序,这是一种小型设备,可将硬盘驱动器连接到计算机并丢弃从计算机到驱动器的所有写入。通常,没有办法阻止这种情况。但是硬盘驱动器包含多个强大的CPU,并且它们所在的大多数板都支持JTAG,这是一种像木偶一样控制CPU的方法。这意味着可以将一个小型设备放入硬盘驱动器并连接到 JTAG 接口,将代码注入硬盘驱动器的内存以改变其行为。以这种方式注入内存比写入硬盘驱动器的持久固件更可取,因为这需要我无法访问的闭源 SDK。如果连续读取特定阈值的扇区,则可以修改该行为,以便驱动器可以启动 ATA 安全擦除,这将指示硬件写入阻止程序。或者,如果不直接读取某个扇区组合(类似于端口敲击......扇区敲击?),驱动器可以启动擦除。这有点像锡纸帽子,但会是一个有趣的项目,可以通过取证分析来强化硬盘驱动器。这不是一个新想法,人们已经这样做了 但是会做一个有趣的项目来通过取证分析来强化硬盘驱动器。这不是一个新想法,人们已经这样做了 但是会做一个有趣的项目来通过取证分析来强化硬盘驱动器。这不是一个新想法,人们已经这样做了JTAG 上的硬盘驱动器有趣的事情。
持续扫描 BIOS 以防篡改
冷启动攻击变得不切实际,尤其是在许多其他缓解措施到位的情况下。但是,在正在运行的系统上修改 BIOS,然后将系统重置为新的 BIOS 可能会产生有趣的后果. 在刚刚链接的案例中,BIOS 直接通过 SPI 进行修改,然后系统通过 LPC 热复位到新的 BIOS,它立即开始通过串行方式将内存的全部内容缓慢地导出到调查人员的计算机。对此的一种缓解方法是让操作系统在连续循环中扫描 BIOS,并验证它自上次读取以来没有被修改过。由于写入 BIOS 比读取它慢得多,这可能会检测到任何正在发生的篡改。然后计算机可以采取防御措施,例如在写入完成之前关闭。我听说有人提到 EEPROM 显然无法处理数百万次读取(不是错字,我说读取),但幸运的是,大多数现代 BIOS 都是 MLC NAND,理论上可以处理无限次读取,
运动感应相机
非常简单,但优于通用机箱入侵检测。我有一个指向工作站的摄像机,连接到工作站,并通过运动程序进行监控。本质上,计算机正在监视自己以确保没有人靠近它。如果有人靠近它,它将采取预先确定的行动,例如关闭。这比机箱入侵检测开关更难规避,因为它需要欺骗摄像头。解决此问题的唯一方法是使相机冻结其当前图像。
再次重申,我的问题是:在这种威胁模型中保护无人值守工作站的其他或更有效的方法是我没有想到的吗?特别是在检测未经授权的访问和使机箱入侵检测更加强大的领域。