Scan Report
55 /100
Memory Workflow
三层存储记忆工作流,支持文件/FTS5/KG/Milvus搜索
Memory workflow skill has undeclared network exfiltration behavior: user memory content is sent to an external Ollama LLM service (scripts/store.py:extract_triples_via_llm) without disclosure in SKILL.md, combined with hardcoded Docker bridge IPs as service endpoints.
Use with caution
Either (1) document the Ollama LLM call and data transmission in SKILL.md, or (2) remove the external LLM dependency and rely solely on rule-based extraction. Consider making service endpoints configurable via environment variables with explicit user consent.
Attack Chain 4 steps
◎
Entry User stores memory content via MemoryStore tool
scripts/store.py:110⬡
Escalation store_memory() calls extract_triples_via_llm() with user content
scripts/store.py:130◉
Impact Content POSTed to OLLAMA_URL (default: host.docker.internal:11434) for LLM processing — exfiltrated outside skill sandbox
scripts/store.py:94◉
Impact get_embedding() sends same content to EMBEDDING_URL (default:
172.17.0.1:18779) scripts/store.py:170Findings 6 items
| Severity | Finding | Location |
|---|---|---|
| High | Undeclared LLM data transmission Data Exfil | scripts/store.py:94 |
| High | SKILL.md hides external service dependencies Doc Mismatch | SKILL.md:1 |
| High | Hardcoded Docker bridge IP addresses as default service endpoints Sensitive Access | scripts/config.py:12 |
| Medium | Embedding API call sends all content to external service Data Exfil | scripts/store.py:170 |
| Medium | Undeclared shell execution via subprocess Priv Escalation | scripts/tools.py:48 |
| Low | SKILL.md installation modifies AGENTS.md with shell commands Doc Mismatch | SKILL.md:12 |
| Resource | Declared | Inferred | Status | Evidence |
|---|---|---|---|---|
| Filesystem | WRITE | WRITE | ✓ Aligned | scripts/store.py: writes to ~/.openclaw/workspace/memory-workflow-data/ |
| Network | NONE | WRITE | ✗ Violation | scripts/store.py:94 — sends content to OLLAMA_URL via urllib; scripts/store.py:1… |
| Shell | NONE | WRITE | ✗ Violation | scripts/tools.py:48 — subprocess.run executes memory_ops.py; scripts/save_sessio… |
| Environment | READ | READ | ✓ Aligned | scripts/config.py:14-17, store.py:32-34 — reads OLLAMA_URL, MILVUS_HOST, etc. |
| Skill Invoke | WRITE | WRITE | ✓ Aligned | SKILL.md declares 6 tool interfaces |
1 High 4 findings
High IP Address 硬编码 IP 地址
172.17.0.1 scripts/config.py:12 Medium External URL 外部 URL
http://172.17.0.1:18778 scripts/config.py:12 Medium External URL 外部 URL
http://172.17.0.1:18779/v1/embeddings scripts/store.py:33 Medium External URL 外部 URL
http://host.docker.internal:11434 scripts/store.py:37 File Tree
9 files · 50.3 KB · 1648 lines Python 7f · 1492L
Markdown 2f · 156L
├─
▾
scripts
│ ├─
config.py
Python
│ ├─
fts5.py
Python
│ ├─
save_session.py
Python
│ ├─
search.py
Python
│ ├─
store.py
Python
│ └─
tools.py
Python
├─
memory_ops.py
Python
├─
README.md
Markdown
└─
SKILL.md
Markdown
Dependencies 3 items
| Package | Version | Source | Known Vulns | Notes |
|---|---|---|---|---|
pymilvus | unpinned | pip | No | Used for Milvus vector storage, imported conditionally |
jieba | unpinned | pip | No | Chinese segmentation, imported conditionally |
urllib.request | stdlib | Python | No | Used for HTTP calls to Ollama and embedding API |
Security Positives
✓ No credential theft indicators — skill does not access ~/.ssh, ~/.aws, or .env files
✓ No obfuscation detected — no base64-encoded strings or anti-analysis patterns
✓ No reverse shell or C2 infrastructure — no suspicious outbound connections beyond documented API calls
✓ File operations are scoped to a dedicated memory data directory (~/.openclaw/workspace/memory-workflow-data/)
✓ Version pinning available for external dependencies (pymilvus in requirements would show versions)
✓ FTS5 and file storage work without external dependencies, matching documentation