如何保护 MSI 不被修改

How to protect MSI against modification

我想保护 MSI 文件不被修改。使用 ORCA 或 MSI API 可以轻松完成。令人难过的是,任何人都可以 modify/add/remove windows 安装程序自定义操作或具有管理员权限的属性。

有没有办法将 MSI 文件设置为某种只读模式或以某种方式保护其内容?

Short Answer: You can't really protect it, and you shouldn't either, and the below tries to explain why. You can, however, sign the MSI with a digital certificate in order to ensure the file is unchanged in transit to the customer, hence protecting file integrity and facilitating better security.


Transparency:MSI 文件是透明的是有原因的——企业应用程序打包者希望能够修改包以符合企业标准. This transparency is in fact a core advantage of MSI。因此,我不会努力保护 MSI。已编译的自定义操作仍然 "black box"(不可检查,但可以禁用)。

文档和评论:如果您的 MSI 具有重要的自定义操作,您可以使用 "inline" 评论指出这一点在 MSI 中,或者可能在分配给自定义操作的名称中。您还可以提供一页 PDF 文件(称之为 Large Scale Deployment Guide.pdf?)以及描述如何最佳部署的设置您的应用程序 - 以及最重要的是什么不能用 MSI 做。我更喜欢将此文档嵌入到 MSI 中,因此它带有一个 administrative installation - 这是 MSI 的文件提取机制 - 供打包程序查看。公司打包程序通常做的第一件事是使用管理员安装从 MSI 中提取文件。

数字签名:正如其他人提到的digital signature (details from Advanced Installer, details from Installshield) helps to ensure the MSI is unchanged on delivery to customers. This is obviously of major importance security-wise. This is even more of an issue with new features such as SmartScreen (reputation-based security - an EV code-signing certificate "buys trust" - interesting concept? Who smells a racket? :-) ). Be sure that your setup is malware free or a digital certificate is proof positive that you delivered the malware (until that is hackable too). And speak of the.... Hmmm.

Malware Detection:记住,对付false positives也是必须的。带有文件上传功能的在线工具非常适合对此进行测试。文件大小上传限制适用。只是几个链接:

Process Explorer from SysInternals also makes it possible to scan for malware processes by running your application and then selecting Options => VirusTotal.com => Check VirusTotal.com. Video tutorial here之类的工具(我没怎么看,对讨论的其他产品不熟悉)。 Use this method to save your application from false-positive nightmares (and also for real malware infections of course).

Application Launch: If you have something you need to run for sure, you could potentially add it to your application launch sequence instead of your setup. This definitely works if you don't need admin rights. If you need to write something to HKLM you can open ACL write access there for regular users - not ideal at all, but possible. Application launch code is just easier to deal with. Easier to debug and no impersonation, sequencing and conditioning concerns (when action runs) like you have in a setup.

Legacy Setup.exe: If you insist on doing "secret stuff" in your setup, then you could use a legacy tool to make a regular setup.exe (not an MSI). Be aware that with tightening security scans and malware detection your setup could be even more prone to the problem of false positives 用于恶意软件检测。销售软件道路上的一个非常严重的颠簸。对于真正的恶意软件,您告诉客户重建 PC,如果出现误报, 必须采取措施解决问题。公司接受度还可能取决于 MSI 格式或其他可检查格式(“这是我们的标准”)。你应该知道,公司设置中的捕获工具会在将其转换为 MSI(或如今的其他格式,例如 AppV 和 MSIX)时详细查看设置的内容。

还有一个问题:

简短的回答是否定的,您不能阻止某人编辑 .msi 文件。您可以采取多种方法来尽量减少有人这样做的可能性,或者增加与任何编辑相关的困难的方法,但您无法完全阻止它。

为了更好地回答这个问题,必须细化您提出的问题。 "Protect" 听起来像是一个安全问题,因此它至少有助于建立一个扶手椅威胁模型。例如,以下是您可能试图阻止的三件事:

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

在这三个中,第一个并不是真正的安全边界,因此您无能为力。它要么是需要管理权限且用户拥有这些权限的安装,要么是允许没有管理权限的用户使用它的 per-user 安装。在任何一种情况下,.msi 都不会比更改它的用户拥有更多的系统访问权限。

第二个跨越了边界,但涉及到应该勤于验证签名的人,并且可能从源而不是用户获取安装。第三个是明显的安全问题,不幸的是涉及到您无法可靠地期望会勤于验证签名的人。

那你能做什么?

  • 您可以签署.msi 文件。这留下了文件被更改的迹象,如果它是的话。请注意,转换(.mst 文件)can alter .msi 在不更改文件本身的情况下执行的操作;然而,这也会影响签名状态的表示。
  • 您可以尝试让您的潜在用户了解在接受 UAC 提示之前验证数字签名的重要性。这不会阻止试图破坏您的许可的人,但可能会帮助其他人避免安装恶意软件而不是您的实际程序。
  • 您可以将 .msi 包装在签名的 .exe bootstrap 中。这使事情变得更难访问;尝试使用普通工具不会直接起作用,而是需要更改方弄清楚如何提取 .msi 文件。虽然这通常不是很困难,但这至少是另一个障碍。
  • 您可以尝试将签名验证注入.msi 文件。正如您所说,这些可能很容易通过对 .msi 文件的进一步更改而被击败,除非您可以将它们与重要且难以复制的其他代码结合起来。当然,这只会让改变变得更难;但并非不可能。同样,您必须考虑 .mst 情况,以及是否要支持 administrative installations 和来自这些缓存的安装。
  • 您可以在应用程序本身添加相关签名或其他验证。如果 .msi 文件被更改,但它不会更改安装到机器上的内容,您的应用程序会关心吗?答案取决于您究竟要防止什么;例如,它无助于防止 tag-along 恶意软件。
  • 考虑其他打包或部署选项,无论是来自 Microsoft(如 .appx / .msix)还是来自第三方。每个都有自己的优点和缺点,以及他们对我在这里讨论的每件事的敏感程度。
  • 运行 您的应用在其他地方;例如,将您的应用程序重写为 Web 应用程序,这样就无需安装。显然这仅适用于某些类型的应用程序,但该列表还在继续增长。

你不能做什么?

  • 让所有用户足够关注
  • 防止恶意方创建假装适用于您的应用程序但只有恶意负载的安装程序
  • 防止机器所有者在 .msi 运行之前或之后更改机器
  • 支持 所有 人们使用 .msi 文件的方式,而不仅仅是使用 .msi 文件(管理安装、转换、"repackaging"、各种 .msi-specific 部署实用程序等都是某些 类 软件的正常使用模式)

在本练习结束时,您必须决定这对您来说是一个交易破坏者,还是您可以接受的事情。确保您理解为什么有人想要更改您的 .msi 文件,并且在关注 .msi 文件本身之前,考虑他们是否可以通过非 .msi 方式产生相同的效果。如果它特定于 .msi 并且是一个交易破坏者,请研究其他安装技术。如果没有什么可以阻止您试图阻止的情况,也许您可​​以找到减少人们尝试它的动机的方法。