上接 第1页

4.2 存储与访问机制

4.2.1 Internet Explorer 6 & 7

存储结构: 注册表
格式: 二进制,以两个十六进制存储在REG_BINARY键值内。
加密方式: TripleDES
访问: (IE 4-6)存储API;(IE 7)数据保护API
访问条件: 用户已登录
暂时存储: 对应密匙使用后清空。[注释 9]

Internet Explorer 版本4-6使用Protected Storage System Provider (PStore)保存和访问IE网页表单的用户名和密码等敏感信息。[注释 10] PStore在MSDN上被定义为保护安全的存储信息。[注释 11] 在微软最近发行的出版物中[注释 12],它被注释为:

    "...保护存储服务不再认为是存储密码的安全方法,还在使用P-store的最重要的Windows程序就是Internet Explorer,IE用它来存储自动完成信息,包括基于表单验证的用户名和密码。"

PStore数据被TripleDES加密并存储为二进制结构,未加密数据无法直接通过注册表访问。可是,数据安全和访问实际上依赖于用户的Windows登录验证。一旦用户成功登录,任何相关的程序都能使用恰当的API调用访问未加密的PStore数据。不同的Windows用户帐户不能访问其它用户的PStore数据。

PStore并不是Internet Explorer专用的,它也同样被其它微软产品使用,比如Outlook和MSN Explorer,这些程序在安全设计上也有相同的弱点。大多数的间谍程序都可以通过可编程的API破坏PStore的安全设置并越权存取信息。[注释 13]

Internet Explorer 7 使用数据保护API(DPAPI) [注释 14],但验证信息仍然是公开的,外部程序可以通过API调用访问到未加密的信息。

IE7中自动完成功能的加密方法使用以下标准术语: [注释 15]

    EK - 密匙(Encryption Key)
    RK - 关键码(Record Key)
    CRC - 循环冗余校验(Cyclical Redundancy Check)
    Hash - 安全散列算法(Secure Hash Algorithm)

    存储信息:
    EK: URL
    RK: Hash(密匙)
    C: CRC(关键码)
    V: {data}EK
    Store (C, V) 通过RK在注册表中索引,清除EK

    检索信息:
    EK: URL
    RK: Hash(EK)
    在注册表中查询RK, 如果找到匹配记录则对应的V包含有加密后的数据
    data: {V}EK

URL作为密匙的一部分,被用来检索验证信息(数据)。

4.2.1.1 关注Internet Explorer访问

使用IE自动完成功能的前提是指定的Windows帐户有完整的密码数据库访问权限,因此,当有未授权的人逻辑访问计算机时,如果帐户已登录或没有密码保护,攻击者就可以滥用用户权限,非法使用密码。逻辑访问的定义为物理接触(走向计算机)或使用远程客户端(比如,VNC, 远程桌面)。

因此如果没有限制物理访问(比如带锁的房间或有密码的屏幕保护程序)——附近的任何人都能走近计算机,访问密码管理保存的任何网站。一个非法用户可以访问某人从个人邮箱到银行帐户的任何信息,后果相当严重。

另外,如果有很多人共用同一个帐户(很差的安全习惯),问题一定是非法使用。上述情况假定必须靠近或远程访问计算机,在接下来的几节中,这些方法同样有效。

4.2.2 Firefox 0.7-1.5 与 2.0

存储结构: Text文件(signons.txt)
格式: ASCII, 使用Base64编码(除了URL和字段)

    URL (明文, 比如 www.gmail.com)
    字段名 (明文, 比如 username, email, userid, 等等)
    上述信息的Base64编码或加密值
    字段名 (比如 password, pass, 等等)
    上述信息的Base64编码或加密值
    ...等等... (同一URL允许许多入口)
    .
    (每一个URL入口用分割线循环隔离)

加密方式: TripleDES (CBC模式) [注释 16]
访问: 网络安全服务(NSS) API [注释 17]
访问条件: 用户已登录和主密码(如果设置了的话)
相关文件: 证书(已签名的公匙)存储在certN.db,密匙数据库存储在keyN.db,安全模块存储在secmod.db [注释 18]

Firefox使用网络安全服务API完成它的加密操作,与密码管理器相关的功能Firefox使用公共密匙加密标准(PKCS)#11[注释 19],此API被用于基于软件或硬件的第三方安全模块,Firefox也使用PKCS#5加密密码[注释 19],同时还有一个选项用于为密码管理器选择安全模块联邦信息处理标准(FIPS)140-1。 [注释 20] 主密码作为关联成分(位于keyN.db文件)被用于派生主密匙。主密匙则被用于循环加密存储在密码管理器中的用户名和密码。

NSS API虽然无法轻松解决,但是有一些关键功能可以让Firefox或相关程序访问密码管理器。密码的设定由(PK11_SetPasswordFunc)处理,而解码base64数据则是由(PK11SDR_Decrypt)完成,解密模块(PK11SDR_Decrypt)允许相关的程序访问用户名和对应的密码:这当然是个简单的举例。真正的代码会需要初始化NSS、说明变量、设定缓冲等等。也就是说,整个系统存储在用户的配置文件中,其安全性取决于主密码的加密(由用户创建)和key3.db文件(包含有关键成分)的访问权限。

FIPS 140-1 安全模块可在如下位置开启:

    Windows下 Firefox 1.5:

    工具 | 选项 | 高级 | 安全设置 | NSS内部FIPS PKCS #11

    Windows下 Firefox 2.0:

    工具 | 选项 | 高级 | 加密 | 安全设置 | NSS内部FIPS PKCS #11

5. 针对密码管理器的攻击

本节讨论了两种密码管理器的攻击方法。

找出系统所有敏感路径的一个常见方法是使用攻击树,在图1所示的攻击树中,目标是完全控制密码数据库。

Figure 1.
图 1. Firefox密码管理器攻击树

开放数据库访问的结果是攻击者可以得到所有的用于网站验证的URL、用户名和密码。不安全的密码管理器允许攻击者访问任何东西,从e-mail到用户的保险、银行,或者甚至是企业内网信息。一个子目标(没有在攻击树中列出)会危及指定网站的登录信息,通常拿走一块馅饼(单一突破)通常要比整个儿(完全攻陷)拿走容易。同样,所有的目标都是隐藏着的。

密码管理系统由应用程序和用户元素组成,获取密码数据库或指定的登录信息只需要攻击系统的薄弱环节。通常薄弱环节就是用户元素,而不是检查或加密工具。攻击通常基于用户与密码管理器(或者浏览器与密码管理器)之间的接口。

5.1 独立的JavaScript浏览器攻击

本节讨论了两种JavaScript攻击方式:标准攻击与Ajax攻击。

5.1.1 标准JavaScript攻击

假设: 攻击者能访问用户帐户。

攻击结果: 攻击者能定位保存过登录信息的站点1) 获取访问权限 2) 使用JavaScript显示用户名和密码。

间接影响: 使用泄漏的密码访问密码管理器,使用相同密码的其它程序和站点。

JavaScript可以通过文档对象模型(DOM)显示任何站点保存的密码。当用户访问一个保存了他们的用户名和密码的网页时,密码通常显示为一连串的星号(*)或者黑点,而用户看到的是:浏览器保存了实际的ASCII密码并在收到调用请求时将其提交,使用星号和黑点可以有效阻止肩窥的发生。

一个聪明的攻击者可以用JavaScript嵌入HTML页面或者运行网页加载后显示用户名和密码的脚本。

Figure 2.
图 2. JavaScript 文档对象模型(遍历密码对象)

这是从网上找到的一段JavaScript代码, [注释 21] 它能嵌入HTML或者作为书签使用。书签是一个小型的JavaScript程序,能存储URL并在本地导入网页。

使用程序循环,攻击者可以穷解所有文档对象模型基于密码的元素(就像图2中表示的那样),符合这些密码对象的值将被找出来,星号密码不会有任何作用。任何人或程序都可以在网页客户端(IE或Firefox)上“单击”链接并找出密码。


javascript:(function(){

var s,F,j,f,i; s = ""; 

F = document.forms; 

for(j=0; j<F.length; ++j){

    f = F[j]; 

    for (i=0; i<f.length; ++i){

         if (f.type.toLowerCase() == "password") 

             s += f.value + "\n"; 

    }

}

if (s) alert("Passwords in forms on this page:\n\n" + s);

else alert("There are no passwords in forms on this page.");

})();

图3. 显示密码的JavaScript代码(squarefree.com [注释 21])

5.1.2 Ajax密码抓取

假设: 攻击者能访问透明代理服务器,或者能配置网络客户端。

攻击结果: 攻击者能插入、移除或修改页面内容,包括在任何有HTTP连接的站点上用JavaScript抓取用户名和密码(即使之后使用了SSL提交)。

间接影响: 使用相同登录信息的计算机系统,使用相同用户名和密码的应用程序或网站。

在图4假设的情况中,用户打开了一个网页浏览器,想要访问他在远程服务器上的银行信息。客户端请求了他或她的提供商(比如美国运通)的主网页,公司服务器响应了请求,但是响应信息被代理服务器修改了。代理服务器具有IP地址保护、内容过滤等功能,在常规用途中相当于客户端和服务器之间的信息中转站。

Figure 4.
图 4. Ajax密码抓取

一旦攻击者控制了代理服务器,他便可以嵌入JavaScript,通过服务器异步请求(XMLHttpRequest)获取并发送用户名和密码。用户名和密码的获取也可以用之前提到的JavaScript代码(密码管理器自动填充信息),或者设定一段等待时间(例如,5秒),让用户输入信息,然后发送登录信息给攻击者。在图4的说明中,浏览器请求了一个包含有登录信息(bobpassword)的XML文件,服务器会忽略这一无效的请求,但是攻击者已经截取了登录信息。

区分服务器的验证程序与恶意代码非常重要,在某些网站上,登录信息是在SSL连接建立之前输入的,这是攻击的关键,如果SSL连接在输入登录信息之前建立,代理服务器就无法抓取加密后的通讯。一些非常有名的站点只在原始页面加载后使用SSL提交(比如Yahoo,AMEX,等等)建立加密连接,它们很容易遭受此类攻击,并且这种攻击很容易变化,增加更多的攻击元素。

下表对密码管理器各种各样的安全功能进行了对比。

功能 Internet Explorer 7 Firefox 2.0
存储用户名、密码和URL
通过JavaScript访问密码
通过软件程序访问密码
密码保护(不依赖于用户帐户)  
启动会话时密码提示  
简易输出用户名/密码数据  
加密
编码  
密码管理器“显示密码”选项  

对于“显示密码”选项是否为安全弱点有一定的争议,但有时候忘记了网站密码却无法找回。

第3页继续...



[注释 9] NIST. Federal information processing standard (FIPS) 140-1 Documentation: Security Policy. Windows NT Operating System, Microsoft DSS/Diffie-Hellman Enhanced Cryptographic Provider, 1994.
[注释 10] "Passwords in Internet Explorer 7," http://www.nirsoft.net/articles/ie7_passwords.html (Accessed November 2006)
[注释 11] MSDN: "PStore," http://msdn.microsoft.com/library/default.asp?url= /library/en-us/devnotes/winprog/pstore.asp (Accessed April 2006)
[注释 12] Komar, B. and Smith, B. Microsoft Windows Security Resource Kit, 2nd ed. Microsoft Press, 2005, pp.86
[注释 13] A. Hackworth, "Spyware," CERT Coordination Center, 2005.
[注释 14] MSDN (2001): Windows Data Protection. MSDN Online Library, msdn.microsoft.com/library.
[注释 15] "Recovering Internet Explorer Passwords: Theory and Practice" http://www.passcape.com/html/internet_explorer_passwords.html (Accessed Novermber 2006)
[注释 16] "Netscape Communicator Key Database Format", http://www.drh-consultancy.demon.co.uk/key3.html (Accessed March 4), 2006.
[注释 17] B. Relyea, "Network Security Services", mozilla.org, (Accessed March 4th 2006). Formerly known as Netscape Security Services.
[注释 18] I. McGreer, "Using the Security Module Database", mozilla.org. The security module database (secmod.db) manages PKCS#11 modules with operations such as adding and deleting , changing passwords, and so on.
[注释 19] NIST. FIPS PUB 140-1, Network Security Services Security Policy, maintenance NSS 3.2.2
[注释 20] F. Hecker, "Mozilla Crypto/PKI Support", http://www.hecker.org/mozilla/mozilla-crypto-pki.pdf
[注释 21] J. Ruderman, "Form Bookmarklets", squarefree.com, April 5, 2004.

Article continued on 第3页