2026-10-24 Aokigahara Infostealer — AI and Cloud Credential Theft | Sentinel Hunts

Threat Overview

Check Point Research published its technical analysis of Aokigahara on 23 October 2026. The Windows infostealer has been observed in the wild and collects browser sessions, password-manager and VPN data, SSH/Git/cloud credentials, and AI/developer-tool authentication material (Claude, Codex, ChatGPT Desktop, Cursor, Windsurf, GitHub Copilot and Gemini CLI). CPR identified encrypted X25519/AES-GCM upload traffic and three C2 endpoints: /gate/handshake, /gate/chunk and /gate/complete. Its collection capabilities are confirmed through malware analysis; monetization of stolen AI accounts remains researcher assessment, not an observed outcome. Initial-access vector, distribution mechanism and affected organizations were not established in the cited report.

References

Check Point Research, Infostealer riding the AI Train, 2026-10-23

Impacted Systems

Vendor/product: Aokigahara malware, not a product vulnerability. Platform: Windows endpoints and developer workstations; AI/developer clients, Chromium/Firefox, VPN and password managers, cloud CLIs, Git/SSH. Affected versions: Not version-bounded; any accessible credentials/files are targets. Prerequisite: Malware execution in the user context. Exposure: User endpoint execution, not an Internet-facing listening service. Fixed version: Not applicable. Unaffected: Non-executing hosts are not affected by this malware instance; non-Windows builds were not confirmed.

Why this matters

Stealing local AI, cloud, source-control and SSH secrets can bypass the protection of the applications that store them and enable follow-on cloud and developer-platform compromise.

Exploitation Status

Confirmed by Check Point Research (2026-10-23): malware observed in the wild; Windows data-theft capabilities, C2 protocol and IOCs. Not confirmed: initial infection chain, number of compromised organizations, successful enterprise cloud access or monetization. Researcher assessment: stolen tokens could be reused for unauthorized AI, code repository or cloud access.

What this hunt looks for

This package defines searches for Microsoft Sentinel endpoint (DeviceProcessEvents, DeviceFileEvents, DeviceNetworkEvents), firewall/HTTP proxy (CommonSecurityLog where URL/header detail exists), and Windows SecurityEvent 4688 fallbacks. Defender endpoint tables are not interchangeable with generic CrowdStrike or Harmony alert ingestion. No customer logs were reviewed or queried during preparation; the sections below describe what would be reviewed where the relevant data source is ingested into Microsoft Sentinel.

Required logs

DeviceProcessEvents; DeviceNetworkEvents; CommonSecurityLog; DeviceFileEvents; SecurityEvent

Hunt 01 — Known Aokigahara Sample Hashes

Signal: High. Telemetry: DeviceProcessEvents. Exact SHA1 values from CPR; high-confidence but incomplete family coverage.

let IOCs=dynamic(["007137599bc4d69ee952a5228b5fcb2c3b9a95a7","00d52c7e759d878f0d8a117502f6d854af13f007","04eddccb79db41e03a4ee8542e8a33d7f1d9fe18","057a2d1dedeb93b7765c455a9e0c469e7cbe4843","079ddf5cc7d6ca2e02f860f87d4d18c83db9d331","0b74ce90a39278fb97fe94f6306af71cbe679503","0c46ac5555cf8f305c1345a21d0802c52bf52cd8","0d8d0bad2e08856ba379e425e2e90e49506af631","0e76150cee3f2b89f0fbe39106ab2898db109f09","0f69792cb926a416766d47a30a05009c13be0d64"]);
DeviceProcessEvents
| where TimeGenerated >= ago(14d)
| where SHA1 in~ (IOCs)
| project TimeGenerated,DeviceName,FileName,FolderPath,SHA1,ProcessCommandLine,InitiatingProcessFileName
| order by TimeGenerated desc

Hunt 02 — Published C2 Destination Contacts

Signal: High. Telemetry: DeviceNetworkEvents. Network connections to CPR-published domains and IP, not generic AI service traffic.

let C2=dynamic(["dfwioeiofwr.info","dobeqnesmot.cc","gate.dfwioeiofwr.info","hjazfioe.surf","kkeyyou.cc","neihite.cc","somelitersofblood.pw"]);
DeviceNetworkEvents
| where TimeGenerated >= ago(14d)
| where RemoteIP == "2.26.252.48" or tolower(RemoteUrl) in (C2)
| project TimeGenerated,DeviceName,InitiatingProcessFileName,InitiatingProcessCommandLine,RemoteIP,RemotePort,RemoteUrl,ActionType
| order by TimeGenerated desc

Hunt 03 — Firewall and Proxy Published C2 Matches

Signal: High. Telemetry: CommonSecurityLog. Match known C2s in normalized firewall/proxy destination and URL fields.

let C2=dynamic(["dfwioeiofwr.info","dobeqnesmot.cc","gate.dfwioeiofwr.info","hjazfioe.surf","kkeyyou.cc","neihite.cc","somelitersofblood.pw"]);
CommonSecurityLog
| where TimeGenerated >= ago(14d)
| extend Host=tolower(tostring(column_ifexists("DestinationHostName",""))),Url=tolower(tostring(column_ifexists("RequestURL","")))
| where DestinationIP == "2.26.252.48" or Host in (C2) or Url has_any (C2)
| project TimeGenerated,DeviceVendor,DeviceProduct,SourceIP,DestinationIP,Host,Url,DeviceAction,Message
| order by TimeGenerated desc

Hunt 04 — Aokigahara HTTP Gate Sequence

Signal: High. Telemetry: CommonSecurityLog. Require multiple exact path endpoints from same source/destination within a short window.

CommonSecurityLog
| where TimeGenerated >= ago(14d)
| extend Url=tolower(tostring(column_ifexists("RequestURL","")))
| where Url contains "/gate/handshake" or Url contains "/gate/chunk" or Url contains "/gate/complete"
| extend Stage=case(Url contains "/gate/handshake","handshake",Url contains "/gate/chunk","chunk","complete")
| summarize Stages=make_set(Stage),Requests=count(),FirstSeen=min(TimeGenerated),LastSeen=max(TimeGenerated),URLs=make_set(Url,5) by SourceIP,DestinationIP,bin(TimeGenerated,30m)
| where set_has_element(Stages,"handshake") and set_has_element(Stages,"chunk")
| project FirstSeen,LastSeen,SourceIP,DestinationIP,Requests,Stages,URLs
| order by FirstSeen desc

Hunt 05 — Distinctive HTTP Headers and Gate Path

Signal: High. Telemetry: CommonSecurityLog. Require C2 path plus CPR-observed X-KEX/X-Chunk/X-Gate-Token header names when logged.

CommonSecurityLog
| where TimeGenerated >= ago(14d)
| extend Url=tolower(tostring(column_ifexists("RequestURL",""))),Ext=tostring(column_ifexists("AdditionalExtensions","")),Msg=tostring(column_ifexists("Message",""))
| where Url contains "/gate/handshake" or Url contains "/gate/chunk"
| where Ext has_any ("X-KEX","X-Gate-Token","X-Chunk-Index","X-Build-ID") or Msg has_any ("X-KEX","X-Gate-Token","X-Chunk-Index","X-Build-ID")
| project TimeGenerated,SourceIP,DestinationIP,Url,DeviceVendor,DeviceProduct,DeviceAction,Ext,Msg
| order by TimeGenerated desc

Hunt 06 — Clipper Staging Under Microsoft Vault

Signal: High. Telemetry: DeviceFileEvents. CPR-observed clipper deployment location, requiring executable file events beneath the folder.

DeviceFileEvents
| where TimeGenerated >= ago(14d)
| where FolderPath startswith @"C:\Microsoft\Vault\"
| where FileName endswith ".exe" or FileName endswith ".dll"
| project TimeGenerated,DeviceName,ActionType,FileName,FolderPath,SHA1,InitiatingProcessFileName,InitiatingProcessCommandLine
| order by TimeGenerated desc

Hunt 07 — Rare Process Egress to Public Destinations

Signal: Follow-up. Telemetry: DeviceNetworkEvents. Follow-up for unidentified stealer variants; filter unusual first-seen public destinations from non-standard execution locations.

let Known=DeviceNetworkEvents
| where TimeGenerated between (ago(30d)..ago(3d)) and RemoteIPType =~ "Public"
| summarize by DeviceId,RemoteIP;
DeviceNetworkEvents
| where TimeGenerated >= ago(3d) and RemoteIPType =~ "Public"
| where InitiatingProcessFolderPath has_any (@"\AppData\",@"\Temp\",@"\Downloads\",@"\Users\Public\")
| join kind=leftanti Known on DeviceId,RemoteIP
| project TimeGenerated,DeviceName,InitiatingProcessFileName,InitiatingProcessFolderPath,InitiatingProcessCommandLine,RemoteIP,RemotePort,RemoteUrl
| order by TimeGenerated desc

Hunt 08 — Windows Process Creation from Clipper Location

Signal: High. Telemetry: SecurityEvent. Windows 4688 fallback for suspicious binaries launched from CPR-observed staging directory.

SecurityEvent
| where TimeGenerated >= ago(14d) and EventID == 4688
| where NewProcessName startswith @"C:\Microsoft\Vault\"
| project TimeGenerated,Computer,Account,NewProcessName,CommandLine,ParentProcessName
| order by TimeGenerated desc

Detection Notes

Highest signal: exact CPR SHA1 and known C2 destinations, plus correlated /gate/handshake→/gate/chunk traffic with characteristic headers. C2 domains/IPs may rotate; hash matches cover known samples only. /gate/chunk alone is not unique to malware; HTTP header visibility often requires a full proxy/WAF. DeviceFileEvents records file events, not arbitrary read access; no file-access conclusion can be drawn from absent file events. Clipper path is a secondary behavior, not proof of credential theft.

Leave a Reply