T08 · Insecure Dependencies
- Location
references/tool-details.md:647- Finding
Unpinned and Unverified Third-Party Dependencies
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly coherent for reading and archiving public links, but its credential-storage guidance, optional installs, and bundled save scripts have enough security risk to require review before use.
Install only if you are comfortable reviewing each credential and archive action. Prefer platform secret storage or environment variables over chat, memory, shell profiles, Custom Instructions, or plaintext config files; avoid the optional zip helper unless you can verify it; and treat the included save scripts as examples that should be hardened before use with important files or knowledge bases.
references/tool-details.md:647Unpinned and Unverified Third-Party Dependencies
references/save-scripts.md:261Predictable Temporary File Allows Symlink-Based File Overwrite
references/save-scripts.md:488Obsidian Vault Containment Check Can Be Bypassed by Path-Prefix Confusion
references/tool-details.md:620API Credentials May Be Stored in Insecure Plaintext Locations
The skill recommends storing sensitive API keys in .env, shell startup files, and skill config locations. Those locations are commonly readable by other local processes, accidentally committed, surfaced in debugging, or harvested by later prompts/tools, making credential compromise much more likely.
export IMA_API_KEY="your_api_key"
Persistence varies by platform:
- **Hermes Agent**: consider persisting to a .env file in the Hermes config directory (path may vary by version — check your Hermes installation for the correct location)
- **Claude Code**: write to `~/.zshrc` or `~/.bashrc`
- **OpenClaw**: write to skill config via `~/.agent-social-reader/config.json` only if the user approved local plaintext config storage
- **ChatGPT/Codex**: add to Custom Instructions or environment config
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
pip install faster-whisper
# macOS: brew install ffmpeg | Ubuntu: sudo apt install ffmpeg
Once installed, tell your agent:
The README explicitly tells users to paste a raw OpenAI API key into the chat and suggests the agent may remember it for future use. Putting secrets into conversational context exposes them to prompt logs, memory stores, transcripts, plugins, and downstream models or tools, which violates secret-handling best practices and can lead to credential leakage or unauthorized API use.
The trigger phrases are broad enough to match ordinary requests like 'read this link' or 'summarize this URL', which can cause the skill to activate outside the user's intended context. Over-broad activation increases the chance of unintended network access, content fetching, and follow-on actions such as prompting for credentials or saving content.
The skill explicitly permits persistent local storage in ~/.agent-social-reader/config.json for API keys and paths once the user agrees, creating a durable secrets footprint on disk. Plaintext persistence of credentials materially increases exposure to later compromise by other local processes, accidental backup/sync leakage, or unintended reuse beyond the original task.
## ⚠️ Workspace Rules
**CRITICAL: Never create or modify files directly inside the agent's default workspace unless the user explicitly asks for a workspace artifact.**
- Use `/tmp/` for all temporary outputs and transient cache.
- Prefer platform secret storage, existing authenticated connectors, or environment variables for secrets.
- Use `~/.agent-social-reader/config.json` only after the user explicitly agrees to local plaintext configuration.
The instruction at this line forces a Chinese prompt to the user for runtime-scene detection, but the skill does not state that it is limited to Chinese-speaking users or offer an alternate language. This creates a locale/language policy issue because the skill may respond in a specific language without user opt-in.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
)
if target_type == "database":
url = "https://api.notion.com/v1/pages"
payload = {
"parent": {"database_id": target_id},
"properties": {
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
)
if target_type == "database":
url = "https://api.notion.com/v1/pages"
payload = {
"parent": {"database_id": target_id},
"properties": {
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if not match:
return {"error": f"Cannot parse tweet URL: {url}"}
username, tweet_id = match.group(1), match.group(2)
api_url = f"https://api.fxtwitter.com/{username}/status/{tweet_id}"
req = urllib.request.Request(api_url, headers={"User-Agent": "Mozilla/5.0"})
try:
with urllib.request.urlopen(req, timeout=30) as resp:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
**Purpose**: Mandatory handling channel for all platforms not covered by free tools above.
**Primary endpoint**: `POST https://agentlensapi.io/api/v1/fetch`
**Avoid by default**: `https://api.agentlensapi.io/v1/fetch` because some local proxy/fake-IP environments can fail TLS for the API subdomain while the main host works.
**Auth**: `Authorization: Bearer {AGENT_LENS_API_KEY}`
**Boundary**: Send only the URL for the current read request. Do not include unrelated user files, saved archives, or credentials in the request body.
The video summarization section expands the skill from URL reading into local package installation and shell execution (curl, yt-dlp, ffmpeg, pip install). That increases the attack surface substantially: untrusted media URLs can trigger downloads and processing of complex file formats and external binaries, which is beyond the minimal scope implied by a reader/summarizer skill.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
f"Content-Type: audio/wav\r\n\r\n"
).encode('utf-8') + audio_data + f"\r\n--{boundary}--\r\n".encode('utf-8')
req = urllib.request.Request(
"https://api.openai.com/v1/audio/transcriptions",
data=body,
headers={
"Authorization": f"Bearer {api_key}",
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Directly import URLs into ima knowledge base; ima parses the content itself. Use when user only wants to archive links.
curl -X POST "https://ima.qq.com/openapi/wiki/v1/import_urls" \
-H "ima-openapi-clientid: {IMA_CLIENT_ID}" \
-H "ima-openapi-apikey: {IMA_API_KEY}" \
-H "Content-Type: application/json" \
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
## §10. ima Setup — Scene 2 (WorkBuddy) & Scene 3 (External Agent)
These sections document the one-time setup for the two OpenAPI-based ima write paths.
### 10.1 Scene 2 — WorkBuddy Setup (One-time)
The document instructs the user to say specific Chinese phrases to configure and verify the ima integration. This is a natural-language locale constraint presented as required behavior, and no alternative wording or user choice is offered for other languages.
These setup instructions tell the agent to persist API credentials into shell profiles, .env files, plaintext config files, or even custom-instruction stores. Credential persistence outside dedicated secret storage creates durable exposure: secrets may be read by other tools, leaked via backups/logs, or later exfiltrated by unrelated prompts or skills.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
IMA_CLIENT_ID="${IMA_CLIENT_ID:-$(cat ~/.config/ima/client_id 2>/dev/null)}"
IMA_API_KEY="${IMA_API_KEY:-$(cat ~/.config/ima/api_key 2>/dev/null)}"
curl -s -X POST "https://ima.qq.com/openapi/wiki/v1/get_addable_knowledge_base_list" \
-H "ima-openapi-clientid: $IMA_CLIENT_ID" \
-H "ima-openapi-apikey: $IMA_API_KEY" \
-H "Content-Type: application/json" \
The installation example tells the user to paste a Chinese sentence to their AI agent, but the skill does not offer an English alternative or indicate that the instruction is region-specific. This is a natural-language policy concern because it imposes a language choice without user selection.
Detected: suspicious.exposed_secret_literal