T09 · Insecure Skill Coding Practices
- Location
scripts/deploy.sh:27- Finding
Arbitrary Shell Command Injection Through Deployment Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a plausible net-disk search skill, but its Docker deployment and network defaults need human review before installation.
Review and harden the deployment before installing: pin the Docker image and skill source to reviewed digests or commits, bind the service to 127.0.0.1 by default, enable strong authentication before any remote exposure, avoid --network host, remove eval from deploy.sh, and do not pass or print passwords in shell commands.
scripts/deploy.sh:27Arbitrary Shell Command Injection Through Deployment Arguments
scripts/deploy.sh:76Mutable and Unverified Remote Code and Container Retrieval
scripts/deploy.sh:8Unauthenticated Search Service Exposed on All Host Interfaces by Default
scripts/deploy.sh:27Authentication Password Exposed Through Process Arguments and Terminal Output
The documentation instructs running the container with --network host, which removes Docker's network isolation and gives the container direct access to the host network namespace. If the container image or application is compromised, this makes lateral movement, local service access, traffic interception, and exposure of host-only services substantially easier.
-p 8888:8888
-e PROXY="socks5://127.0.0.1:1080"
--restart unless-stopped
--network host
ghcr.io/fish2018/pansou:latest
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
curl -L https://github.com/godzx001-dot/NDS/archive/main.zip -o /tmp/nds.zip unzip /tmp/nds.zip -d ~/.hermes/skills/ mv ~/.hermes/skills/NDS-main ~/.hermes/skills/netdisk-search rm /tmp/nds.zip
OpenClaw 用户安装到 `~/.openclaw/skills/netdisk-search`。
Referenced artifact was not completely inspected
bash scripts/deploy.sh
Referenced artifact was not completely inspected
bash scripts/deploy.sh
Referenced artifact was not completely inspected
bash scripts/deploy.sh
Referenced artifact was not completely inspected
bash scripts/deploy.sh
Referenced artifact was not completely inspected
bash scripts/deploy.sh
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
The skill defines broad natural-language triggers such as searching for movies, resources, links, and deployment actions, which overlap with ordinary user requests. In an agent setting, this can cause unintended invocation of the skill and automatic execution of search or deployment-related actions without sufficiently explicit user intent, increasing the chance of misuse or policy bypass.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# 基础搜索
curl -X POST http://localhost:8888/api/search \
-H "Content-Type: application/json" \
-d '{"kw": "速度与激情"}'
The example posts plaintext credentials to an unauthenticated HTTP endpoint (/api/auth/login) on localhost. While local transport reduces exposure, this still encourages insecure credential handling and could leak secrets through shell history, process inspection, local proxies, or if the service is rebound or exposed beyond loopback.
docker exec netdisk-search env | grep AUTH
curl -X POST http://localhost:8888/api/auth/login
-H "Content-Type: application/json"
-d '{"username":"admin","password":"your-password"}'
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.
payload["cloud_types"] = cloud_types
data = json.dumps(payload).encode()
req = urllib.request.Request(
"http://localhost:8888/api/search",
data=data,
headers={"Content-Type": "application/json"}
The trigger phrases include very broad everyday language such as '搜资源', '找资源', '搜电影', and '找电影', which can cause accidental invocation during ordinary conversation. In an agent setting, unintended activation can lead to unsolicited network searches, data transmission, and execution of supporting scripts without clear user intent. The skill context makes this more dangerous because the triggered actions call external APIs and may deploy or query network services.
The description presents search and link-check features without warning that user queries, URLs, and possibly credentials or extraction codes may be sent to a locally hosted or third-party-backed API service. This omission can mislead users about privacy and data handling, especially since the service aggregates results from plugins and external sources. In this skill context, the risk is elevated because the core function is network search and link validation, both of which inherently transmit user-supplied data.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# 下载并解压
curl -L https://github.com/godzx001-dot/NDS/archive/main.zip -o nds.zip
unzip nds.zip -d ~/.hermes/skills/
mv ~/.hermes/skills/NDS-main ~/.hermes/skills/netdisk-search
rm nds.zip
The skill instructs users to deploy a container from ghcr.io/fish2018/pansou:latest, which is an unpinned mutable image tag. A mutable tag can change over time and may pull a different or compromised image than the one originally reviewed, creating a supply-chain risk with code execution on the host via Docker. The skill context increases danger because it explicitly asks the agent/user to run this deployment command as part of normal setup.
The natural-language invocation guidance encourages broad free-form requests like asking the agent to '帮我搜一下' or '帮我部署一下', without requiring a clear command syntax or confirmation step. This ambiguity increases the chance that the agent interprets ordinary user speech as authorization to search third-party services or run deployment scripts. Because the skill can perform both remote queries and local deployment actions, accidental invocation has meaningful security and privacy consequences.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# 基础搜索
curl -X POST http://localhost:8888/api/search \
-H "Content-Type: application/json" \
-d '{"kw": "速度与激情"}'
The documentation exposes a concrete default administrative username and password (admin / admin123) for obtaining a JWT. If these defaults are present in deployed environments, an attacker could authenticate as an administrator and fully compromise the local service; the risk is increased because the docs present the credentials without any warning to change or disable them.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
示例:
curl -X POST http://localhost:8888/api/search \
-H "Content-Type: application/json" \
-d '{
"kw": "速度与激情",
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
示例:
curl -X POST http://localhost:8888/api/check/links \
-H "Content-Type: application/json" \
-d '{
"items": [
No suspicious patterns detected.