14

点网自动更新

我觉得 .net 缺少一个简单的安全自动更新库,所以我实现了一些东西并把它放在这里。在有人考虑使用该库之前,我热衷于更新过程以获得一些同行评审。

以下是步骤:

  • 客户端软件填充有公钥和 URI 以进行轮询。
  • 客户端轮询清单文件的 URI。
  • 下载清单并使用签名(在单独的“.signature”中)来检查清单是否有效。
  • 从清单中解析出待处理更新的列表(以显示给用户)。
  • 下载安装程序文件,并再次使用相应的“.signature”文件进行验证。(下载的文件将受 ACL 保护)
  • 安装程序正在运行。

缓解威胁:

  • 清单签名应防止任何恶意下载(“地毯式轰炸”)
  • 安装程序签名应防止任何 MITM 攻击发送恶意安装程序
  • 使用 ACL 保护下载的安装程序应该可以防止任何本地升级攻击。

未缓解的威胁:

  • 攻击者总是报告“没有可用更新”的MITM攻击。(可以让客户端处于易受攻击的版本)

参考:


我错过了什么?


4

7 回答 7

8

Dan Kaminsky 有一套很好的更新指南:

要成功,您的更新包必须是:

  • 签。
  • 由您签名。
  • 由您签名,使用正确的 EKU(扩展密钥使用)
  • 从未撤销的签名中签名
  • 做同一个产品
  • 做一个新版本

从您在此问题中的描述来看,您似乎拥有前 3 个。

于 2009-09-23T23:19:25.080 回答
4

在企业环境中构建了我自己的部署程序后,这里有一些我需要解决的用例:

  • 支持数字签名

  • 支持各种代理。一些大军团有复杂的代理配置(例如通过使用代理配置脚本)。你应该支持所有这些。

  • 加密支持。您的客户可能希望在 Web 服务器上提供已部署的二进制文件,并且他们不想管理某种身份验证或访问控制;但他们也不希望未经授权的用户下载二进制文件。一个简单的解决方案是加密二进制文件并让您的工具部署它

  • 支持可插入的附加步骤。企业客户通常不太习惯使用自动部署的工具。他们会想要更多的控制权。通常,允许他们运行可自定义的步骤(如防病毒检查等)会有所帮助

  • 支持基于消费者身份的不同版本的软件。这通常在企业环境中需要,当您想要非常快速地更新特定消费者的副本(修复错误或添加额外功能)而不运行所有问答流程(在这种情况下,您希望限制更新给这个特定的消费者)

  • 支持有限的特权情况。除了您的用户可能缺乏对其计算机的管理员访问权限这一事实之外,大公司经常使用特定工具来限制您可以执行的操作。准备好部署在用户拥有的文件夹(甚至是临时文件夹)中,而不是经典的“程序文件”。

  • 您的工具应由强大的证书颁发机构签名。

关于您提到的 MITM 攻击,通过使用公共密码学很容易解决(如unknown所述)

于 2009-09-30T13:35:45.553 回答
3

好吧,您可以尝试通过让“无版本更新”响应还包含时间戳(并签名)来防止 MITM。然后,如果一个月过去(或无论您的策略是什么)没有版本更改和时间戳更新,那么您拒绝运行该软件或弹出一个警告对话框,通知用户可能存在 MITM 攻击。

不能解决如果您的服务器出现故障该怎么办的问题 - 大概您将其视为无时间戳更改。

于 2009-09-30T04:01:37.923 回答
1

并不是要在这里成为巨魔,但您正在尝试解决一个已经解决的问题。使用 SSL 将是一个更好的选择。这将解决您问题中列出的所有问题。

我知道这个系统对于买不起 SSL 证书的人很有用,但任何能得到 SSL 证书的人都应该得到一个来解决这个问题。

不要忘记,“复杂性是安全的敌人”。

于 2009-10-04T00:37:51.327 回答
0

作为补充,在下载的文件中也添加一个 MD5 CheckSum,否则,看起来不错:) - 下面是公平的评论。

添加:

我可以在这里看到的唯一额外的事情是深入研究诸如混淆代码,或归档安装文件并锁定归档,然后一旦下载,解锁它。那种东西。但是我认为你目前所做的应该是 100%。

唯一需要更多的是当应用程序的安全性非常复杂时。现在,您可以防止 DLL 篡改和来源证明,这对于自动更新程序来说应该足够了。

于 2009-09-14T05:31:43.273 回答
0

所以我不清楚一些事情;下载器通过签名验证清单是它所期望的,它是否对它安装的实际补丁做同样的事情?

于 2009-09-14T06:13:55.417 回答
0

这篇文章中有一些非常好的评论和解决方案。但我非常同意博士的观点。邪恶的。您应该使用 SSL 连接进行更新,并且证书必须保存(构建)在客户端中。因此,您可以确保客户端不会接受假证书。我认为它将有效地使客户端免受 MiTM 攻击。

注意:如果客户端可以接受未经授权的证书,那么中间人攻击可以成功,所以不要给客户端这个选项。

编辑:我认为在这种情况下 SSL 证书可以自签名。

于 2009-10-05T03:37:04.860 回答