如何保护MSI不被修改

时间:2019-07-10 11:38:24

标签: c++ c wix windows-installer custom-action

我想保护MSI文件不被修改。使用ORCA或MSI API可以轻松完成。令人遗憾的是,任何人都可以修改/添加/删除具有管理员权限的Windows Installer自定义操作或属性。

是否可以将MSI文件设置为某些只读模式或以某种方式保护其内容?

2 个答案:

答案 0 :(得分:4)

  

简短答案 :您不能真正保护它,也不能保护它,下面尝试解释原因。但是,您可以使用数字证书对MSI进行签名,以确保文件在传输给客户时不会发生变化,从而保护了文件完整性并提高了安全性。


透明度 :MSI文件是透明的,这是有原因的-公司应用程序打包程序希望能够修改程序包以适合公司标准。 This transparency is in fact a core advantage of MSI。因此,我不会保护MSI。编译的自定义操作仍然是“黑匣子”(不可检查,但可以禁用)。

文档和注释 :如果您的MSI具有重要的自定义操作,则可以在MSI或分配的名称中使用“内联”注释来表明这一点进行自定义操作。您还可以交付一页PDF文件(称为 Large Scale Deployment Guide.pdf ?),并在其中描述如何最好地部署应用程序的设置-关键是什么?与MSI无关。我更喜欢将此文档嵌入MSI中,因此它带有administrative installation(这是MSI的文件提取机制),供打包程序查看。公司打包程序通常要做的第一件事是使用管理员安装从MSI中提取文件。

数字签名 :正如其他人所提到的,digital signaturedetails from Advanced Installerdetails from Installshield)有助于确保MSI交付给客户时不变。显然,这在安全方面非常重要。带有SmartScreen(基于信誉的安全性-EV code-signing certificate “购买信任” )这样的新功能,甚至是一个有趣的概念?谁闻到球拍? -))。 请确保您的安装程序没有恶意软件或数字证书,证明您已交付了恶意软件(直到也可以被黑客入侵)。再说说...。Hmmm

恶意软件检测 :请记住,也有必要处理false positives。带有文件上传功能的在线工具非常适合测试。文件大小上传限制适用。只是几个链接:

诸如Process Explorer中的SysInternals之类的工具还可以通过运行您的应用程序,然后选择 Options { {1}} => VirusTotal.com => Video tutorial here(我对此不太看重,不熟悉所讨论的其他产品)。 Check VirusTotal.com

  

应用程序启动 :如果确实需要运行某些程序,则可以将其添加到应用程序启动序列中   而不是您的设置。如果您不需要管理员,这绝对可行   权利。如果您需要向HKLM写入内容,可以打开ACL写入   可供普通用户访问-完全不理想,但有可能。   应用程序启动代码更易于处理。更容易调试   无需假冒,定序和条件限制(当   操作),就像您在设置中一样。

Legacy Setup.exe:如果您坚持要在设置中进行“秘密工作”,则可以使用旧版工具制作常规的setup.exe(不是MSI)。请注意,通过加强安全扫描和恶意软件检测,您的设置可能更容易出现false positives的恶意软件检测问题。销售软件的道路上发生了非常严重的颠簸。对于真正的恶意软件,您会告诉客户重建PC,如果误报,您必须采取措施来解决问题。公司的接受度还可能取决于MSI格式或其他可检查的格式(“ 这是我们的标准”)。而且您应该知道,公司设置中的捕获工具会在将设置转换为MSI(或当今其他格式,例如AppV和MSIX)后,详细了解该设置的作用。

还有另外一个问题:Cross platform installers

答案 1 :(得分:2)

简短的回答是“否”,您不能阻止某人编辑.msi文件。您可以采取多种方法来最大程度地减少某人这样做的可能性,或者增加与任何编辑相关的难度的方法,但是您不能完全避免这种情况。

要更好地回答这个问题,必须细化您所提出的问题。 “保护”听起来像是一个安全问题,因此它至少有助于建立扶手椅威胁模型。例如,您可能想防止以下三件事:

  1. 感兴趣的用户更改了安装到该用户系统的位
  2. 公司用户修改其系统管理员在用户计算机上安装的内容
  3. 恶意方篡改并提供伪装成他人错误安装的应用程序

在这三个中,第一个并不是真正的安全边界,因此您无能为力。这是需要管理员权限并且用户拥有权限的安装,或者是每用户安装,允许没有管理权限的用户使用它。在任何一种情况下,.msi对该系统的访问都不会超过对其进行更改的用户。

第二个跨越边界,但是涉及到应该认真检查签名的人,并且可能从源头而不是从用户那里获取安装。第三个是明显的安全问题,不幸的是涉及到您无法可靠地期望自己在验证签名方面勤奋工作的人。

那你能做什么?

  • 您可以签名.msi文件。如果文件已更改,则留下文件被更改的指示。请注意,转换(.mst文件)can alter时,.msi会执行什么操作,而不会更改文件本身。但这也会影响签名状态的表示。
  • 您可以在接受UAC提示之前尝试教育您的潜在用户有关验证数字签名的重要性。这不会阻止试图颠覆您许可的人,但是可以帮助某人避免安装恶意软件,而不是您的实际程序。
  • 您可以将.msi包裹在已签名的.exe引导程序中。这使事情更难以访问。尝试使用常规工具将无法直接进行,而是需要更改方弄清楚如何提取.msi文件。尽管通常这并不难,但这至少是另一个障碍。
  • 您可以尝试将签名验证插入.msi文件。如您所说,除非进一步将它们与重要且难以复制的其他代码结合使用,否则通过进一步更改.msi文件可能很容易消除这些缺陷。当然,这只会使更改变得更加困难。但并非不可能。同样,您将不得不考虑.mst的情况,以及是否要支持administrative installations和这些缓存中的安装。
  • 您可以向应用程序本身添加相关签名或其他验证。如果.msi文件已更改,但未更改计算机上安装的文件,您的应用程序是否在乎?答案取决于您到底要保护什么?例如,它无助于防止带有标签的恶意软件。
  • 考虑其他打包或部署选项,无论是来自Microsoft(例如.appx / .msix)还是第三方。每个人都有自己的一套优点和缺点,以及我对这里讨论的每件事都有自己的敏感性。
  • 在其他地方运行您的应用;例如,将您的应用程序重写为Web应用程序,以便不进行安装。显然,这仅适用于某些类型的应用程序,但是该列表还在继续增长。

你不能做什么?

  • 让所有用户足够关注
  • 防止恶意方创建伪装为您的应用但只有恶意负载的安装程序
  • 防止计算机所有者在.msi运行之前或之后更改计算机
  • 支持人们使用.msi文件的所有方式,而不仅仅是使用.msi文件(管理安装,转换,“重新打包”,各种.msi特定的部署实用程序等)都是正常的对某些类别的软件使用模式)

在本练习结束时,您必须确定这是否适合您自己或可以接受的交易。确保您了解为什么有人想要更改您的.msi文件,并且在专注于.msi文件本身之前,请考虑他们是否可以通过非.msi方式产生相同的效果。如果它特定于.msi且很麻烦,请研究其他安装技术。如果没有什么可以阻止您试图阻止的情况,也许您可​​以找到减少人们尝试它的动力的方法。