Scan Report
55 /100
memex
Unified memory plugin for OpenClaw — conversation memory + document search in a single SQLite database
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.
Use with caution
Remove or replace the telemetry module with transparent, opt-in analytics. Document all network communications. Base64 obfuscation to 'avoid VirusTotal flags' is a significant red flag requiring immediate vendor clarification.
Attack Chain 4 steps
⬡
Escalation Plugin loaded and initialized by OpenClaw gateway
index.ts:385⬡
Escalation initTelemetry() called with base64-encoded endpoint URL and token
src/telemetry.ts:19⬡
Escalation On plugin registration, track('plugin_registered') sends machineId (hashed hostname), version, vectorDim, memoryCount to telemetry-relay-memex.mlab42.workers.dev
index.ts:669⬡
Escalation On every recall/store/forget operation, additional telemetry events sent tracking usage patterns
src/tools.ts:145Findings 6 items
| Severity | Finding | Location |
|---|---|---|
| High | Hidden Telemetry with Evasion-Intent Comment | src/telemetry.ts:1 |
| High | Machine Fingerprinting via Hostname Hash | src/telemetry.ts:14 |
| High | Active Telemetry on Every Operation | index.ts:664 |
| Medium | Undocumented Dependency on External Service | package.json:7 |
| Medium | Network Access Not Declared in Plugin Manifest | openclaw.plugin.json:1 |
| Low | AGENTS.md Documents Dangerous Command | AGENTS.md:56 |
| Resource | Declared | Inferred | Status | Evidence |
|---|---|---|---|---|
| Network | NONE | READ | ✗ Violation | src/telemetry.ts:19-32 — initTelemetry() sends to external server, index.ts:664-… |
| Filesystem | NONE | WRITE | ✗ Violation | index.ts:1056-1078 — runBackup() writes JSONL files, session-indexing reads/writ… |
2 Critical 3 findings
Critical Dangerous Command 危险 Shell 命令
rm -rf ~ AGENTS.md:56 Critical Encoded Execution Base64 编码执行(代码混淆)
Buffer.from(s, "base64" src/telemetry.ts:8 Medium External URL 外部 URL
https://api.jina.ai/v1/rerank src/retriever.ts:36 File Tree
31 files · 510.5 KB · 14902 lines TypeScript 25f · 14435L
Markdown 4f · 295L
JSON 2f · 172L
├─
▾
src
│ ├─
adaptive-retrieval.ts
TypeScript
│ ├─
capture-windows.ts
TypeScript
│ ├─
chunker.ts
TypeScript
│ ├─
cli.ts
TypeScript
│ ├─
collections.ts
TypeScript
│ ├─
db.ts
TypeScript
│ ├─
doc-indexer.ts
TypeScript
│ ├─
embedder.ts
TypeScript
│ ├─
formatter.ts
TypeScript
│ ├─
importance.ts
TypeScript
│ ├─
llm.ts
TypeScript
│ ├─
memory-instructions.ts
TypeScript
│ ├─
memory.ts
TypeScript
│ ├─
migrate-lancedb.ts
TypeScript
│ ├─
migrate.ts
TypeScript
│ ├─
noise-filter.ts
TypeScript
│ ├─
retriever.ts
TypeScript
│ ├─
scopes.ts
TypeScript
│ ├─
search.ts
TypeScript
│ ├─
session-indexer.ts
TypeScript
│ ├─
telemetry.ts
TypeScript
│ ├─
tools.ts
TypeScript
│ ├─
unified-recall.ts
TypeScript
│ └─
unified-retriever.ts
TypeScript
├─
AGENTS.md
Markdown
├─
CLAUDE.md
Markdown
├─
index.ts
TypeScript
├─
openclaw.plugin.json
JSON
├─
package.json
JSON
├─
README.md
Markdown
└─
SKILL.md
Markdown
Dependencies 3 items
| Package | Version | Source | Known Vulns | 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 |
Security Positives
✓ No direct shell execution (exec, spawn, eval) found in codebase
✓ No credential harvesting from environment variables
✓ No access to sensitive paths like ~/.ssh, ~/.aws, or .env files
✓ No base64-decode-and-execute patterns
✓ Telemetry can be disabled via MEMEX_TELEMETRY=0 or MEMEX_DO_NOT_TRACK=1 environment variables
✓ Memory operations are properly scoped and sandboxed within SQLite