自动更新:这样安全吗?

时间:2009-09-14 05:24:40

标签: c# .net vb.net security auto-update

Dot Net Auto Update

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

以下是步骤:

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

减轻威胁:

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

未减轻的威胁:

  • 攻击者始终报告“没有可用更新”的MITM攻击。 (可能使客户处于易受攻击的版本)

参考文献:


我错过了什么?


7 个答案:

答案 0 :(得分:8)

Dan Kaminsky对更新程序有一套很好的指导原则:

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

  • 签名。
  • 由你签名。
  • 使用正确的EKU签名 (扩展密钥用法)
  • 从未撤回的签名
  • 签名
  • 是同一产品
  • 成为新版本

根据您在此问题中的描述,您似乎拥有前3个。

答案 1 :(得分:4)

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

  • 支持数字签名

  • 支持所有类型的代理。一些大型团队具有复杂的代理配置(例如,通过使用代理配置脚本)。你应该支持所有这些。

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

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

  • 基于消费者身份支持不同版本的软件。当您想要在不运行所有Q& A流程的情况下更快地更新特定消费者的副本(以修复错误或添加额外功能)时,通常需要这种情况(在这种情况下,您希望限制对此特定消费者的更新)

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

  • 您的工具应由强大的认证机构签名。

关于你提到的MITM攻击,它可以通过使用公共密码术轻松解决(如unknown所述)

答案 2 :(得分:3)

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

无法解决服务器出现故障时该怎么办的问题 - 大概你认为它与无时间戳更改一样。

答案 3 :(得分:1)

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

据我所知,这个系统对于那些买不起SSL证书的人来说非常有用,但是任何能够获得SSL证书的人都应该得到一个解决这个问题的人。

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

答案 4 :(得分:0)

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

添加了:

我在这里可以看到的另一件事就是深入研究如混淆代码,归档设置文件和锁定存档,然后下载后解锁它。那种事。但是我认为你现在所做的应该是100%。

唯一需要的是应用程序非常复杂的时候。现在你可以防止DLL篡改和原产地证明,对于自动更新程序来说,这应该是充足的。

答案 5 :(得分:0)

所以我不清楚某事;下载程序通过签名验证清单是否是它所期望的那个,是否对它安装的实际补丁执行相同的操作?

答案 6 :(得分:0)

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

注意:如果客户端可以接受未经授权的证书,那么MiTM攻击可能会成功,因此不要将此选项提供给客户端。

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