Package Runtime Secret File Access Followed by IMDS Request

Last updated 4 days ago on 2026-10-23
Created 4 days ago on 2026-10-23

About

Identifies a Python, Node.js, Bun, Deno, Ruby, PHP or Perl runtime, or a binary executing from a package install location, that opens a developer secret (SSH keys, package registry tokens, source control credentials or AI coding assistant credentials) and then connects to a cloud instance metadata service (IMDS) endpoint within one minute. This sequence matches credential stealers delivered through compromised packages, such as the malicious LiteLLM PyPI releases, while cloud provider credential files are excluded because legitimate cloud SDK credential chains read them before falling back to IMDS.
Tags
Domain: EndpointDomain: CloudOS: macOSOS: WindowsUse Case: Threat DetectionTactic: Credential AccessTactic: Initial AccessData Source: Elastic DefendThreat: Supply ChainThreat: IMDS Credential TheftRule Type: Event Correlation (EQL)Platform: macOSPlatform: WindowsDomain: GenAIMitre Atlas: AML.T0010Mitre Atlas: AML.T0010.001Mitre Atlas: AML.T0055Mitre Atlas: AML.T0083Language: eql
Severity
high
Risk Score
73
MITRE ATT&CK™

Credential Access (TA0006)(external, opens in a new tab or window)

Initial Access (TA0001)(external, opens in a new tab or window)

False Positive Examples
Developer or deployment scripts running on cloud-hosted macOS or Windows instances may read a package registry or source control token and then request instance role credentials from the same interpreter (for example a release script that publishes a package and uploads artifacts with the instance role). Validate the script path, parent process and whether the host is an approved build or release system. AI coding assistants running on cloud instances may read their own credential file and then fall back to the instance metadata service for cloud provider authentication (for example Gemini CLI on Google Compute Engine). Confirm the process is the assistant itself and that the credential file belongs to that assistant.
License
Elastic License v2(external, opens in a new tab or window)

Definition

Rule Type
Event Correlation Rule
Integration Pack
Prebuilt Security Detection Rules
Index Patterns
logs-endpoint.events.file-*logs-endpoint.events.network-*
Related Integrations

endpoint(external, opens in a new tab or window)

Query
text code block:
sequence by process.entity_id with maxspan=1m [file where event.action == "open" and host.os.type in ("macos", "windows") and file.path like~ ( /* SSH private keys */ "/Users/*/.ssh/id_*", "?:\\Users\\*\\.ssh\\id_*", /* Package registry, source control and secrets manager tokens */ "/Users/*/.npmrc", "?:\\Users\\*\\.npmrc", "/Users/*/.pypirc", "?:\\Users\\*\\.pypirc", "/Users/*/.git-credentials", "?:\\Users\\*\\.git-credentials", "/Users/*/.config/git/credentials", "?:\\Users\\*\\.config\\git\\credentials", "/Users/*/.config/gh/hosts.yml", "?:\\Users\\*\\AppData\\Roaming\\GitHub CLI\\hosts.yml", "/Users/*/.vault-token", "?:\\Users\\*\\.vault-token", "/Users/*/.terraform.d/credentials.tfrc.json", "?:\\Users\\*\\AppData\\Roaming\\terraform.d\\credentials.tfrc.json", /* Additional package registry and AI/ML platform tokens */ "/Users/*/.yarnrc.yml", "?:\\Users\\*\\.yarnrc.yml", "/Users/*/.gem/credentials", "?:\\Users\\*\\.gem\\credentials", "/Users/*/.cargo/credentials.toml", "?:\\Users\\*\\.cargo\\credentials.toml", "/Users/*/.composer/auth.json", "/Users/*/.config/composer/auth.json", "?:\\Users\\*\\AppData\\Roaming\\Composer\\auth.json", "/Users/*/.cache/huggingface/token", "/Users/*/.huggingface/token", "?:\\Users\\*\\.cache\\huggingface\\token", "?:\\Users\\*\\.huggingface\\token", "/Users/*/.config/github-copilot/apps.json", "/Users/*/.config/github-copilot/hosts.json", "?:\\Users\\*\\AppData\\Local\\github-copilot\\apps.json", "?:\\Users\\*\\AppData\\Local\\github-copilot\\hosts.json", "/Users/*/.ollama/id_ed25519", "?:\\Users\\*\\.ollama\\id_ed25519", /* AI coding assistant credentials */ "/Users/*/.claude/.credentials.json", "?:\\Users\\*\\.claude\\.credentials.json", "/Users/*/.codex/auth.json", "?:\\Users\\*\\.codex\\auth.json", "/Users/*/.codex/.credentials.json", "?:\\Users\\*\\.codex\\.credentials.json", "/Users/*/.codex/secrets/*.age", "?:\\Users\\*\\.codex\\secrets\\*.age", "/Users/*/.gemini/oauth_creds.json", "?:\\Users\\*\\.gemini\\oauth_creds.json", "/Users/*/.gemini/gemini-credentials.json", "?:\\Users\\*\\.gemini\\gemini-credentials.json", "/Users/*/.gemini/mcp-oauth-tokens.json", "?:\\Users\\*\\.gemini\\mcp-oauth-tokens.json", "/Users/*/.gemini/a2a-oauth-tokens.json", "?:\\Users\\*\\.gemini\\a2a-oauth-tokens.json", "/Users/*/.qwen/oauth_creds.json", "?:\\Users\\*\\.qwen\\oauth_creds.json", "/Users/*/.qwen/mcp-oauth-tokens.json", "?:\\Users\\*\\.qwen\\mcp-oauth-tokens.json", "/Users/*/.aws/sso/cache/kiro-auth-token.json", "?:\\Users\\*\\.aws\\sso\\cache\\kiro-auth-token.json", "/Users/*/.local/share/opencode/auth.json", "?:\\Users\\*\\.local\\share\\opencode\\auth.json", "/Users/*/.local/share/opencode/mcp-auth.json", "?:\\Users\\*\\.local\\share\\opencode\\mcp-auth.json", "/Users/*/.local/share/amp/secrets.json", "?:\\Users\\*\\.local\\share\\amp\\secrets.json", "/Users/*/.augment/session.json", "?:\\Users\\*\\.augment\\session.json", "/Users/*/.kimi/credentials/kimi-code.json", "?:\\Users\\*\\.kimi\\credentials\\kimi-code.json", "/Users/*/.cursor/auth.json", "?:\\Users\\*\\.cursor\\auth.json", "/Users/*/.pi/agent/auth.json", "?:\\Users\\*\\.pi\\agent\\auth.json", "/Users/*/.config/goose/secrets.yaml", "?:\\Users\\*\\AppData\\Roaming\\Block\\goose\\config\\secrets.yaml", "/Users/*/.config/muse/auth.json", "?:\\Users\\*\\.config\\muse\\auth.json", "/Users/*/.local/share/devin/credentials.toml", "?:\\Users\\*\\AppData\\Roaming\\devin\\credentials.toml", "/Users/*/.openclaw/credentials/oauth.json", "?:\\Users\\*\\.openclaw\\credentials\\oauth.json", "/Users/*/.openclaw/agents/*/agent/auth-profiles.json", "?:\\Users\\*\\.openclaw\\agents\\*\\agent\\auth-profiles.json", "/Users/*/.openclaw/agents/*/agent/auth.json", "?:\\Users\\*\\.openclaw\\agents\\*\\agent\\auth.json" ) and /* SSH public keys are not secrets and are routinely read by SSH and cloud tooling */ not file.path like~ "*.pub" and /* Package ecosystem runtimes or binaries executing from package install locations */ ( process.name like~ ("python*", "node", "node.exe", "nodejs", "bun", "bun.exe", "deno", "deno.exe", "ruby*", "php*", "perl*") or process.executable like~ ("*/site-packages/*", "*/dist-packages/*", "*/node_modules/*", "*\\site-packages\\*", "*\\node_modules\\*", "*/.venv/*", "*/venv/*", "*\\.venv\\*", "*\\venv\\*") ) ] [network where cidrmatch(destination.ip, "169.254.169.254/32", "169.254.170.2/32", "169.254.170.23/32", "100.100.100.200/32", "fd00:ec2::254/128", "fd00:ec2::23/128") and destination.port == 80 and event.action == "connection_attempted" and host.os.type in ("macos", "windows") ]

Install detection rules in Elastic Security

Detect Package Runtime Secret File Access Followed by IMDS Request in the Elastic Security detection engine by installing this rule into your Elastic Stack.

To setup this rule, check out the installation guide for Prebuilt Security Detection Rules(external, opens in a new tab or window).