LOGIN DATA
LOCAL STATE
SQLITE
DPAPI
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting Browser Credential Store Theft

A browser keeps its saved passwords in a SQLite file that only the browser should ever open. When anything else reads it, you have a high-fidelity signal.

Scroll

Nearly every infostealer targets the browser password store. Chromium-based browsers keep saved logins in a SQLite file named Login Data and protect the values with a key held in Local State; Firefox uses logins.json and key4.db. The access pattern is narrow and consistent, so a process that is not a browser touching these files is one of the cleanest detections in the stealer set.

Signals at a Glance

SignalWhereATT&CK
Non-browser process reads Login Data, logins.json or key4.dbEDR file-access telemetry, Security 4663T1555.003
Copy of a credential store created in a temp or staging pathSysmon 11, EDR file eventsT1555.003
Local State read by the same process that read Login DataEDR, Security 4663T1555.003
SQLite tooling or script opening browser profile databasesProcess creation, script loggingT1555.003
Unsigned binary in a user-writable path touching several browser profilesEDR, file-access auditT1005

Auditing Access to the Stores

Sysmon does not log file reads, so reads need either EDR file-access telemetry or a Windows System ACL (SACL) on the stores. A SACL on each profile’s Login Data and Local State generates Security event 4663 for every read. Enable the File System audit subcategory first, then set the audit rule:

# Enable object-access auditing for the file system (once, via GPO in production)
auditpol /set /subcategory:"File System" /success:enable

# Add a read audit rule to a Chromium credential store (repeat per profile and browser)
$p = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Login Data"
$acl = Get-Acl $p
$rule = New-Object System.Security.AccessControl.FileSystemAuditRule(
    "Everyone", "ReadData", "Success")
$acl.AddAuditRule($rule)
Set-Acl -Path $p -AclObject $acl
# tune/validate: test on a pilot group; browsers read these files at startup,
# so expect a high volume from the browser itself until you allowlist it.

Then alert on every reader that is not a browser or a known security agent:

// Microsoft Sentinel (KQL) - non-browser reads of browser credential stores
let Browsers = dynamic(["chrome.exe","msedge.exe","firefox.exe","brave.exe","opera.exe","vivaldi.exe"]);
SecurityEvent
| where EventID == 4663
| where ObjectName has_any ("\\Login Data", "\\Local State", "logins.json", "key4.db")
| where AccessMask in ("0x1", "0x120089")
| extend Proc = tolower(tostring(split(ProcessName, "\\")[-1]))
| where Proc !in (Browsers)
| summarize reads=count(), files=make_set(ObjectName, 10) by Computer, SubjectUserName, ProcessName, bin(TimeGenerated, 15m)
// tune/validate: allowlist your EDR, backup and profile-sync agents by full path

Hardening and Triage

Vetted sources

Start from SigmaHQ credential-access rules for browser data, Elastic detection rules for credential access from web browsers, Splunk ESCU analytics for browser credential access and the MITRE ATT&CK T1555.003 page. Baseline your own environment first — password managers, backup and migration tools legitimately read these files.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026