如何保护 MSI 不被修改

How to protect MSI against modification

本文关键字:MSI 修改 保护 何保护      更新时间:2023-10-16

我想保护MSI文件不被修改。它可以很容易地用ORCA或MSI API完成。这很可悲,因为任何人都可以修改/添加/删除具有管理员权限的Windows安装程序自定义操作或属性。

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

简短回答 :你不能真正保护它,你也不应该保护它,下面试图解释为什么。但是,您可以使用数字证书对 MSI 进行签名,以确保文件在传输给客户的过程中保持不变,从而保护文件完整性并促进更好的安全性。


透明度 :MSI 文件是透明的,这是有原因的 - 企业应用程序打包人员希望能够修改包以适应企业标准。这种透明度实际上是MSI的核心优势。因此,我不会努力保护MSI。编译的自定义操作仍然是"黑匣子"(不可检查,但可以禁用)。

文档和注释 :如果您的 MSI 具有至关重要的自定义操作,则可以在 MSI 中使用"内联"注释或在分配给自定义操作的名称中指示这一点。您还可以提供一页PDF文件(称之为Large Scale Deployment Guide.pdf?)以及您的设置,您可以在其中描述如何最好地部署应用程序 - 以及至关重要的是不使用MSI做什么。我更喜欢将此文档嵌入 MSI 中,以便它带有管理安装- 这是 MSI 的文件提取机制 - 供打包程序查看。企业打包人员通常做的第一件事是使用管理员安装从 MSI 中提取文件。

数字签名:正如其他人所提到的,数字签名(来自高级安装程序的详细信息,来自Installshield的详细信息)有助于确保MSI在交付给客户时保持不变。这显然在安全方面非常重要。对于SmartScreen等新功能来说,这更是一个问题(基于声誉的安全性 - EV 代码签名证书"购买信任">- 有趣的概念?谁闻到了球拍的味道?:-) ).确保您的设置没有恶意软件,或者数字证书证明您交付了恶意软件(直到它也可以被黑客入侵)。说到....嗯。

恶意软件检测:请记住,还需要处理误报。带有文件上传功能的在线工具非常适合对此进行测试。文件大小上传限制适用。只需几个链接:

  • https://www.virustotal.com(使用多个恶意软件扫描套件进行扫描)
  • https://virusdesk.kaspersky.com(主要防病毒供应商)

SysInternalsProcess Explorer等工具还可以通过运行应用程序然后选择Options=>VirusTotal.com=>Check VirusTotal.com来扫描恶意软件进程。这里的视频教程(我没有看太多,不熟悉讨论的其他产品)。Use this method to save your application from false-positive nightmares (and also for real malware infections of course).

应用程序启动:如果您肯定需要运行某些内容,则可以将其添加到应用程序启动序列中 而不是您的设置。如果您不需要管理员,这绝对有效 权利。如果您需要向 HKLM 写入内容,您可以打开 ACL 写入 普通用户访问那里 - 根本不理想,但可能。 应用程序启动代码更容易处理。更易于调试 并且没有冒充、测序和预处理问题(当 操作运行),就像您在设置中一样。

旧版设置.exe:如果您坚持在设置中执行"秘密操作",那么您可以使用旧版工具进行常规设置.exe(不是 MSI)。请注意,随着安全扫描和恶意软件检测的加强,您的设置可能更容易出现恶意软件检测误报的问题。销售软件道路上的一个非常严重的颠簸。对于真正的恶意软件,您告诉客户重建PC,对于误报,您必须采取措施来解决问题。企业接受度也可能取决于MSI格式或其他可检查格式(">这是我们的标准")。您应该知道,公司设置中的捕获工具在将其转换为 MSI(或当今其他格式,例如 AppV 和 MSIX)时,将看到安装程序的详细操作。

还有一个问题:跨平台安装程序。

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

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

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

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

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

那你能做什么呢?

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

你不能做什么?

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

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