Openclaw Credential Exposure Plaintext Storage Vidar Stealer 2.0 Technical Analysis

OpenClaw Credential Exposure: How Plaintext Storage Turns Any Malware Into an Identity Thief

OpenClaw Credential Exposure: How Plaintext Storage Turns Any Malware Into an Identity Thief

Executive Summary

On February 13, 2026, threat intelligence monitoring detected the first case of infostealer malware exfiltrating AI agent configuration files. While a Vidar Stealer 2.0 infection was the specific malware involved, our analysis reveals the underlying problem is not Vidar-specific: OpenClaw stores gateway tokens, RSA private keys, and behavioral configuration in plaintext files under ~/.openclaw/. Any malware with basic file read capability — or even local user access — can extract these credentials without any specialized module.

This report covers Vidar 2.0's technical architecture as the malware that triggered the incident, but the core finding is an insecure-by-design credential storage model in OpenClaw that makes AI agent identity trivially stealable by any threat.

T1005 - Data from Local System T1102.001 - Dead Drop Resolver T1555.003 - Credentials from Web Browsers T1528 - Steal Application Access Token T1555.005 - Cloud Secrets T1071.001 - Web Protocols T1027.002 - Software Packing
VIDAR STEALER 2.0 — BY THE NUMBERS
274
Static Functions
0
Static Imports
$300
MaaS Price (Lifetime)
#4
Q4 2025 Sandbox Rank

Background: The Vidar Family

Vidar is a fork of the Arkei infostealer, first observed in late 2018. Over eight years, the family spawned multiple derivatives — Oski, Mars Stealer, and StealC — making it one of the most prolific infostealer lineages in the threat landscape. Open-source threat intelligence databases list 74+ published reports on Vidar variants, tracked by over 30 organizations.

Prevalence surged in late 2025 following the law enforcement takedown of Lumma Stealer infrastructure. With Lumma disrupted, operators migrated to alternatives. Sandbox telemetry ranked Vidar #4 in Q4 2025 with 4,498 detections. International law enforcement operations in 2025 specifically targeted Vidar infrastructure. The 2.0 release landed at the intersection of this demand surge.

Architecture and Anti-Analysis

Vidar 2.0 is a PE32+ x64 executable compiled from pure C (replacing v1.x C++ codebase). The reference sample (bcf8a6..., October 2025) has a .text section of ~342 KB, contains 274 functions, and zero static imports. All Windows API resolution is performed dynamically at runtime.

Control Flow Flattening

Every function is transformed through control flow flattening (CFF). Each function body is converted into a state machine driven by magic number comparisons. The original control flow graph is replaced by a flat while(true) loop containing a switch-equivalent dispatcher. State transitions use hardcoded magic numbers such as 0xef25c2e, -0x1ccdc046, and 0x3faa991b. Applied across all 274 functions, making decompiler output largely unreadable without manual intervention.

Key Finding

Polymorphic builder: Vidar 2.0 generates a unique binary per build. While functional logic remains constant, structural variation means simple byte-pattern signatures are unreliable. Detection must target behavioral patterns and string constants.

Anti-Debug and Self-Deletion

Technique Function Address
Debugger Detection check_debugger_present 0x140040eb8
Timing Checks get_tick_count_wrapper 0x140040f21
Anti-Debug Gate 1 anti_debug_check_1 0x140041c58
Anti-Debug Gate 2 anti_debug_check_2 0x140041df7
Self-Deletion cmd.exe /c timeout /t 10 & rd /s /q Post-execution

Execution Flow

VIDAR 2.0 — EXECUTION CHAIN
1
Dead-Drop Resolution
Fetches hardcoded Telegram/Steam profile pages via HTTPS. Extracts real C2 IP from profile bio field. Domains rotate every ~4 days.

2
Configuration Download
HTTP GET to 4-digit campaign ID path (empty User-Agent). C2 responds with grabber config + DLL dependency ZIP (nss3.dll, mozglue.dll, etc.).

3
Multithreaded Collection
Auto-scales threads by hardware. Credential theft modules execute concurrently — browsers, wallets, cloud tokens, messaging, file grabber. Captures desktop screenshot + system info.

4
HTTP Exfiltration
HTTP POST via multipart/form-data with 20-char random boundaries. Fields: token, profile, hwid, file, build_id, mode. SSL validation disabled. Self-deletes on completion.
Dead-Drop URLs (Reference Sample)

https://telegram[.]me/ahnadar
https://steamcommunity[.]com/profiles/76561198780411257
Extracted domain: xp.lorenabulei[.]com

SETUP DATA THEFT CLEANUP Initialization main_wrapper Anti-Analysis debugger + timing System Profiling HWID + process list Credential Theft browsers + cloud multithreaded File Grabber C2-configured Screenshot screenshot.jpg Exfiltration HTTP POST Self-Delete rd /s /q 1 2 3 4 5 6 7 8 Setup phase Data theft phase Cleanup phase

Internally, the configuration is stored in a VidarConfig struct: data_buffer[0x200] at offset 0x0, server_address at +0x200, and token at +0x300. The User-Agent string is hardcoded:

Hardcoded User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:145.0) Gecko/20100101 Firefox/145.0

Data Targeting Capabilities

Vidar 2.0's theft capabilities fall into two categories: hardcoded modules targeting specific applications with dedicated parsing logic, and a configurable file grabber that sweeps arbitrary directories based on C2-provided configuration.

Image: Cloud Credential Theft - CFF Decompile
Ghidra Decompile — mal_stealcloudcreds int64 __fastcall mal_stealcloudcreds(__int64 a1) { unsigned int v1; // edi int v3; // eax unsigned int v4; // ebx int v7, v8, v9; bool v11; v3 = -964403949; v4 = 0; // Control Flow Flattening while ( 1 ) { while ( 1 ) { while ( v3 > 894956600 ) { if ( v3 == 894956601 ) { v7 = v4 + mal_findazure(a1); v8 = v7 + mal_findaws(a1); v9 = mal_msalidentity(a1); v3 = 2112397915; // state transition CLOUD CREDENTIAL THEFT FUNCTIONS

Decompiled mal_stealcloudcreds function showing control flow flattening and calls to mal_findazure, mal_findaws, mal_msalidentity.

Browser Credentials

Targets Chrome, Edge, Firefox, Opera, Vivaldi, Waterfox, and Palemoon. Implements a complete Chrome AppBound cookie bypass (effective against Chrome v127+):

Browser attack chain - compact

Chrome AppBound Bypass Chain

✓ Key Extraction — browser_v20_key_extraction at 0x14001379d extracts v20 key from Local State
✓ AES-256-GCM Decryption — BCryptOpenAlgorithmProvider → BCryptSetProperty → BCryptGenerateSymmetricKey → BCryptDecrypt
✓ DPAPI Fallback — CryptUnprotectData for older Chrome versions
✓ Validate & Upload — validate_v20_key at 0x1400154f0, queue_v20_key_upload at 0x1400157fb

Cloud Credentials (New in 2.0)

Decompile: FUN_14003eaf4 - (vidar) S Ro 2 int FUN_14003eaf4(longlong param_1) 4 { 5 DWORD DVar1; 7 int iVar3; 9 CHAR local_258 [272]; 10 CHAR local_148 [264]; 12 DVar1 = GetEnvironmentVariableA("USERPROFILE",local_258,0x104); 13 iVar3 = 0x423a8a26; 14 while( true ) { 15 while( true ) { 16 while (-0x1cdab540 < iVar3) { 17 if ((iVar3 == -0x1cdab53f) || (iVar3 == 0x5c944b65)) { ... 26 unaff_EBP = FUN_14003ec16(param_1,(longlong)local_148,0x140058875,0x14005826c,0); 29 if (iVar3 == -0x33f9609c) break; 31 FUN_1400431b0((longlong)local_148,0x104,(longlong)local_258); 33 DVar2 = GetFileAttributesA(local_148); 35 if (DVar2 == 0xffffffff) { 36 iVar3 = 0x5c944b65; 40 return unaff_EBP; 41 } USERPROFILE LOOKUP PATH VALIDATION

Ghidra decompile of FUN_14003eaf4 (steal_azure_msal_userprofile) — reads USERPROFILE environment variable, constructs paths to Azure/.IdentityService directories, validates with GetFileAttributesA. Note the control flow flattening state machine.

Critical Finding

Vidar 2.0 includes purpose-built cloud credential theft. The data classification function at 0x1400042fd labels stolen tokens as "Azure Reader" — confirming this is intentional targeting, not incidental collection.

Target Function Path
Azure MSAL (LocalAppData) steal_azure_msal_localappdata %LOCALAPPDATA%\.IdentityService\msal.cache
Azure MSAL (UserProfile) steal_azure_msal_userprofile %USERPROFILE%\.azure\
AWS Credentials steal_aws_credentials %USERPROFILE%\.aws\credentials

Additional Targets

Category Key Function Details
Crypto Wallets steal_crypto_wallets 50+ wallets: Litecoin, Bitcoin, Ethereum, Zcash, DashCore, browser extensions
Telegram steal_telegram_sessions Session file extraction for account hijacking
Steam steal_steam_credentials Dedicated loginusers.vdf parser
Generic File Grabber recursive_file_stealer_engine Directory-name matching, 10-level depth, C2-configurable patterns
How the File Grabber Works

The recursive_file_stealer_engine operates on directory-name matching — not content inspection. It uses FindFirstFileA/FindNextFileA for enumeration and validates paths with GetFileAttributesA. Pattern list is configurable per campaign via C2.

The OpenClaw Exposure: Insecure by Design

Vidar 2.0 was the malware that triggered this incident — but our analysis concludes that the vulnerability is in OpenClaw, not in Vidar. OpenClaw stores all authentication material as plaintext files in the user's home directory. No encryption, no OS credential store integration (Windows DPAPI, macOS Keychain, Linux Secret Service), and no filesystem access controls beyond default permissions.

Core Finding - Red callout
Core Finding

Any malware with basic file read capability — or even local user access — can extract a victim's full AI agent identity. No specialized infostealer module, no reverse engineering of OpenClaw's protocol, and no exploitation of any CVE is required. A simple cat ~/.openclaw/openclaw.json is sufficient.

What Is Stored in Plaintext

The ~/.openclaw/ directory contains the following files, all readable by any process running as the user:

What's exposed table
File Contents Risk
openclaw.json Gateway token, OAuth credentials, model configuration, workspace path Full API access
device.json RSA private key pair, device identity Device impersonation
device-auth.json Device authentication tokens Session hijack
SOUL.md Behavioral configuration, system prompts, agent personality Prompt extraction
AGENTS.md, TOOLS.md Agent definitions, tool configurations, integration details Capability mapping

With these files, an attacker can impersonate the victim's AI agent, make API calls on their behalf, access their workspace, and extract proprietary system prompts — all without ever authenticating.

Why This Is Not a Vidar Problem

Vidar's recursive_file_stealer_engine collected these files because the C2 operator configured .openclaw as a directory-name pattern. There is no dedicated OpenClaw module in the binary. Any malware family with file enumeration capability — Lumma, RedLine, Raccoon, StealC, or even a basic RAT — can replicate this theft with equal ease. The barrier to entry is zero because the secrets require no decryption.

Contrast: Browser Credentials vs OpenClaw Credentials

Browsers store passwords using AES-256-GCM encryption with DPAPI-protected keys. Stealing them requires a multi-step decryption chain (BCryptOpenAlgorithmProvider → BCryptDecrypt) that only purpose-built infostealers implement. OpenClaw credentials require no decryption at all — they are readable as-is from disk.

This means the attack surface for OpenClaw credential theft is fundamentally larger than browser credential theft: every file-reading malware is an OpenClaw credential stealer by default.

Known CVEs

Multiple CVEs have been assigned to OpenClaw's credential handling and related vulnerabilities:

CVE-2026-25253 Remote Code Execution via crafted workspace files
CVE-2026-27001 Prompt injection via tool output
CVE-2026-26325 Authentication bypass in gateway token validation
CVE-2026-26327 Insufficient credential storage protection
CVE-2026-24763 Unauthorized file access via path traversal

Evidence: The February 13 Incident

On February 13, 2026, threat intelligence platforms detected stolen OpenClaw configuration files from an infostealer infection. The exfiltrated data included 14 files from the victim's ~/.openclaw/ directory:

Images: OpenClaw Plaintext Exposure
? Unknown [2 friends] [busines...[61563836279586] IP: Not Found | Compromised: Feb 13, 2026, 02:49 PM Matching Paths 14 Matching Files 14 All Paths 305 Directory Structure openclaw.json paired.json pending.json device-auth.json device.json AGENTS.md TOOLS.md USER.md SOUL.md

Stolen ~/.openclaw/ directory contents — 14 matching files exfiltrated.

openclaw.json CODE TEXT 1 { 2 "agents": { 3 "defaults": { 4 "workspace": "C:\\Users\\psdma\\.openclaw\\workspace", 5 "models": { 6 "google-antigravity/claude-opus-4-5-thinking": {} 9 "primary": "google-antigravity/claude-opus-4-5-thinking" ... 13 "gateway": { 14 "mode": "local", 15 "auth": { 16 "mode": "token", 17 "token": " REDACTED — PLAINTEXT TOKEN " 19 "port": 18789, 20 "bind": "loopback", ... 33 "auth": { 34 "profiles": { 35 "google-antigravity: REDACTED EMAIL @gmail.com": { 36 "provider": "google-antigravity", 37 "mode": "oauth", 38 "email": " REDACTED EMAIL @gmail.com" 53 lines Files/D_Drive/Documents and Settings/psdma/.ope... 1.1 KB Json

Contents of the stolen openclaw.json — gateway token, workspace path, victim email, and OAuth credentials stored in plaintext.

Detection and Hunting Guidance

Network Indicators

Network IOCs 162.55.213.180:80 — Primary C2 (Hetzner, AS24940)
45.139.186.93:80 — Payload delivery
147.45.44.209 — Dec 2025–Jan 2026 campaigns
xp.lorenabulei[.]com — Dead-drop extracted domain

SSL Certificate DN: C=XX, ST=NY, L=NY, O=StaticIP

Endpoint Indicators

Behavioral Detection Opportunities

☐ Process injection — RegAsm.exe spawned by suspicious parent process
☐ Self-deletion — cmd.exe /c timeout /t 10 & rd /s /q command line
☐ Dropped DLLs in %TEMP% — nss3.dll, mozglue.dll, softokn3.dll, freebl3.dll
☐ BCrypt API chain — BCryptOpenAlgorithmProvider → BCryptDecrypt from non-browser process
☐ HTTP exfiltration — POST with multipart/form-data containing fields: token, profile, hwid, file
☐ Dead-drop resolution — Non-browser process connecting to telegram.me or steamcommunity.com profile pages

Mitigation and Remediation

If Compromised

Immediate Response Actions

☐ Rotate all browser-saved credentials — Change passwords for every account stored in Chrome, Edge, or Firefox. Assume all saved credentials are compromised.
☐ Invalidate browser sessions — Sign out of all active sessions on every service. Stolen cookies allow session hijacking without passwords.
☐ Revoke Azure/AWS tokens — Invalidate all MSAL cached tokens via Azure AD admin portal. Rotate AWS access keys and session tokens in IAM console.
☐ Revoke Telegram sessions — Terminate all other sessions from Settings → Devices. Stolen session files allow full account hijack.
☐ Move crypto wallet funds — Transfer all assets to a new wallet generated on a clean device. Wallet files and seed data may be exfiltrated.
☐ Reimage the host — Vidar self-deletes but may have been delivered alongside persistent malware. A full reimage is the safest remediation.

OpenClaw-Specific Remediation

Minimum safe version: v2026.2.15 — Update immediately

OpenClaw Hardening

☐ Rotate gateway tokens — Regenerate openclaw.json authentication tokens and device.json RSA key pairs
☐ Deploy in isolated VM — Follow vendor guidance on identity isolation and runtime risk
☐ Monitor ~/.openclaw/ access — Alert on non-OpenClaw processes reading this directory
☐ Audit ClawHub skills — Review installed skills with VirusTotal Code Insight integration; deploy SentinelOne ClawSec or openclaw-security-monitor

Preventive Hardening

Reduce Attack Surface

☐ Stop saving passwords in browsers — Use a dedicated password manager instead. Browser credential stores are the primary target for every infostealer family.
☐ Enable phishing-resistant MFA — FIDO2/WebAuthn hardware keys for all cloud services (Azure, AWS). Stolen tokens are useless if sessions require re-authentication.
☐ Restrict outbound connections — Block non-browser processes from connecting to telegram.me and steamcommunity.com to break dead-drop resolution.
☐ Deploy EDR with credential theft detection — Monitor for BCrypt API chains and DPAPI calls from non-browser processes. Alert on RegAsm.exe process injection.
☐ Implement Azure Conditional Access — Enforce device compliance and token binding to limit the value of stolen MSAL cache tokens.

MITRE ATT&CK Mapping

Technique Name Implementation
T1005 Data from Local System File grabber sweeps local directories
T1102.001 Dead Drop Resolver C2 IP from Telegram/Steam profile bios
T1555.003 Credentials from Web Browsers Chrome AppBound bypass, Firefox key4.db
T1555.005 Cloud Secrets Manager Azure MSAL + CLI tokens, AWS credentials
T1528 Steal Application Access Token Azure MSAL cache, OpenClaw gateway tokens
T1071.001 Web Protocols HTTP POST multipart/form-data exfiltration
T1027.002 Software Packing CFF across all 274 functions
T1113 Screen Capture Desktop screenshot as screenshot.jpg