T08 · Insecure Dependencies
- Location
SKILL.md:27- Finding
Unpinned Third-Party Dependencies Create a Supply-Chain Risk
- Content
View full analysis
- Remediation
View remediation
--hash=sha256: qdrant-client== --hash=sha256: ``` ]]>
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent memory tool, but it automatically stores personal conversation details and its privacy claim of no third-party data transfer conflicts with its configured remote AI APIs.
Review this carefully before installing. Use it only if users have explicitly agreed that selected conversation details may be stored long term and processed by the configured LLM and embedding providers. Prefer pinned dependencies and Docker images, remove raw conversation metadata storage, avoid printing API-key prefixes, and add clear review/delete controls before enabling automatic memory capture.
SKILL.md:27Unpinned Third-Party Dependencies Create a Supply-Chain Risk
scripts/auto_memory.py:183Privacy Documentation Contradicts Remote Processing of Automatically Collected Personal Data
scripts/mem0_cli.py:200Health Check Reveals an API-Key Prefix
The skill promotes a fully automatic mode but does not clearly warn that conversation content may be retained as long-term memory and sent to external model APIs for processing. This undermines informed consent and can expose sensitive user content to both persistent storage and third-party services without clear notice.
The automatic activation rules are broad everyday phrases like '我叫...', '我喜欢...', and '记得...', which can trigger long-term storage during normal conversation without meaningful user intent confirmation. In a memory skill, this greatly increases the chance of silently collecting personal data, preferences, corrections, commitments, and emotional state at scale.
The documentation claims there is 'no third-party data transmission', but the configuration and architecture clearly send content to external LLM and embedding APIs such as 智谱AI or OpenAI. This is dangerous because users and operators may rely on a false privacy guarantee while sensitive conversation-derived memory is actually transmitted off-host.
The stored metadata includes a raw_text slice of the original conversation, which can preserve far more private information than the extracted memory itself. This expands exposure in case of unauthorized access, logging, downstream processing, or retention beyond what is necessary for the feature to function.
The script automatically persists conversation-derived personal information to long-term memory without any consent, notice, or confirmation step. In this context, the data includes identity, preferences, habits, work, location, plans, and emotional state, so silent storage creates a meaningful privacy and compliance risk and can retain sensitive disclosures the user did not intend to save.
The skill's user-facing instructions and examples are presented entirely in Chinese, which effectively imposes a specific language on users. There is no indication that users can choose another language or that the language restriction is intentional and justified for a region-specific use case.
The Docker command references the qdrant/qdrant image without a version tag or digest, so future pulls may retrieve a changed or compromised image unexpectedly. In an agent skill intended for persistent memory storage, this creates supply-chain and reproducibility risk because the deployed database version is uncontrolled.
The documented automatic long-term memory capture explicitly targets personal information, preferences, reminders, corrections, and emotional state in plain language. In context, this is more dangerous because the skill is designed for cross-session persistence, making overshared or misdetected sensitive information durable and searchable over time.
The natural-language strings in the skill description and command help are presented only in Chinese, indicating a locale-specific interaction model without any opt-in or alternative language choice. Under the policy, language constraints should either be user-selectable or explicitly documented as justified for a region-specific tool.
The skill is explicitly designed for automatic monitoring of conversations and persistent retention of extracted user information. That creates a privacy-risking data collection behavior by default, especially because ordinary chat may contain personal data the user did not expect to be archived.
The regex triggers target broad personal and potentially sensitive categories, including name, age, profession, location, habits, plans, corrections, work facts, and emotional state. Combined with automatic extraction from free-form chat, this materially increases the chance of over-collection, misclassification, and persistent storage of sensitive user disclosures.
Natural-language strings throughout the file, beginning with the module description, are fixed to Chinese and the CLI provides no language or locale selection. That creates a language policy concern because users are not offered an opt-in or alternative locale.
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.
# 2. 检查 Qdrant 连接
try:
import requests
resp = requests.get("http://localhost:6333/readyz", timeout=5)
if resp.status_code == 200:
checks.append(("Qdrant", True, "OK"))
else:
The health check prints the first 8 characters of the configured API key, unnecessarily disclosing secret material to anyone who can run the command or view its output, logs, or terminal history. Even partial secret exposure weakens confidentiality and can aid credential identification, correlation across systems, or targeted abuse.
The manifest description is written entirely in Chinese, which indicates a language-specific presentation without any accompanying note that the skill is region-specific or offers language choice. Under the policy, language or locale constraints should be opt-in or clearly justified.
The cmd_health docstring and CLI help describe this command only as a health check, but its implementation also loads the local config and prints a masked prefix of the configured API key. This is not merely an implementation detail because it surfaces credential-related data to output while the documentation gives no indication of that behavior.
No suspicious patterns detected.