如何保护 MSI 免受修改

Posted

技术标签:

【中文标题】如何保护 MSI 免受修改【英文标题】:How to protect MSI against modification 【发布时间】:2019-07-10 11:38:24 【问题描述】:

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

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

【问题讨论】:

这就是数字签名存在的原因。 是的,但它仍然是可执行的...... 所以?用户将得到一个难看的黄色警告,而不是蓝色。你不能阻止一个人修改和/或执行任何东西。 你错了。如果用户没有注意到它,它会很乐意接受修改过的(即使是病毒)项目。 我想我忘了问真正的问题是什么。您是否试图阻止人们修改 MSI 然后提升运行它?在公司环境中? 【参考方案1】:

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


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

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

数字签名:正如其他人所提到的,digital signature(details from Advanced Installer、details from Installshield)有助于确保 MSI 在交付给客户时保持不变.这显然在安全方面具有重要意义。对于SmartScreen(基于信誉的安全性 - EV code-signing certificate “购买信任” - 有趣的概念?谁闻到球拍的味道?:-))等新功能,这更是一个问题。 确保您的设置没有恶意软件,或者数字证书可以证明您已经交付了恶意软件(直到也可以破解)。并谈到....Hmmm.

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

https://www.virustotal.com(使用多种恶意软件扫描套件进行扫描) https://virusdesk.kaspersky.com(主要杀毒厂商)

SysInternals 中的 Process Explorer 等工具还可以通过运行您的应用程序然后选择 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).

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

Legacy Setup.exe:如果你坚持在你的设置中做“秘密的事情”,那么你可以使用旧工具来制作一个常规的 setup.exe(不是 MSI)。请注意,随着加强安全扫描和恶意软件检测,您的设置可能更容易出现false positives 恶意软件检测问题。销售软件的道路上的一个非常严重的颠簸。对于真正的恶意软件,您告诉客户重建 PC,对于误报必须采取措施解决问题。企业接受度也可能取决于 MSI 格式或其他可检查的格式(“这是我们的标准”)。您应该知道,企业设置中的捕获工具会在将设置转换为 MSI(或目前的其他格式,例如 AppV 和 MSIX)时查看设置的详细信息。

还有一个问题:Cross platform installers。

【讨论】:

【参考方案2】:

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

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

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

在这三个中,第一个并不是真正的安全边界,因此您无能为力。它要么是需要管理权限并且用户拥有它们的安装,要么是允许没有管理权限的用户使用它的每用户安装。在任何一种情况下,.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 并且是一个交易破坏者,请查看其他安装技术。如果没有什么可以阻止您试图阻止的情况,也许您可​​以找到减少人们尝试这种情况的动机的方法。

【讨论】:

以上是关于如何保护 MSI 免受修改的主要内容,如果未能解决你的问题,请参考以下文章

如何保护网站免受攻击

如何保护我的 IP 免受欺骗或保护?

如何保护@ConfigurationProperties 类免受更改?

如何保护 Webservice 免受拒绝服务攻击?

如何保护刷新令牌免受黑客攻击

如何保护企业免受网络钓鱼