使用一定次数后擦除 USB 闪存驱动器内容的脚本/方法

信息安全 USB驱动器 drm 固件
2021-08-27 20:38:06

我有一些带有各种操作系统的可启动拇指驱动器,我打算让别人使用。但是,我需要一种方法来确保 USB 驱动器只能使用一次。因此我的问题 - 有没有办法让 USB 驱动器在使用一定次数后自行擦除?也许在驱动器本身上有脚本或软件/固件?

我已经对该主题进行了一些研究,但是我的搜索几乎没有得到有用的信息。

提前感谢您协助我进行数据权限管理!

4个回答

您需要 DRM,而不是“完整性”解决方案

首先是一个小的词汇精度。您使用的“数据完整性”术语似乎不适用于您的需求。

  • 数据完整性方法将确保闪存驱动器上的数据是真实的和/或不会处于损坏或不连贯的状态,但这似乎不是您关心的问题。
  • 根据维基百科的说法,数字版权管理 (DRM)方法是一个术语,指的是用于限制专有软件、硬件或内容使用的各种访问控制技术

因此,您需要的是 DRM 解决方案,而不是数据完整性解决方案。

可能,但仅限于工业或半工业规模

仅依靠操作系统或任何公开存储在拇指驱动器上的数据没有真正可行的保护。实际上,转储原始拇指驱动器内容并稍后将其恢复以使其恢复原始状态是微不足道的。

因此,您可以忘记自删除内容,标准加密对此无济于事,甚至不要考虑在文件系统的某些未分配区域中存储计数器(这些技巧用于保护 CD-ROM 的90 年代后期,但在这里无济于事)。

其他一些答案建议使用基于 Internet 的服务。这就是支持 DRM 的 PDF 文档的工作方式:文档本身是加密的,每次打开时都会向某些 Adob​​e 服务器请求解密密钥。这可能有效,但您最好确保您的软件请求密钥及其使用的协议不能被反转或重放,否则最终用户将能够绕过您的保护。所有的安全都依赖于此,如果有足够的时间和决心,考虑到你的软件最终会被破坏,这只是利润与所需努力的问题。

我建议的解决方案不需要最终用户进行任何 Internet 访问,并且通过使安全系统远离最终用户,可以很好地防止逆向工程尝试。

基于固件的解决方案

您将需要用户无法访问的东西,这很可能意味着您必须为这项工作定制自己的固件。

按照我的想法,闪存驱动器的存储区域应该分为三个区域:

  • 一个公共和相对较小的区域,其中包含足够的材料来启动启动过程(它需要能够被标准 BIOS 访问),
  • 一个非常小的区域,只有固件可以访问(计算机永远无法访问),存储计数器,可能还有其他一些配置和/或身份验证材料,
  • 最大的区域,只有在内部身份验证成功后计算机才能访问。

引导过程如下:

  1. BIOS 读取可公开访问的引导扇区和初始引导可执行文件,
  2. 这个初始可执行文件使用您的固件启动一些自定义身份验证过程,以解锁对主要数据的访问,
  3. 如果认证成功且未达到最大允许解锁次数,固件会递增其内部解锁计数器(存储在他的私有区域中),然后有效解锁主存储区域,
  4. 一旦可以访问主存储,启动过程就可以像往常一样继续。

潜在的弱点

我可以看到的第一个潜在弱点:

  • 我不知道您打算在此类拇指驱动器上运行哪个应用程序,但是如果您的软件允许最终用户可以尝试提取和复制解锁的内容(无论是直接从 USB 驱动器还是从安装的 RAM 磁盘)这样做(例如,如果他被允许以 root 访问权限打开 shell)。因此,您可能希望限制用户在正在运行的系统上的权限以防止这种情况发生。
  • 您的初始启动可执行文件可能会使用一些混淆技术来防止身份验证过程被轻易泄露。在坚定的攻击者手中,期待死分析和实时分析,因为他们可以例如将您的拇指驱动器连接到虚拟机以模拟启动过程并分析初始可执行文件和拇指驱动器之间的交换。好消息是,即使身份验证过程和机密被反转,这也不会允许篡改解锁计数器或解锁已经锁定的拇指驱动器
  • 您的固件可能是可覆盖的。在为您的芯片选择供应商时,您必须确保他们提供锁定任何进一步更新或重写您的固件代码的可能性。这可能并不明显,但实际上有很多 USB 设备可以由最终用户重写固件,请参阅BadUSB由于您的安全性依赖于您的固件,因此这可能是您的一个重要标准。
  • 如果该值足够高,一个坚定的攻击者可能愿意直接访问存储在拇指驱动器内的 NAND 存储芯片中的数据。如果您担心这一点,您可能希望在固件中实现即时加密,以便系统地加密所有存储的数据。

可行性/可信度

  • 定制闪存驱动器:通过快速搜索,我可以找到几个具有可定制固件的开源 USB 密钥,它们已经在零售和批发中提供,但它们的目标是更有利可图的安全令牌市场,这意味着它们为密钥添加了更昂贵的加密硬件。大多数情况下,可以以更低的价格找到更便宜的已经制造的 USB 密钥。

  • 自定义固件:创建自己的固件可能听起来技术含量很高,但我认为并非如此。USB 芯片供应商还提供相关的开发框架,其中包括作为 USB 低级操作的抽象级别的库和用户自定义代码的占位符。作为示例,这里是此类库的随机文档,因此您可以自己了解一下。主要的先决条件是知道如何编写 C 应用程序,如何使用 IDE,并且对 USB 的工作原理只有基本的了解。

  • 划分存储区域并控制对每个区域的访问:这不是我的发明,据我所知,这是SD 卡的 DRM 扩展的实现方式。要了解有关此主题的更多信息,本规范是保密的,但尽管有保密协议,但其中的某些部分(至少)在 Internet 上泄露。我不是在重新发明轮子。

  • 动态加密:已经有 USB 令牌提供动态加密,但是为了获得良好的性能,它们捆绑了一些加密硬件。由于加密不是您在这里的首要目标,如果您确实需要加密存储区域(即,如果您担心您的用户会将您的闪存盘拆开并直接访问原始 NAND 芯片内容),您仍然可以没有这样的硬件,但你将不得不限制自己使用非常低资源的算法。事实上,由于闪存驱动器的计算资源有限,您可能更倾向于某些数据混淆方案,而不是真正的高度安全的加密算法。

也许你在这里落入了XY 问题的陷阱。您确定答案在于 USB 如何自毁而不是采取一些标准的许可措施?即,如果您可以自信地说操作系统将依赖互联网连接 - 您可以在第一次使用后轻松阻止它。

实际上,如果您实际上要问的是如何保护磁盘上的实际内容(即不得访问文件)-它们真的,真的不应该在您计划分发的 USB 驱动器上第一名。如果没有对他们机器的特定级别的控制,想要人们读取文件内容,但只读取一次是不可能的。

如果您的引导系统要访问 Internet 或 Intranet,您可以通过使用 USB 驱动器启动的网络安装完成安装来积极控制该过程。

您将使用 USB 进行混合 PXE 引导安装,实际启动引导和一级安装。考虑使用 USB 安装来安装功能最少的操作系统,然后将真实的操作系统映像作为 ISO 文件从网络中提取。如果您需要此实例仅运行一次,则将网络映像移动到 RAM 并挂载环回。

使用次数的控制权将委托给传回 ISO 安装映像的网络服务器。

也可以制定此方案来解决安装中止或可能出错的许多事情之一的情况。如果计划进行许多安装,则一次性完成的计划需要计划 B,并且此方案可以允许在不发送另一个 USB 的情况下批准第二次尝试。

如果整个操作系统启动并驻留在 RAM 中(如小狗操作系统),那么您可以(理论上)在启动结束时运行一个脚本,该脚本运行一个像Disk WipeShred这样的软件来删除所有数据在磁盘。

这仍然是非常有情境的,但值得一试。