自动更新:这样安全吗?

点网自动更新

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

以下是步骤:

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

减轻威胁:

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

未减轻的威胁:

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

参考文献:

  • 安全的软件更新:令人失望和新的挑战
  • Black Ops 2008:它是我们所知道的缓存的终点
  • 邪恶将毁灭我们所有人

我错过了什么?

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

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

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

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

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

  • 支持数字签名

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

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

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

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

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

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

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

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

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

不要故意在这里拖车,但你正试图解决已经解决的问题。 使用SSL将是一个更好的选择。 这将解决您的问题中列出的所有问题。

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

别忘了,“复杂性是安全的敌人”。

同样,添加一个MD5 CheckSum到下载的文件,否则,看起来不错:) – 下面的公平评论。

添加:

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

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

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

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

注意:如果客户端可以接受未经授权的证书,则MiTM攻击可以成功,因此请勿将此选项提供给客户端。

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