如何实现Chrome那样的静默升级

坚果云最新推出的Windows 客户端开始支持类似chrome浏览器的静默升级。这个过程中我们积累了不少的经验,可以和感兴趣的读者分享。

什么是静默升级?

PC应用程序为了保持功能的不断更新,需要经常性的升级。传统的方式需要用户在升级前进行确认,尤其是在支持UAC的Windows 7系统上,这对于用户体验是个挑战。 想想工作中,如果有个对话框突然弹出提示即将开始升级,多恼人啊。这和坚果云提高用户工作效率,减少干扰的理念背道而驰,因此我们必须抛弃这种传统的升级方式。

静默升级就是在升级安装的过程中,完全无需用户干预,既保证功能升级,又保证用户不受干扰。这个方面的典范是Chrome浏览器,chrome浏览器通过持续不断的静默升级保持功能更新,从而在竞争中占据优势。

静默升级很难吗?

从Windows Vista 开始, Microsoft引入了一个叫作 UAC(User Account Control, 用户账户控制)的新安全技术。UAC会把系统管理员的权限分隔成普通权限和管理权限,应用软件默认会以权限受限制的普通权限运行。当应用软件需要以高权限运行时,就需要向用户请求管理权限,这个过程必须用户干预。UAC可防止恶意程序破坏系统,它的出现造福了电脑用户的同时,也给我们带来了不小的麻烦。

坚果云在升级的过程中涉及到对注册表进行操作,也涉及到类似C:\Program Files这样的文件夹的操作,必须获取管理权限。UAC的限制意味着静默升级利用普通的方式无法正常进行。

几种可能的途径:

1) 避免在升级过程中修改任何需要管理权限的文件或注册表项

例如将所有需要更新的文件放到用户AppData目录下。这个方法简单易行,不容易出错,但要求将升级过程简化为文件的更新和替换,不支持需要管理权限的注册表操作。Chrome浏览器就采用的该方法。

2) 利用Windows计划任务进行升级

Windows的计划任务在执行的时候自动获取管理权限,因此能完成静默升级。一般在应用安装的时候都可通过用户确认得到管理权限,因此可在安装的时候加入计划任务。计划任务定期执行,一旦检测到更新就进行安装。

这个方法比较简单,无需和Windows的安全机制进行任何深度交集, 但是计划任务很难和应用程序进行协调,升级过程可能会打断用户当前操作。例如,用户正在同步的时候,坚果云应用程序因静默升级而自动重启,从而对用户体验造成影响。很多的应用程序采用了这个方法,包括Google其他产品的升级程序,打开控制面板中的计划任务即可看到。

3) 利用后台服务进行静默升级

与计划任务类似,后台服务也可以自动获取管理权限。不同的是,应用程序可以控制其启动的时机并获得返回状态,从而能够协调行为,避免用户正在使用的同时进行升级。但这个问题主要的麻烦在于后台服务需要理解Windows的安全机制和服务的实现,要求更高些,另外后台服务的调试也比较麻烦。

另一个安全漏洞?

一旦应用程序利用上面2)和3)两种方法取得管理权限后,UAC将被完全绕过。如果应用程序的升级逻辑做的不谨慎,完全可能被恶意程序利用,作为绕开UAC的手段。

我们的建议是,升级之前,负责执行升级逻辑的部分需要通过数据签名的方法保证升级的过程是安全合法的,不会对用户电脑造成任何危害。

坚果云采用的方法:

为了更好的控制升级的时机,并且支持对注册表的操作,坚果云选择了第三个方法。

在安装的时候,坚果云自动安装升级后台服务。该后台服务只有当需要执行升级的时候才会启动,升级完成后将自动退出。该后台服务只是用于帮助应用程序获得管理权限。在没有UAC的系统上(例如Windows XP或者关闭了UAC的Windows 7系统),该服务将不会被启动。

当坚果云应用程序启动时,如果有可用更新并且需要获得管理权限,就会启动后台服务获取管理权限执行升级。升级的过程中会校验所有新文件的签名是否有效,避免了被攻击者利用的可能。等到升级完成后,会自动启动坚果云程序,让用户在毫无异样的感觉下升级到新的版本。

升级的操作只在启动的时候执行,保证不会对正在使用坚果云的用户形成干扰。升级操作往往只需简单的文件替换或注册表项改写,也完全不会影响应用启动所需的时间。