【问题标题】:How can I make a file trully immutable (non-deletable and read-only)?如何使文件真正不可变(不可删除和只读)?
【发布时间】:2009-08-26 10:42:17
【问题描述】:

我需要将文件设为真正的只读文件 - 以保持原样。不删除,什么都没有。

(设置 'ReadOnly' 属性不是一个选项)

我现在看到了一些方法:

  1. 使用程序使文件保持打开状态。缺点:可以杀死进程然后文件关闭。

  2. 使用程序设置安全属性。缺点:文件可以删除。此外,属性可以改回来。

有什么想法吗?此外,我们将不胜感激提供示例代码(最好在 Delphi 中)。

更新:感谢到目前为止的所有答案。他们真的很棒。我意识到我不是很清楚。我们要解决的问题是这样的:

有些类似 .txt 的文件包含敏感信息。我们的客户希望确保这些文件不会在他们的计算机上“幕后”更改。我们应该提到,他们的 PC 很容易被专门针对此操作的恶意软件感染。我们的客户应该能够使用记事本、写字板等打开这些文件,但他们接受这些文件是只读的。如果我们的任何客户采取果断行动,例如进入“安全模式”等并从那里篡改文件,他们将承担责任。我们应该保护他们免受任何恶意软件的侵害,包括零日攻击。 (因此,经典的防病毒解决方案不太合适)。

你现在能给出一些想法吗?

PS:我再次最诚挚的道歉,因为我从一开始就没有那么清楚。

【问题讨论】:

  • 我不想听起来粗鲁,但你总能找到“缺点”。如果您将其刻录到 ROM 中,有人可能会用锤子对其进行攻击并对其进行物理破坏。如果你用机械臂把它刻在一块巨大的大理石岩石上,时间和天气会在几百万年内毁掉它。作为一名工程师,您必须权衡利弊。在这种情况下,我认为理想的平衡是使用文件系统权限来保护它。
  • 没有像 CD-ROM 这样的只读媒体是不可能的。即使这样,恶意软件也可以修改内核以在请求这些文件时返回不同的信息,从而使这些文件看起来与该计算机不同。
  • WRT 编辑,这更有意义,但提供一个合理的解释来解释为什么你想做一些不可能的事情并不能使它成为可能。在这种特定情况下,我会尝试加密有问题的文件并添加校验和以确保恶意软件不会篡改它们。

标签: windows security delphi winapi


【解决方案1】:

这是“如果这是真的会发生什么?”之一。问题。它与操作系统无关,这些点同样适用于任何通用计算机。

想象一下,有一种方法可以以某种方式创建不可变文件。

  • 有什么办法可以阻止某人用不可变文件(或其中许多)填充文件系统?

  • 如果有人要创建具有操作系统所需路径名的不可变文件(Windows 示例 - 某些用户的 NTUSER.DAT,*nix 示例 - /bin/ls 等)怎么办?

    李>
  • 如果操作系统决定必须移动文件(例如,在碎片整理或以其他方式重组文件系统时)怎么办?

  • 如果恶意软件将系统文件替换为自身的副本,然后使该文件不可变以防止任何人清理系统,该怎么办?

我觉得这个问题不像现在这样不完整。您能否对其进行编辑以包含有关您要解决的潜在问题的更多详细信息?

【讨论】:

  • +1。它与 Delphi 或 Windows API 无关,仅与“错误意义上的”安全性有关。
【解决方案2】:

你不能这样做,原因很简单,你不应该被允许这样做。正如 Mihal 所指出的,这有可能对计算机造成严重破坏。

编程道德 101:如果您的程序要在其他人的计算机上运行,​​请记住这是他们的财产,而不是您的财产。这意味着他们有权修改和/或删除他们想要的任何内容。尝试将系统视为您的财产,他们会将您的程序视为恶意软件。

如果您需要确定某个文件是否可用,这可能是最好的解决方案,Massif 的想法是将其作为资源嵌入您的程序中。这样一来,只有有人篡改了 EXE 才能阻止您使用它,如果发生这种情况确实,那么无论如何您都会有更大的问题需要担心。

【讨论】:

  • “尝试将系统视为您的财产,他们会将您的程序视为恶意软件。”太棒了!
  • 很高兴你喜欢它。我只是希望更多的编码人员能把它铭记在心。
  • 具有讽刺意味的是,它使病毒扫描程序更像恶意软件。
【解决方案3】:

刻录一张CD。

【讨论】:

  • 就是这样!像 PROM 答案一样,将文件放在一次写入媒体上。这是唯一的方法。如果你把它放在任何类型的可重写媒体上,它就永远是不可变的;即使驱动器损坏也不行。
  • 赞成。这是一个很酷的主意。开箱即用的思考。印象深刻!
【解决方案4】:

确保这些文件不会在“幕后”更改的一种方法是向文件添加签名。

要签署文件,您可以例如: 用文件的全部内容 + 密码创建一个字符串,并计算该字符串的 SHA1-Hash。然后在文件的第一行或最后一行添加这个哈希。

检查签名: 读取文件,删除带有哈希的行,添加密码,重新计算哈希并检查它是否与文件中的相同。

要使用 Delphi 计算 SHA-1-Hashes,例如可以使用 MessageDigests。

【讨论】:

  • +1 是的,散列是个好主意。如果您真的很偏执,您甚至可以使用 PGP/GPG 密钥对其进行签名。
  • 这就是我的想法——如果您可以更改驱动器上的信息,恶意软件也可以更改它。对于那些认为 ROM 是最高安全性的人:文件系统调用可以被挂钩,恶意软件可以动态替换文件。所以,这个答案在这里最有用,拿+1。
  • (PS 不要使用 SHA-1,因为它现在很旧,使用更新/更强的算法)
【解决方案5】:

购买一个 PROM 和一个微控制器编程器套件,然后将您的文件刻录到 ROM...

【讨论】:

  • ...如果您以后想更改文件,请购买 EEPROM
【解决方案6】:

你注定要失败。如果我启动到安全模式,即使是 Windows 也无法阻止我随意删除文件。

如何在有问题的文件上设置一个观察器,并在它被更改时用一个原始的替换它?还是将文件嵌入到需要它的程序的资源中?

【讨论】:

    【解决方案7】:

    如果我知道如何执行此操作,我会将其作为错误报告给 Microsoft。

    【讨论】:

    • *作为安全漏洞/无懈可击 ;)
    【解决方案8】:

    将其刻录到一次写入媒体。

    【讨论】:

      【解决方案9】:

      你为什么要这个?在我看来,这就像一个奇怪的要求。

      我认为你做不到。我能想到的最好的同类是: 以管理员身份创建文件并设置权限,以便普通用户更改不会更改它(这假定不同的用户)或创建一个应用程序在文件更改时重置文件。

      【讨论】:

        【解决方案10】:

        您可以使用 windows security acls 来保护文件。但是,如果该人可以访问硬件,那么他们总是可以按照地块所说的方式启动到另一种模式或操作系统并删除它。

        【讨论】:

          【解决方案11】:

          Microsoft 的 Raymond Chen 最近刚刚写了一篇与之密切相关的文章:The way to stop people from copying files to a folder is to use NTFS security, not to block drag/drop。虽然这提到试图阻止某人将文件复制到特定文件夹,但您可以使用此处提供的相同解决方案来解决您的问题。

          要正确保护文件并防止篡改,您可以将文件上的 ACL 设置为具有读取权限,但拒绝写入、删除和更改权限。您可以为特定的用户、组甚至每个人设置它!文件的所有者将始终有权更改权限,因此您不能永久锁定自己(即使您尝试拒绝 CREATOR OWNER 特殊对象)。请记住,要从安全对话框手动设置这些,您必须输入高级权限区域,它们在标准页面中不可用。您可能还想中断继承,以便文件只有您设置的权限,而没有来自其父级的权限。

          在这种情况下,最好利用已经存在的选项,这样您就不必尝试破解系统来进行工作。 NTFS 具有强大的安全性,无需编写代码即可完成您想要的工作。您还可以使用与File Security and Access Rights (MSDN) 相关的方法直接通过WINAPI 使用安全性。您可以在调用第一个CreateFile 时提供权限,或者在事后使用SetNamedSecurityInfo 或SetSecurityInfo 更改权限。

          编辑:为了解决恶意软件问题,您甚至可以拒绝SYSTEM 访问,这样即使在系统帐户下运行的服务也无法删除或写入。我实际上已经用这种方法处理了一种讨厌的病毒。它会继续创建一个目录,所以我启动 PE,清空目录,然后拒绝所有人访问它,包括 SYSTEM 帐户。在我努力清除病毒时,该病毒无法传播。

          【讨论】:

          • 一些恶意软件可以绕过 WinAPI 并获得对硬盘驱动器的原始读写访问权限。然后他们可以通过在没有 WinAPI 的情况下重写文件来更改文件...
          【解决方案12】:

          为什么不加密文件并与可执行文件一起打开/关闭它?还是放在你自制的文件系统中?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-17
            • 2014-08-10
            • 2010-09-20
            • 2016-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多