最近我遇到一个问题,让我觉得可能大家对嵌入式浏览器的安全性还没有什么意识,所以写一篇。

正版化软件激活过程中使用嵌入式浏览器的问题

在高校正版化方面,我写过有些公司有各种各样的实现上的安全问题,请看VCR 高校正版化软件实施过程中的一些问题

这是一个使用非常广的软件,以前我们都是用激活码,今年我们激活到期后换了一个激活模式。

其实我平时不常用这个软件,在我不经意激活的时候,我发现了一个很大的问题。重复这句话:所以你不要让我来看或者使用你的系统,我会发现一些乱78糟的问题让你我都很尴尬。他的激活,采用了某个类似OAuth2的机制(OAuth2是为了保护口令的,不需要口令即可获得资源。在我的 “从运营商拿到你的Cookie究竟有多可怕” 这篇文章最末尾,我介绍了OAuth2的流程。),但是,他的所有激活过程,都是在嵌入式浏览器里完成的。

也就是,这个嵌入式浏览器,他其实没有其他展示HTML实现功能性的部分,他的唯一目的就是,让你输入OAuth2的一个口令,完成身份识别,让你激活完成。

为什么严重

这个系统上线2年了,没有任何人对这个激活过程提出异议(据说有一个人,提了建议,看来还没改)。

可以想象,最开始产品经理在UED方面提出了这个需求,我关爱用户,我希望用户在不离开我的应用程序——在同一个界面就可以完成激活。

开发开始还可能有抵触,如果打开系统浏览器去激活,完成工作量只要一秒,要我嵌入浏览器,工作量和后期维护成本无法估量。后来禁不住不知道啥,查阅资料,查找最佳实践,加班几天实现了。

测试也不觉得有问题。推广出来后,各个学校的管理员,师生,没有人觉得这个过程有什么问题。

以前,我们的学生,会把自己的学工号口令输入到互联网课程类网站去保存口令以便以一种更加友好的方式展示课程表。

以前,我们的师生,会在钓鱼网站输入他们的口令。

现在我发现,大家很听话地在一个嵌入式浏览器内输入了自己的口令。

什么是嵌入式浏览器

嵌入式浏览器是指有些应用程序(Exe或者App)集成了一个浏览器,让程序无需单独打开一个浏览器(Edge、Chrome、Safari)就可以在程序内部显示HTML内容。

嵌入式浏览器应用还是较为普遍的,特别是在移动端。

以我举的这个例子来看,这个激活过程的嵌入式浏览器,屏蔽了鼠标右键,不展示URL,不展示TLS证书,就一个模态窗口,展示了学校的一个登录界面,然后大家就把口令输入了。

如果你在输入之前三思了,评估了自己的风险,可能还修改了口令,输入完再改过口令;甚至于,你关闭激活窗口,不用这个软件了,恭喜,那你通过了这次网络安全意识教育测试

嵌入式浏览器有什么风险

  • URL不可见。嵌入式浏览器通常不展示URL,特别是在移动端显示屏幕较小的情况下。以前微信的嵌入式浏览器是不显示URL的,有一个技巧是你下拉网页,可以看到URL,一般敏感内容我都会拉一下。现在微信把URL里的域名直接显示在嵌入式浏览器最上端了,怎么样也要挤出空间出来。拉的这个技巧已经没有了。

  • TLS证书不可见。甚至可能帮你ignore证书错误提示。
  • 更新及时性的问题。如果嵌入式浏览器是被打包到Exe的,那他的更新就会滞后。当然,这个可以使用廋模式来实现只使用到操作系统级的浏览器。
  • 通常缺乏插件支持。诸如你用的adblock、代理、禁止JavaScript、代填口令、多语言翻译等插件可能是失效的。
  • FIDO可能不支持。
  • 很难解决逃逸问题。在激活的这个例子里,如果你点到一个网页是target=_blank的,会跳出应用程序打开浏览器。

从开发者来说,这个他嵌入的浏览器,他有非常大的能力。他可以随意更改页面的任何内容,他可以明文获取和拦截来往的任何请求和响应数据,他可以在后台开几个浏览器来执行你看不到的动作。他可以合法Clickjacking,他甚至可以展示一个URL,但是不是你真实在访问的URL。

当然,我们不会以这么大的恶意来揣测一个开发者。网络安全,你总得信任一部分人。但是你无法阻止供应链攻击,无法阻止在一个漆黑的嵌入式浏览器内被其他Web站点恶意导到另外一个欺诈网站。

如果这个嵌入式浏览器,他只是展示一些只读的HTML信息,不需要你输入个人信息,不需要你输入口令,那上面的问题都无所谓。

甚至于如果你在一个公司的应用的嵌入式浏览器内输入这个公司账户体系的口令,也没有任何问题。

但是你不应该输入不属于他应该获取的口令。

解决办法

  • 在Web方面,我们为了防止一个登录框被嵌入到别的HTML里,我们会用X-Frame-Options和CSP各类指令。
  • 在银行方面,有时候在柜台你需要输入你的银行卡口令,这时候不是柜台小姐姐告诉你输入口令你就输入的,你必须等小键盘发出“请输入密码”的声音你才能输入。这是为了防止小姐姐打开一个记事本,让你输入口令,从而获取你的明文口令。一旦你听到小键盘“请输入密码”,你就知道,你输入的内容屏幕上是一定不会显示的,没有小姐姐可以看到你的口令。当然,小键盘被替换或者声音从别的设备里伪造发出是另外一个话题。
  • 在电话方面,在口令验证阶段,运营商的小姐姐一定会将你转接到一个单独的设备,这个设备还会发出噪音,在这时,你输入的口令才是安全的。
  • 而嵌入式浏览器其实没有什么好的办法,一个是判断user-agent,一个是从规则上,比如Google和Facebook都已经在几年前申明禁止在嵌入式浏览器里输入他们的口令了。
  • 阅读 关于密码的一些事

我没法投入更多时间跟厂商来aruge这个问题,期待未来有所改进,更期待未来,大家在嵌入式浏览器内输入口令的时候,可以多想一步。