当攻击者可以物理访问工作站时减少取证内存获取

信息安全 硬件 身体的 威胁建模 物理访问 防篡改
2021-08-21 06:20:20

我的问题是关于我使用的缓解措施是否适合我的威胁模型。请不要在没有首先阅读我的威胁模型之前就下结论说“你需要使用锁”或“你不能让你的计算机无人看管”。我不是在为一个看门人辩护,他受贿 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,理论上可以处理无限次读取,

运动感应相机

非常简单,但优于通用机箱入侵检测。我有一个指向工作站的摄像机,连接到工作站,并通过运动程序进行监控。本质上,计算机正在监视自己以确保没有人靠近它。如果有人靠近它,它将采取预先确定的行动,例如关闭。这比机箱入侵检测开关更难规避,因为它需要欺骗摄像头。解决此问题的唯一方法是使相机冻结其当前图像。

再次重申,我的问题是:在这种威胁模型中保护无人值守工作站的其他或更有效的方法是我没有想到的吗?特别是在检测未经授权的访问和使机箱入侵检测更加强大的领域。

4个回答

绕过所有物理威慑措施,没有时间限制。

在场外安装带有监控安全解决方案的摄像头,例如,当出现异常情况时,ADP 会报警。如果您使用的是钥匙卡,您可以创建一个执行以下操作的脚本:“如果此关键任务系统停止响应探测,请锁上所有门,不允许任何人出去。”

在攻击开始时立即拒绝我访问我自己的硬件。

这必须是物理的。你的意思是把自己关在一个你进不去的房间里吗?如果不是,则应用相同的脚本逻辑:“如果系统 X 停止响应探测,请登录交换机并完全关闭端口。”

将我的硬件运送到远程设施进行扩展分析,而不会失去电源。

这将在锁门实例中得到解决。

可能会访问我可能使用的硬件组件的商业机密设计文档或数据表,以查找可用于获取访问权限的错误(谁知道 ASPEED 芯片的安全性如何?)。我不知道这种可能性有多大。

尽量减少对您在此系统上部署的文档的访问,以遵循最低权限原则。

长时间观察我的公开和在线行为以定制他们的攻击。

他们将如何在“风险意识”环境中执行此操作。他们需要破坏您的机器/凭据,或者处于错误的网络环境中才能完成此操作(嗅探)。为了尽量减少这种情况,您可以安装 SIEM 并将其转换为挤压检测。制定一条“这是我的用户名,这是我的机器”的规则。如果您看到与我的用户名相关但不是来自我的机器的任何内容,请立即提醒我。

获取正在运行的系统的部分或完整但对取证有用的内存映像。

为此,他们需要本地访问权限。要做到这一点,他们必须得到信任。如果机器被锁定在受控环境(钥匙卡、监控等)中,则很难将其关闭。解决方案将是一种威慑措施:“任何被发现做任何事情的人都将被解雇/起诉/等等”以及在场外维护的摄像机。

强化系统,使物理访问不足以让我的对手实现他们的目标。

你如何提出这个建议。鉴于你所说的一切,你需要一个钛金属外壳,当设备被拔掉或篡改时,它可以用来电击(致命)某人。

让系统在未经授权的物理访问的几秒钟内自行关闭,从而导致物理内存消失。

您可以使用脚本(perl、python、powershell)执行此操作。例如:“系统 X:探测此地址(路由器、交换机等),如果您在 500 毫秒内关机后没有得到响应”,问题将是如果您的网络出现故障,您的机器将处于不断重启的状态。

让系统在未经授权的物理访问时对内存造成大量损坏,从而使任何后续的内存转储在取证上毫无用处。

到目前为止很难完成,您推断您甚至不信任受信任的用户。

--- tl;现在的博士版本。

您担心有人窃取系统并希望保护内存和/或物理篡改。

  1. 内存擦除可以通过我所说的脚本示例来完成:“如果我在 X 时间内没有收到对我发送的探测的响应,请关闭/运行此命令等”
  2. 数据擦除脚本:“如果我通电 N 时间,并且我没有收到来自我的探针的响应,则擦除磁盘”
  3. 设施锁定:如果机器在毫秒范围内没有响应,则编写脚本以密封所有门(如果它们由钥匙卡控制)
  4. 带有 24x7 监控的场外摄像机在门被锁定时呼叫当局。然后向所有访问这台机器的员工/用户创建一条消息,吹嘘你在它上面的安全级别。对其进行测试(灾难恢复模式),让所有人看到:“如果这台机器离线,当局将来到这个设施”(类似于珠宝店)

到目前为止,您尚未涵盖的潜在攻击向量称为“声学密码分析”,尽管我不知道这是否与您的情况相关。一些专家实际上可以使用 CPU 发出的声音(人类听不到)来确定 RSA 密钥。
http://www.cs.tau.ac.il/~tromer/acoustic/
目前我还没有想到一个实用的解决方案(也许是一个带有液体冷却而不是空调的隔音外壳?)。

说到声音:我认为这也是值得注意的:
https
://www.insidescience.org/content/computers-can-be-hacked-using-high-frequency-sound/1512 但长话短说:确保有登录时工作站附近没有“未经授权”的设备。

你说没有“时间上的硬性限制”。但是,他们可以将工作站连接到便携式电池并随身携带。我猜如果攻击者可以将工作站带入自己的实验室,他们就有更多的可能性。
可能的解决方案:

  • 检测电源的微小波动
  • 检测外围设备是否有任何变化。我认为移动带有显示器的计算机要困难得多。

[通常会使用评论进行澄清,但我现在还不能这样做]
你说攻击者有一枪。这是否也适用于工作站所在房间的违规行为?

我认为这是一个理论场景?如果您有真正接近 NSA 级别的攻击者对您进行有针对性的攻击,并且他们在物理上很接近 - 您遇到的问题比我可以帮助您解决的要大。在那种情况下,我怀疑 5 美元扳手的变体会起作用。

正如您在他们攻击时会意识到的那样,我们可以排除“邪恶女仆”攻击。真正值得关注的攻击类型似乎是冷启动攻击和现场“总线注入”。您似乎已经很好地涵盖了其他所有内容。

您在问题中提到了两种主要方法:加密内存和检测入侵。

尝试检测入侵的问题在于聪明的攻击者可以绕过您的检测器。如果您有机箱打开开关,他们可以钻穿机箱的侧面。内存温度传感器 - 在冷却内存的同时加热传感器。即使他们不知道你有什么探测器,他们也可以对系统进行 X 光检查以了解情况。我不认为为此目的可以信任入侵检测器。

使用 TRESOR / RamCrypt 加密内存非常适合您的用例。理论上是 CPU 不信任任何外部系统。所有总线访问都由 IOMMU 调节,并且内存是加密的。解密密钥存在于寄存器中的固有风险,因此可能有人可以以高级方式分析 CPU 以提取它们。但是您将这种攻击视为“不完全是 NSA 的水平”。我更担心存在让某人绕过 RamCrypt 的实现错误。例如,可能存在一个 Intel Management Agent 漏洞,当您篡改内存中的特定字节时,该漏洞可让您进入。鉴于 RamCrypt 相对较新,并且存在较大的攻击面,它'

我认为您的威胁模型的一部分会适得其反:

绕过所有物理威慑措施,没有时间限制。

这是不现实的——足够强大的物理威慑可以阻止他们。在现实世界的场景中,您想要做的是创建物理安全性 - 将计算机放在保险箱中。有设计用于存放正在运行的计算机的保险箱——我在高度敏感的设施中见过它们——尽管我手头没有型号。您可以将其与入侵检测系统结合使用,因此如果有人试图闯入保险箱,它会向计算机发出警报并擦除内存。我更信任保险箱上的指令检测,而不是电脑机箱上的指令检测。

摄像头记录登录

这种口径的对手可以安装摄像头来记录您的键盘登录。尽管可以使用热像仪,但技术含量较低的解决方案是有一个键盘盖。所以选择合适的面料是关键。技术解决方案将是 2 因素(即智能卡、生物识别等)。在您的情况下,似乎最好使用 2 因素方法的组合。

复制系统

您的对手很可能能够使用您当前使用的硬件构建一个重复的系统。他们可以毫无问题地触发不正确的关机以对磁盘进行映像并将其带到复制系统上。感谢 LUKS 等待 72 小时,但这没什么大不了的,因为您的登录是由他们的相机记录的。

网络通讯

拥有物理访问权限还意味着您的对手可以访问您的所有网络通信。成功的中间人攻击可能会在您的系统上植入他们的木马。这使得物理访问没有意义,因为您的系统将被成像/检查/等。在电线上。