T03 · Remote Payload Retrieval and Execution
- Location
README.md:26- Finding
Unverified Remote Installation Script Executed Directly by Bash
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill performs its stated research workflow, but it asks users to run an unverified remote installer and can send arbitrary local file excerpts to Tavily without adequate scoping or warning.
Review before installing. Use a safer Tavily CLI installation method if available, and do not run this skill on untrusted request files. Avoid `source_file` values pointing to secrets, private notes, internal documents, env files, or paths outside the intended inbox, because excerpts may be sent to Tavily and retained in raw JSON output.
README.md:26Unverified Remote Installation Script Executed Directly by Bash
runtime.py:84Unrestricted Source File Read Can Disclose Local Data to Tavily
The README instructs users to execute a remote script directly with curl ... | bash, which grants immediate shell execution to code fetched over the network without prior inspection or integrity verification. If the remote host, transport path, or published install script is compromised, this can lead to arbitrary code execution on the user's machine during setup.
按 repo 内置 skill 的说明先安装并登录 tvly:
curl -fsSL https://cli.tavily.com/install.sh | bash && tvly login
安装完成后,确保下面命令能正常返回:
The file presents the skill description and usage instructions entirely in Chinese, which can amount to a language-policy issue when no user opt-in or justified locale limitation is provided. The policy specifically calls for flagging cases where a skill forces a specific language without user choice.
The skill invokes shell commands, reads inputs, and writes output files, but the manifest declares no explicit tool scope or permissions boundary. That makes the skill over-privileged by default and increases the chance an agent runtime will allow broader file-system or shell access than users expect, especially when processing attacker-controlled markdown input.
The example question and supplemental instruction explicitly steer output toward Chinese-language公众号 topic selection without documenting that this is optional or user-selected. This creates a natural-language locale preference baked into the skill description rather than offering a language choice.
The skill instructs the agent to combine user-provided topic text, questions, source references, and seed URLs into a query sent to the external Tavily CLI, but it does not warn that this data leaves the local environment. Users may unknowingly transmit sensitive research topics, internal URLs, or proprietary context to a third-party service, creating confidentiality and compliance risks.
If source_file is provided, up to 1200 characters of that local file are read and embedded into the research query sent to the external Tavily CLI. That creates a real data-exfiltration/privacy risk because potentially sensitive local content is transmitted off-host without any consent, classification check, or warning in this code.
The query explicitly instructs output for a Chinese content team, and the rest of the file generates Chinese-language report content and audience assumptions. This imposes a specific language/locale behavior without any visible user opt-in or configurable language choice.
The skill sends topic, question, notes, seed URLs, and possibly source excerpts to an external research service via the tvly CLI. In this skill context, that is a meaningful confidentiality issue because users may assume local processing while the code silently transmits potentially sensitive prompts and context to a third-party service.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
query = build_query(request)
command = ["tvly", "research", query, "--json", "--model", request["model"]]
completed = subprocess.run(
command,
cwd=vendor_root,
capture_output=True,
The reader_hint is hard-coded as a Chinese long-form public-account readership, which bakes a specific language/locale assumption into downstream content decisions. No alternative locale or user-controlled setting is provided in this file.
The code persists the full request metadata, stderr, vendor path, command arguments, and returned payload to local JSON files under content-production/inbox/raw/research. This can create secondary exposure of sensitive research topics, local file paths, source excerpts embedded in payloads, and service error details, especially in shared workspaces or repositories.
The markdown explicitly states that the skill outputs a research report and saves raw JSON locally, which affects user data storage and workspace contents. Under the markdown-file criteria for missing warnings, there is no user-facing caution here about overwriting, storing potentially sensitive research content, or retaining source data.