memex
Hidden telemetry module sends machine ID and operational data to an external Cloudflare Workers endpoint via base64-encoded URLs, explicitly obfuscated to evade VirusTotal detection, with no disclosure in documentation.
Why this conclusion was reached
3/4 dimensions flagged2 undeclared or violating capabilities were inferred.
2 high-risk artifacts or egress signals were extracted.
The report includes 4 attack-chain steps and 3 severe findings.
Dependencies are present but no obvious high-risk issue stands out.
Attack Chain
reconnaissance · index.ts:385
Escalation · src/telemetry.ts:19
Exfiltration · index.ts:669
Exfiltration · src/tools.ts:145
What drove the risk score up
Telemetry sends data to https://telemetry-relay-memex.mlab42.workers.dev — not mentioned anywhere in SKILL.md or openclaw.plugin.json
src/telemetry.ts:1 contains comment 'Encoded to avoid false-positive VirusTotal flags on token patterns' — explicit admission of evasion intent
telemetry.ts:14-16 hashes hostname to create 'anonymous' machine ID, sent on every plugin registration and operation
Most important evidence
Hidden Telemetry with Evasion-Intent Comment
src/telemetry.ts contains base64-encoded URLs and token to send telemetry to telemetry-relay-memex.mlab42.workers.dev. The comment 'Encoded to avoid false-positive VirusTotal flags on token patterns' explicitly admits intentional obfuscation to evade security detection tools. This functionality is NOT declared in SKILL.md, README.md, or openclaw.plugin.json.
src/telemetry.ts:1 Machine Fingerprinting via Hostname Hash
The telemetry module creates a 'stable anonymous machine ID' by hashing the system hostname (telemetry.ts:14-16). While labeled 'anonymous', this creates a persistent fingerprint that can be correlated across sessions and tied to machine identity.
src/telemetry.ts:14 Active Telemetry on Every Operation
Telemetry is sent on plugin registration (index.ts:664), auto-recall (index.ts:834), memory store (tools.ts:347), memory forget (tools.ts:406), and errors (index.ts:840, tools.ts:249). While individually lightweight, this creates a comprehensive usage profile.
index.ts:664 Undocumented Dependency on External Service
package.json:7 depends on @ofan/telemetry-relay-sdk ^0.2.1. This Cloudflare Workers-based telemetry relay is not mentioned in any documentation and represents a third-party data collection pathway.
package.json:7 Network Access Not Declared in Plugin Manifest
The plugin performs HTTP requests to external embedding APIs and the hidden telemetry endpoint, but openclaw.plugin.json declares no network capabilities.
openclaw.plugin.json:1 AGENTS.md Documents Dangerous Command
AGENTS.md:56 references 'rm -rf ~' as a deploy command pattern. While this is documentation, it instructs users to execute a command that could delete home directories if misconfigured.
AGENTS.md:56 Declared capability vs actual capability
src/telemetry.ts:19-32 — initTelemetry() sends to external server, index.ts:664-672 sends plugin_registered event index.ts:1056-1078 — runBackup() writes JSONL files, session-indexing reads/writes Suspicious artifacts and egress
rm -rf ~ AGENTS.md:56
Buffer.from(s, "base64" src/telemetry.ts:8
https://api.jina.ai/v1/rerank src/retriever.ts:36
Dependencies and supply chain
| Package | Version | Source | Known vuln | Notes |
|---|---|---|---|---|
| @ofan/telemetry-relay-sdk | ^0.2.1 | npm | No | Hidden telemetry dependency — sends data to Cloudflare Workers endpoint |
| openai | ^6.21.0 | npm | No | Standard OpenAI client for embeddings |
| better-sqlite3 | ^11.0.0 | npm | No | Local SQLite database for memory storage |
File composition
index.ts src/retriever.ts