密码管理器安全性分析

2019-03-25 3,924

密码管理器(Password managers)是用来保存密码的,允许用户在加密的数据库中存储和提取敏感信息。很多用户依赖密码管理器来提供更好的安全保护。研究人员分析发现多个Windows 10平台上运行的密码管理器存在安全问题。

link (4).jpg

密码管理器安全保证

本文研究的所有密码管理器都是以相同的基本的方式工作的。用户在软件中输入或生成密码,并加入相关的元数据。信息会被加密并只有在需要显示的时候才解密,比如传递给浏览器进行密码自动填充或复制到剪贴板使用。

其实密码管理器有3种不同的状态,分别是not running, unlocked (running), locked (running; 该状态假设密码管理器之前是解锁的状态)。本文的分析假设用户没有对密码管理器进行其他的加密,比如全盘加密、进程加密等等。

Not Running 

研究人员将not running定义为密码管理器安装、配置和交互后,自上次机器重启或被用户中止进程后没有再次被启动过的状态。

Running: Unlocked State 

unlocked state表明密码管理器在运行,用户在master password中输入来解密和访问管理器中保存的密码。用户可能展示、复制到剪贴板或其他的方式来访问密码。

Running: Locked State 

locked state表明:

(1) 密码管理器启动过,但是用户没有输入master password;

(2) 用户之前输入了master password并使用过密码管理器,但随后点击了lock或退出。

目标密码管理器

本文的分析是基于以下密码管理器的:

image.png

Non-Running状态的密码管理器安全

研究人员首先分析密码管理器在not running状态下的安全性。首先看一下不同密码管理器用来将master password转化为加密钥的算法。

表2是密码管理器的默认配置中使用的密钥扩展算法以及循环的轮数。根据NIST的建议,研究人员认为每个密码管理器使用的密钥扩展算法都是可接受的,循环的轮数也是足够的。因此研究人员认为这些密码管理器在not running状态下都是安全的,使用暴力破解方法破解硬盘中的加密密码记录是计算上不可行的。

image.png

表2. 密码管理器默认的密钥扩展算法和循环轮数

Running状态的密码管理器安全

1Password4 (Version: 4.6.2.626)

研究人员发现1Password4在locked状态下对密码泄露有适当的保护,但在处理master password和处理unlocked到locked状态的变化时的实现细节存在问题。在正面的角度来看,软件会在加载另一个之前清除未加密的密码,也就是说每次内存中只有一个未加密的秘密。从负面的角度来看,在unlocked状态下,master password仍然在内存中,软件在unlocked状态到locked状态转化时没有擦除混淆的密码内存区域。而且研究人员还发现一个bug,就是在locked状态下,用户的特定动作会导致master password以明文的形式遗留在内存中。

没有从内存中擦除混淆的Master Password

因为在将密码管理器变成locked状态后没有从内存中查出,那么就有可能恢复和反混淆master password。可以假设这样一个场景,用户解锁1Password4,然后再将它变成locked状态,1Password4就会弹窗要求输入master password,如图1所示。但内存中仍然存在编码或混淆格式的master password,如图2所示。

 image.png

图1. Locked状态的1Password4等待输入master password

image.png

图2. 1Password4 locked状态下内存中编码的master password

研究人员使用这些信息来拦截1Password4调用RtlRunEncodeUnicodeString和RtlRunDecodeUnicodeString来混淆master password的工作流,将编码的master password变成如图3中的明文。

image.png

图3. Master password

从内存中复制当前密码记录

1Password4变成locked状态后,内存区域就会被收回。所有被收回的区域都不会被擦除,但是Windows内存管理器在将这些重分配前将内存中的一些释放的页面进行0填充。

image.png

图4. 交互过程中内存中的密码记录

1Password7 (Version: 7.2.576)

研究人员分析1Password7后发现,其running状态下的安全性比1Password4要差一些。在测试数据库中,研究人员利用1Password7的内存信息解密了所有的密码记录。而且1Password7在进行unlocked到locked状态的转化时不会擦除密码、master password、secret key。用户必须在unlocking后尽快退出软件来从内存中清除敏感信息。 

暴露明文Master Password, Secret Key和记录

在1Password7的locked状态,图5要求输入password来解除锁定。

 image.png

图5. 1Password7出于locked状态,之前打开过变成locked状态

 image.png

图6. 从locked 1Password7实例中提取器master password


 image.png

图7. 从locked状态的1Password7提取secret key

 image.png

图8. 从1Password7的locked实例提取密码记录

因为1Password7缺乏内存保护,因此非估计攻击也可能会从内存中泄露密码。研究人员在分析过程中还遭遇了一个系统停止错误(kernel mode exception)。在检查复制的内存文件时,研究人员发现在错误发生时,locked状态下内存中有明文的密码,如图9所示。

 image.png

图9. Windows 10奔溃dump文件中含有密码 

Dashlane (Version: 6.1843.0)

与1Password4类似,Dashlane只在与用户交互时会泄露一些记录。最多最后活动记录会暴露在内存中, 无论Dashlane出于locked还是unlocked状态。但当用户更新了记录中的任意信息后,Dashlane可能暴露内存中整个数据库的明文,即使Dashlane退出或locked状态明文数据仍然存在。

内存中泄露明文记录

Dashlane中的密码记录是以XML对象的形式保存的。在与任意记录交互后,该XML对象就会变成明文,而且可以在locked和unlocked状态提取。图10就是XML数据结构的部分示例。

 image.png

图10. 完全解密的Dashlane XML密码数据库

在了解了locked状态的数据结构后,研究人员创建了一个PoC应用来从Dashlane的locked实例中提取密码。图11是Dashlane弹窗要求输入master password来解锁。

 image.png

图11. Dashlane的Locked实例

在locked状态下,研究人员运行poc来提取所有保存的密码,如图12。

 image.png

图12. 从Dashlane的locked实例中提取密码

研究人员发现虽然可以从locked状态的Dashlane提取密码,其所在的内存区域已经被释放了。所以随着时间的推移,XML数据结构部分会被覆写。研究人员检查发现有些密码只能保存几分钟,但是有的可以保存超过24小时。 

KeePass (Version: 2.40)

与其他的密码管理器不同,KeePass是一个开源的项目。KeePass也只在交互时解密,但解密的秘密会保存在内存中,并不是每次都擦除的。Master password会被擦除,而且不会恢复。

在尝试从内存中擦除密码时,工作流中出现了错误,研究人员可以提取交互的相关记录。KeePass称使用了多种深度内存保护机制,如图13所示。但同时承认这些工作流可能参与了Windows操作系统的API,可以复制部分内存缓存信息。 

 image.png

图13. KeePass的内存保护机制

内存中泄露的明文记录

KeePass在进入locked状态后,交互的相关记录仍然在内存中。图14是KeePass弹窗要求输入master password的locked实例。

 image.png

图14. Locked KeePass实例

密码在内存中是散落的,没有任何引用。但从keePass的进程内存复制信息来看,又有些交互的记录,如图15所示。

 image.png

图15. KeePass locked实例中的记录

使用上面的信息,研究人员用户名来定位记录和对应的password域记录,如图16所示,是定位的保存在password域的比特币私钥。

 image.png

图16. 通过对应的公钥和用户名来定位比特币私钥

LastPass (Version: 4.1.59)

与1Password4类似,LastPass在输入unlock域后会混淆master password。一旦从master password中提取出来解密密钥,master password就会被图17中的lastpass rocks覆写。

 image.png

图17. master password用于PBKDF2密钥扩展后被覆写

LastPass进入unlocked状态后,数据库记录会解密到内存中。但这些记录会保存在内存中即使。

内存中泄露明文Master Password和记录

在进入解密密钥的工作流中,master password会泄露到内存中的字符串缓存中,而且即使LastPass进入了locked状态也不会擦除。

图18是LastPass locked状态等待用户输入master password的记录。

 image.png

图18. LastPass Locked实例

在locked状态下,可以恢复出master password和交互的密码记录,使用的方法与KeePass中使用的方法一致。

图19是从locked状态下恢复master password的例子,其中lastpass rocks用来隐藏另一个缓存中的master password。

 image.png

图19. 明文的Master password,含有几行 lastpass rocks

使用<input hwnd= tag封装的字符串允许枚举所有又交互的记录。图20是提取的比特币私钥实例。

 image.png

图20. 从LastPass locked实例中提取的比特币私钥

结论

研究人员分析发现所有的密码管理器都可以确保not running状态下的用户密码。每个密码管理器都尝试从内存中擦除密码,但从内存中可以窃取部分密码。比如,从1Password7中可以在locked状态和unlocked状态下窃取master password和相关的密钥。而1Password4只有在running unlocked状态下,master password以混淆的形式存在于内存中,很容易就可以恢复出来。

对各密码管理器的评估总结如图21所示:

 image.png

图21. 各密码管理器评估

本文并不是要去批评某个或某种密码管理器的实现,但是建立密码管理器需要遵守的合理的最小基线(baseline)是非常有必要的。

https://www.securityevaluators.com/casestudies/password-manager-hacking/

Tags:
评论  (0)
快来写下你的想法吧!

ang010ela

文章数:25 积分: 291

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号