T03 · Remote Payload Retrieval and Execution
- Location
extensions/dashboard/docs/dependencies.md:96- Finding
Mutable Remote Installer Is Downloaded and Executed Without Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real kids-points tracker, but it needs Review because it handles family chat and ledger data with under-scoped LLM, database, network, and credential behavior.
Install only if you are comfortable with a chat bot that can modify a family points ledger, send message text to a configured external LLM, and run local subprocesses with inherited environment credentials. Before use, restrict it to approved Feishu chats, use a dedicated LLM key, remove broad environment inheritance, replace LLM-generated SQL with fixed parameterized queries, bind the dashboard to localhost or add authentication, avoid the curl | sh installer, and do not use chmod 666 for serial access.
extensions/dashboard/docs/dependencies.md:96Mutable Remote Installer Is Downloaded and Executed Without Verification
extensions/dashboard/code/server/server.py:43Unauthenticated Dashboard Exposes Family Ledger Data on All Network Interfaces
runtime/pipeline.py:908LLM-Generated SQL Is Executed After an Insufficient Prefix Check
extensions/dashboard/code/server/data_source.py:19Predictable Shared Temporary Cache File Allows Ledger Disclosure and Symlink-Based Overwrite
runtime/llm_config.py:26Entire Hermes Secret Environment Is Loaded and Inherited by Redirectable Child Processes
extensions/dashboard/code/server/requirements.txt:1Unpinned Dependencies and Unverified Vendor Components Make Builds Non-Reproducible
The static finding indicates the code may support LLM-generated SQL for semantic querying and adjustment workflows that are not disclosed in the skill description. Undocumented model-to-SQL behavior is particularly sensitive because it can affect data integrity and query scope, and users evaluating a simple points bot would not expect an AI-mediated database query surface.
The static finding indicates the code may support LLM-generated SQL for semantic querying and adjustment workflows that are not disclosed in the skill description. Undocumented model-to-SQL behavior is particularly sensitive because it can affect data integrity and query scope, and users evaluating a simple points bot would not expect an AI-mediated database query surface.
The static finding indicates the code may support LLM-generated SQL for semantic querying and adjustment workflows that are not disclosed in the skill description. Undocumented model-to-SQL behavior is particularly sensitive because it can affect data integrity and query scope, and users evaluating a simple points bot would not expect an AI-mediated database query surface.
The static finding indicates the code may support LLM-generated SQL for semantic querying and adjustment workflows that are not disclosed in the skill description. Undocumented model-to-SQL behavior is particularly sensitive because it can affect data integrity and query scope, and users evaluating a simple points bot would not expect an AI-mediated database query surface.
The static finding indicates the code may support LLM-generated SQL for semantic querying and adjustment workflows that are not disclosed in the skill description. Undocumented model-to-SQL behavior is particularly sensitive because it can affect data integrity and query scope, and users evaluating a simple points bot would not expect an AI-mediated database query surface.
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
验证:
curl http://localhost:8080/api/health
curl http://localhost:8080/api/dashboard | python3 -m json.tool
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
arduino-cli monitor -p /dev/ttyUSB0 -c baudrate=115200
# 看 server 数据
curl http://YOUR_SERVER_IP:8080/api/dashboard | python3 -m json.tool
# 加积分
python3 \
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
arduino-cli monitor -p /dev/ttyUSB0 -c baudrate=115200
# 看 server 数据
curl http://YOUR_SERVER_IP:8080/api/dashboard | python3 -m json.tool
# 加积分
python3 \
The shell pipeline into sh removes the opportunity for users to review downloaded content and is a classic command-chaining pattern that amplifies supply-chain compromise risk. In this skill context, the file is operational setup documentation, so readers are likely to copy-paste the command directly on a development or service host.
# 装 (一次性)
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
# 加 ESP32 core
arduino-cli core update-index
chmod 666 is an abusive parameter choice because it grants universal access rather than the minimum needed to solve the serial-port issue. In this hardware-development context, the risk is somewhat bounded to local access, but it is still dangerous because it normalizes insecure troubleshooting steps and could expose connected device I/O to other users or malware on the host.
sudo chmod 666 /dev/ttyUSB0Recommending sudo chmod 666 /dev/ttyUSB0 is dangerous because it combines root execution with an overbroad permission change on a live device interface. This can be exploited by any local user or malware on the host to gain persistent unrestricted access to the serial endpoint, enabling unauthorized flashing, command injection over serial consoles, or capture of sensitive device output.
esptool --chip esp32 --port /dev/ttyUSB0 --baud 115200 write_flash ...
sudo chmod 666 /dev/ttyUSB0
### 永久 lesson
The docstring says this function performs a read-only query, but the implementation does not enforce read-only behavior at all. That mismatch is dangerous because other components may trust the helper as safe for LLM-produced SQL, when in reality it can execute INSERT, UPDATE, DELETE, DROP, ATTACH, or PRAGMA statements that modify or expose the database.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
_PROJECT_ROOT = Path(__file__).parent
_CONFIG_PATH = _PROJECT_ROOT / "config.yaml"
_HERMES_AUTH_PATH = Path.home() / ".hermes" / "auth.json"
_HERMES_ENV_PATH = Path.home() / ".hermes" / ".env"
# ─── ~/.hermes/.env 自动加载 ─────────────────────────────────────────────────
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
_HERMES_ENV_PATH = Path.home() / ".hermes" / ".env"
# ─── ~/.hermes/.env 自动加载 ─────────────────────────────────────────────────
# Hermes 把真实 API key 存在 ~/.hermes/.env;auth.json 的 credential_pool
# 条目通过 source: "env:<YOUR_API_KEY_VAR>" 引用它。本项目代码在普通 shell
# 下不会自动 source 这个文件,所以在 import 时主动把里面声明的 KEY 类变量
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
_HERMES_ENV_PATH = Path.home() / ".hermes" / ".env"
# ─── ~/.hermes/.env 自动加载 ─────────────────────────────────────────────────
# Hermes 把真实 API key 存在 ~/.hermes/.env;auth.json 的 credential_pool
# 条目通过 source: "env:<YOUR_API_KEY_VAR>" 引用它。本项目代码在普通 shell
# 下不会自动 source 这个文件,所以在 import 时主动把里面声明的 KEY 类变量
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
_HERMES_ENV_PATH = Path.home() / ".hermes" / ".env"
# ─── ~/.hermes/.env 自动加载 ─────────────────────────────────────────────────
# Hermes 把真实 API key 存在 ~/.hermes/.env;auth.json 的 credential_pool
# 条目通过 source: "env:<YOUR_API_KEY_VAR>" 引用它。本项目代码在普通 shell
# 下不会自动 source 这个文件,所以在 import 时主动把里面声明的 KEY 类变量
The explicit copy of os.environ into the subprocess exposes all available environment variables, including credentials noted in the comment, to a child process triggered by chat messages. In the context of a messaging skill that can be steered via runtime-path configuration, this significantly increases blast radius by making secret harvesting trivial for any compromised or substituted cli.py.
capture_output=True,
text=True,
timeout=30,
env={**os.environ}, # 继承 ~/.hermes/.env (LLM API key) 等
)
except subprocess.TimeoutExpired:
return "⚠️ V2 处理超时 (30s), 请重试"
The inline comment confirms the subprocess is intended to inherit credentials such as LLM API keys from the host environment. For a kids-points chat handler, this is more dangerous than usual because low-trust user input can trigger execution of a secondary program, and any compromise of that program or its selected runtime path exposes those secrets.
capture_output=True,
text=True,
timeout=30,
env={**os.environ}, # 继承 ~/.hermes/.env (LLM API key) 等
)
except subprocess.TimeoutExpired:
return "⚠️ V2 处理超时 (30s), 请重试"
The skill description is written entirely in Chinese and instructs usage through Chinese-language examples, but it does not state that the skill is region-specific or offer any language/locale choice. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation.
The skill advertises capabilities that imply access to environment variables, local files, network, and shell execution, but the manifest does not declare any tool scope or permission boundaries. This weakens reviewability and least-privilege controls, making it easier for a skill with broad runtime access to perform sensitive actions that users and platform policy cannot easily constrain.
The skill says it uses LLM semantic analysis but does not clearly warn that user chat content is sent to an external LLM API. For a family-oriented tool handling children's activity records, this creates a meaningful privacy and consent risk because users may unknowingly transmit sensitive household data to a third party.
The code is explicitly designed to process all group and direct chats ('全量响应') and forwards message contents to downstream runtime logic without any consent, allowlist, or scope checks. In a chat-integrated skill that may handle children’s data and semantic analysis, broad always-on collection increases privacy exposure and the risk of processing sensitive conversations unintentionally.
The manifest describes a children’s points-management skill with SQLite storage, semantic analysis, CLI interface, and Feishu support. While invoking internal logic is expected, using Node.js to launch an OS-level subprocess introduces a broader execution capability than the stated business purpose requires, especially since the handler could have invoked library code directly instead of granting process-execution behavior.
The entire skill documentation is written in Chinese, including setup, warnings, and operational instructions, with no indication that alternative language support is available. Under the policy, forcing a specific language without user opt-in is a natural-language locale violation unless the constraint is explicitly justified as region-specific.
The manifest description focuses on children's points management, SQLite, LLM semantic analysis, CLI, and Feishu chat support. This file documents additional behavior: an ESP32 LED-matrix dashboard with Wi‑Fi connectivity, 30-second polling, WebSocket-triggered refresh, OTA, and auto-reconnect, which materially broadens the described system behavior.