T09 · Insecure Skill Coding Practices
- Location
scripts/footprints.py:38- Finding
Bearer Token and Private Collection Data Can Be Transmitted over Plaintext HTTP
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent hosted URL manager, but it creates and persists credentials, sends data to a remote service, can emit reusable magic links, and includes an unpinned remote recovery install path that needs review before use.
Install only if you are comfortable with a hosted service creating an agent account, storing your saved URLs and metadata on ai.ocean94.com, and keeping a local bearer token. Avoid the fallback git-clone install path unless it is pinned and verified, do not use plaintext HTTP endpoints with real tokens, and treat generated magic links as secrets.
scripts/footprints.py:38Bearer Token and Private Collection Data Can Be Transmitted over Plaintext HTTP
SKILL.md:37Unpinned Remote Script Retrieval Allows the Reviewed Payload to Be Replaced
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
headers["Content-Type"] = "application/json"
req = urllib.request.Request(url, data=body, headers=headers, method=method)
try:
with urllib.request.urlopen(req, timeout=15) as resp:
return json.loads(resp.read())
except urllib.error.HTTPError as e:
err_body = e.read().decode()
Referenced artifact was not completely inspected
**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token local
The skill instructs cloning code from a remote repository and then recursively deleting a path with rm -rf /tmp/um. Although the path is specific, combining remote code retrieval, shell execution, and destructive filesystem operations in a skill increases operational risk if the path is altered, interpolated, or copied incorrectly in another environment.
mkdir -p {baseDir}/scripts cp /tmp/um/scripts/footprints.py {baseDir}/scripts/ chmod +x {baseDir}/scripts/footprints.py rm -rf /tmp/um
After that, all commands below work as normal. The script auto-registers on first run.
The skill instructs cloning code from a remote repository and then recursively deleting a path with rm -rf /tmp/um. Although the path is specific, combining remote code retrieval, shell execution, and destructive filesystem operations in a skill increases operational risk if the path is altered, interpolated, or copied incorrectly in another environment.
mkdir -p {baseDir}/scripts cp /tmp/um/scripts/footprints.py {baseDir}/scripts/ chmod +x {baseDir}/scripts/footprints.py rm -rf /tmp/um
After that, all commands below work as normal. The script auto-registers on first run.
The skill declares broad capabilities including shell, file write, network, and environment access but does not constrain them with an explicit permission or allowed-tools policy. In an agent setting, that increases the blast radius of any prompt injection, misuse, or user confusion because the skill can invoke powerful operations beyond its core bookmark-management purpose.
The description uses broad trigger phrases like save, bookmark, collect, and remember this, which could cause the skill to activate during ordinary conversation rather than only on clearly scoped requests. Over-broad invocation increases the chance that user content is sent to the remote backend unintentionally, especially because the skill also auto-registers accounts and stores data externally.
The instruction 'Just run any command and it works' encourages unconstrained execution of a script that performs network registration, token storage, and remote data operations. In an agent environment, this weakens safety expectations and can normalize executing actions without validating parameters, user intent, or tool scope.
## How to Use
**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.
All commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
## How to Use
**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.
All commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
## How to Use
**Zero setup — token auto-management.** The `footprints.py` script handles everything: reads `{baseDir}/.token`, auto-registers on first use, stores token locally with `chmod 600`. Just run any command and it works.
All commands via `python {baseDir}/scripts/footprints.py <subcommand> [--json]`. Add `--json` for machine-parseable output.
The skill instructs the agent to auto-register an account and store user-provided URLs and related metadata on a third-party service with zero setup. This is dangerous because it enables external data exfiltration and account creation without explicit, informed opt-in, and the skill's broad activation language makes accidental collection more likely.
The workflow promotes sending a long-lived, reusable magic link to access stored collections. Such links function as bearer secrets; if forwarded, logged, or exposed in chat history, they may grant unintended access to a user's saved data without additional authentication.
The guidelines explicitly direct the agent to auto-register silently and avoid interrupting the user for account setup while using a remote backend. Silent account creation and remote storage undermine informed consent and increase the chance of unauthorized transmission of user data to an external service.
The skill includes capabilities to autonomously register agent accounts and generate authentication magic links, which exceed the stated URL bookmarking purpose and introduce account-access functionality. In an agent context, this can enable silent account creation or credentialed session handoff without clear user awareness, broadening the blast radius if the skill is misused.
The script states that it will automatically register and store a token with no human intervention, then persists that token locally. Silent credential creation and storage can surprise users and leave durable auth material on disk, especially problematic in shared workspaces or agent-executed environments.
The automatic registration flow creates accounts and persists tokens without an explicit approval step, which is risky for a bookmarking tool. This can cause unintended identity creation and persistent authentication state, making later API actions occur under silently established credentials.
Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.
return ""
def _raw_api(path, method="GET", data=None, no_auth=False):
"""底层 HTTP 调用(不依赖 _get_token,避免循环)"""
token = os.environ.get("FOOTPRINTS_TOKEN", "")
url = f"{ENDPOINT.rstrip('/')}/api/v1/agent{path}"
Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.
return ""
def _raw_api(path, method="GET", data=None, no_auth=False):
"""底层 HTTP 调用(不依赖 _get_token,避免循环)"""
token = os.environ.get("FOOTPRINTS_TOKEN", "")
url = f"{ENDPOINT.rstrip('/')}/api/v1/agent{path}"
Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.
err = {"error": "无法获取 Token — 自动注册失败,请检查网络连接"}
_output(err)
return err
return _raw_api(path, method=method, data=data, no_auth=no_auth)
# ── 用户 ──
The magic-link function prints a one-time login URL directly to output without a strong safety barrier. If logs, transcripts, or downstream tools capture that URL, anyone with access to the output may be able to authenticate as the user during the validity window.
The documentation presents shared category modes as "Cocreate (共建)" and "Subscribe (订阅)," introducing a specific non-user-selected locale in user-facing terminology. The file does not state that the skill is region-specific or offer a language/locale choice, which can conflict with language neutrality expectations.
The natural-language instructions, usage notes, and operational messages are presented exclusively in Chinese, which imposes a language choice on users without offering an alternative or opt-in. This matches the policy category for language or locale constraints that are not explicitly optional or justified.
No suspicious patterns detected.