Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

That Was Then

作者:Sean Oesch, Scott Ruoti 单位:University of Tennessee, Knoxville 会议:29th USENIX Security Symposium 2020 原文:https://www.usenix.org/system/files/sec20-oesch_0.pdf

Abstract

密码管理器在基于密码的身份认证场景对帮助用户管理密码和地址等有着极大的潜力。但是,先前的研究曾指出现有的密码管理器,尤其是基于浏览器的密码管理器有着极为明显的漏洞。自那一篇文章已经有 5 年过去了,现有的密码管理器是否存在漏洞还是个未知数。因此,本文研究关注于基于浏览器的密码管理器的安全问题,包括密码生成,密码存储与自动填充。

作者分析了 13 个常见的密码管理器,并从中发现了诸多安全问题。

  • 密码生成器生成非随机密码,可被猜解
  • 密码存储存在明文存储现象
  • 自动填充存在点击劫持攻击

基于研究结果,作者还提出了针对现有密码管理器的安全问题改进方法与未来研究领域。

Introduction

不考虑密码认证本身的问题,攻击者越难猜解密码,用户也就越难记住密码。因此,用户通常会在不同的网站使用相同密码,从而增加信息泄露的风险。于是,密码管理器使用随机生成的强密码并在相应的网站进行自动填充,来帮助用户解决这种安全问题。但是,密码管理器本身也可能存在安全问题,例如之前 LassPass 和 1Password 浏览器扩展的自动填充功能存在 XSS 漏洞。这些问题已经是 5 年前的研究,现在基于浏览器的密码管理器扩展安全性仍然是个未知数。因此,本文提供了全面的角度去评估现在的密码管理器安全性。

作者在本文考虑了完整的密码管理器生命周期,包括密码生成,密码存储与密码自动填充。作者发现,现有的密码管理器虽然已经进步了很多,但是仍然存在限制的安全问题。

本文贡献:

  1. 密码管理器虽然已经有改善,但是仍然存在一些安全问题需要解决
  2. 第一个针对密码生成进行研究
  3. 针对密码管理器的分析更为全面
  4. 针对最新的密码管理器进行安全分析

Background

密码管理器

最基础的场景,密码管理器被用来存储用户的凭证,例如用户名和密码。现在,密码管理器还可以帮助用户生成用户指定的字符集和长度的密码。密码管理器还帮助用户在凭证对应的站点进行自动填充。密码管理器主要有以下好处:

  1. 减少记忆密码
  2. 便于分配密码防止密码重复使用
  3. 便于生成密码防止线上和线下密码猜解

密码管理器分析

本文主要分析 13 个市面上常用的密码管理器,包括密码管理器应用、基于浏览器的密码管理器扩展与浏览器本身的密码管理器。

  • 密码管理器应用
    • KeePassX v2.0.3
    • KeePassXC v2.3.4
  • 基于浏览器的密码管理器扩展
    • 1Password X v1.14.1
    • Bitwarden v1.38.0
    • DashLane v6.1908.3
    • LassPass v4.24.0
    • RoboForm v8.5.6.6
  • 浏览器
    • Chrome v71.0
    • Edhe v42.17134
    • Firefox v64.0
    • Internet Explorer v11.523
    • Opera v58.0.3135
    • Safari v12.0

密码生成

密码生成时密码管理器生命周期的第一步。在本文探讨的 13 个密码管理器中,有 7 个拥有完整的密码生成支持:KeePassX,KeePassXC,1Password X,Bitwarden,Dashlane,LassPass 和 Roboform,和 2 个部分支持:Chrome 和 Safari。为了提供一个基准,作者使用 /dev/random 和在线密码生成网站 SPG 作为密码生成的基准。

设置和功能

每个密码管理器均支持字母和数字,但是特殊字符集并不一致。而且符合预期的,字符越少越影响生成密码的强度。

还有一个常见问题是,密码管理器通常使用最后使用的密码生成策略设置作为最新的默认设置。这种行为看起来是提升用户体验的特性,但是存在生成强度不够的密码的风险。

密码收集和分析

为了分析这些密码管理器生成的密码,作者使用了很多方法,例如使用现有的 CLI (Bitwraden),魔改源码添加 CLI (Chrome, KeePassX, KeePassXC) 或者使用 Selenium (1Password X, Dashlane, LassPass, RoboForm)。由于 Safari 没有脚本密码生成方法,作者手动生成了 100 个密码去分析。

密码生成被分为了以下类:

  • ld: 字母和数字
  • ls: 字母和数字和符号
  • sd: 数字和符号
  • all: 字母,数字和符号

和长度: 8,12 和 20 个字符长度

在收集了这些数据集之后,作者分析了这些密码的随机程度和可猜解程度。作者使用了以下方法来测试这些非随机的行为:

  • 香农熵
  • $\chi^{2}$ 随机度检测
  • zxcbvn 密码分析工具
  • 基于神经网络的密码猜解器

香农熵用来检测生成器产生的字符的非正常出现频率。香农熵的集是根据符号出现的频率来衡量编码一串符号所需的平均最小位数,使用 $\sum_{i} p_i log_b(p_i)$ 来计算。香农熵并不能很好的用来衡量用户选择的密码,但是在评估随机生成的密码强度时很有用。香农熵也不受密码长度的影响,仅受一个字符串中可以出现的不同字符的数量及其在语料库中的相对频率的影响。

$\chi^{2}$ 随机度检测是一种简单的静态测试,以确定两个分布之间的差异是否可以用随机机会来解释。作者使用 $\chi^{2}$ 检测来评估每个密码数据集的独立性,并使用 Bonferonni 校正来修正 p 值,以考虑到来自同一家族的多个统计测试。

zxcbvn 工具是用来检测密码中是否存在字典单词和简单模式。该工具也评估密码破解器破解一个密码所需要的时间。

为了检测生成的密码是否具有比 zxcvbn 能够检测到的更微妙的模式,作者使用了 Melicher 等人构建的神经网络密码分析器。这种分析器使用了 LSTM 的 RNN 神经网络架构去依据已有的密码数据集猜解密码。作为输出,这种分析器产生一个 Monte Carlo 估计,即训练好的密码猜解器需要多长时间才能猜中测试集中的密码。对于密码数据集,作者使用 80% 来训练神经网络,使用 20% 来检验模型。由于分析器的缺陷,作者只能测试长度为 8 和 12 的密码,长度为 20 的密码会因为内存不够而崩溃。

猜解次数超过 $10^6$ 被认为无法进行在线攻击,超过 $10^{14}$ 被认为无法进行离线攻击。

评估结果

密码强度

几乎所有的长度 12 以上的密码可以抵御离线攻击,但是也有小的扰动会影响 8 位密码能不能显著抵御离线攻击。

随机度

除了一个非随机字符频率分布外,其他所有的非随机字符频率分布都可以用一个单一的特性来解释 – 要求密码至少有一个字符来自每个字符集。当不启用这种特性时,任何给定字符在密码中出现的概率与密码的长度和所有启用的字符集的字符数成正比。当启用这种特性时,概率也与该字符集中的字符数成正比,导致来自较小字符集(如数字、符号)的字符频率较高,这就解释了测试检测到的非均匀性问题。作者注意到,尽管不对其进行修正并没有显著的安全效应,但是可以对这种偏斜进行调整并保持统一的分布。

随机但较弱的密码

在作者的分析中,作者发现所有的密码管理器都会偶尔生成一些较弱的密码。

密码存储

密码存储是密码管理器生命周期的第二步。这一步,作者手动观察这些密码管理器生成的本地数据库,观察是否存在没有加密的信息,及修改主密码后密码管理器生成的本地数据库是否改变。

密码自动填充

密码自动填充是密码管理器生命周期的最后一步。作者开发了自己的一个网站来测试密码管理器自动填充是否存在安全漏洞。

  • 用户交互:只有用户交互才会填充密码 -> XSS
  • iframe:自动填充 iframe 内的表单 -> 点击劫持
  • 填充不一致的表单:自动填充与保存时不同的表单
  • 非标准表单:明文密码栏 type="text"

潜在缓解措施

  • 在发送表单时填充密码:扩展无法访问发送的数据包
  • 遵循 autocomplete="off":无密码管理器遵循该标准

Web 密码保险箱安全和书签小程序安全性

如果 Web 密码保险箱本身存在漏洞,可能使攻击者一次性盗取所有凭证,例如 CSRF 漏洞。

1Password X, Bitwarden, DashLane 和 LastPass 都使用了 CSRF token 来防止 CSRF 攻击,但是 RoboForm 没有这种 token 使得攻击者可以发起 CSRF 攻击。

作者还评估了 CSP,1Password X 和 Dashlane 的 CSP 没有问题,但是 Bitwarden 的 CSP 有一些小问题:script-src 允许 selfobject-src 允许 selfblob:。 LastPass 的 CSP 就有比较严重的问题:script-src 允许 unsafe-inline。而 RoboForm 没有 CSP 来保护。

除了 LastPass,其他浏览器扩展形式的密码管理器均不支持书签小程序,而 LastPass 也在发送信息到书签小程序时过滤了危险信息。

讨论

推荐

  1. 过滤随机但是弱的密码,例如:d@rKn3s5
  2. 更好的主密码策略:需要更高强度的主密码
  3. 更安全的自动填充