T08 · Insecure Dependencies
- Location
README.md:21- Finding
Unpinned Third-Party Dependencies Combined with Browser Credential Access
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s core extraction purpose is coherent, but it uses authenticated X session material, third-party scraping, unpinned dependencies, and optional downstream writes without strong permission boundaries.
Review before installing. Use this only if you are comfortable letting it read your xreach/X session file for article scraping, send external t.co targets to Firecrawl when needed, and optionally write extracted material into the content-factory system. Prefer pinned dependency versions, avoid proxy URLs with embedded passwords, and do not use --ingest unless you intend to persist the extracted content.
README.md:21Unpinned Third-Party Dependencies Combined with Browser Credential Access
scripts/extract.py:60Authenticated Proxy Credentials Exposed Through Child-Process Arguments
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
},
method="POST",
)
with urllib.request.urlopen(req, timeout=30) as resp:
data = json.loads(resp.read().decode())
if not data.get("success"):
The declared purpose says the skill extracts X/Twitter content, but the documented behavior goes beyond that by reading local authenticated session material, injecting cookies into a browser context, calling Firecrawl, and optionally writing extracted content into another system. This mismatch is dangerous because users and orchestrators may approve a low-risk read-only extraction skill without realizing it also touches credentials and performs external writes.
The README states that external links shared via t.co are extracted using the Firecrawl API, but it does not clearly warn users that URLs and retrieved page content may be transmitted to a third-party service. In a skill designed to process social-media links, this matters because users may pass sensitive or private investigation targets, and silent off-system transmission can cause confidentiality and compliance issues.
The README instructs users to run npx clawhub install x-article-extract without pinning a specific version of the package or installer. This creates a supply-chain risk: a future malicious or compromised release of clawhub could execute unexpected code on the user's system during installation.
The skill advertises executable behavior involving shell, network access, and environment-variable use, but it does not declare any explicit tool scope or permissions boundary. This increases the chance that an agent or operator invokes it with broader capabilities than intended, including access to local secrets, authenticated sessions, or outbound network paths.
The trigger conditions are broad enough to match ordinary conversation and direct-link sharing, which can cause the skill to run unexpectedly. In this context, accidental activation is more serious because the skill may initiate network requests, use authenticated X sessions, resolve external links, and potentially ingest data into another system.
The skill supports automatic ingest into a content-factory system, but the documentation does not require an explicit confirmation step or present the write risk clearly. This can lead to unintended persistence, propagation of untrusted content, or contamination of downstream knowledge systems from a simple extraction request.
The script's user-facing documentation and console output are written in Chinese only, and the tool does not offer any language selection or opt-in mechanism. Under the stated policy, forcing a specific language without user choice is a natural-language locale violation unless clearly justified as region-specific, which is not documented here.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
"--max-time", "10", tco_url]
if proxy:
cmd.extend(["--proxy", proxy])
result = subprocess.run(cmd, capture_output=True, text=True, timeout=15)
url = result.stdout.strip()
return url if url and url != tco_url else None
except Exception as e:
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
cmd.extend(["--proxy", proxy])
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
if result.returncode != 0:
return {"error": f"xreach 失败: {result.stderr.strip()[:200]}"}
return json.loads(result.stdout)
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
cmd.extend(["--proxy", proxy])
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
if result.returncode != 0:
return {"error": f"xreach 失败: {result.stderr.strip()[:200]}"}
return json.loads(result.stdout)
The code reads stored X session credentials from the user's home directory and uses them to authenticate a browser session without any visible warning or confirmation. In a skill context, silent reuse of local credentials is sensitive because it may access account-scoped content or cause users to unknowingly delegate authenticated actions.
The skill sends resolved external URLs to Firecrawl, a third-party scraping service, with no clear user-facing notice that external content will be transmitted off-platform. This creates privacy and data-handling risk, especially when links may contain sensitive query strings, internal references, or user-specific content.
The code transmits user-derived external URLs and receives scraped page content from a third-party service at api.firecrawl.dev. In this skill's context, that external transmission is more sensitive because users may assume link extraction is local, while the implementation forwards data to an outside processor.
try:
payload = json.dumps({"url": url, "formats": ["markdown"]}).encode()
req = urllib.request.Request(
"https://api.firecrawl.dev/v1/scrape",
data=payload,
headers={
"Authorization": f"Bearer {api_key}",
The skill metadata describes content extraction, but this section also writes results into a separate content-factory system. That scope expansion is dangerous because users may authorize a read-oriented skill without expecting persistent writes into another local or organizational system.
Calling a local content-factory script to create records gives this extractor a capability that is disproportionate to its stated purpose. In skill ecosystems, excessive capability is risky because it broadens the blast radius of mistakes or abuse beyond simple retrieval into local system modification and downstream propagation.
This code persists extracted content, author information, and source URLs into an external content-factory system without a clear warning about storage or retention. Hidden persistence is risky because users may expect transient extraction, while the implementation copies potentially sensitive material into another system for later use.
This subprocess call launches another local script to create records in an external content-factory system, extending the skill from extraction into side-effectful data mutation. While it does not show shell injection, it introduces an unexpected write capability and data exfiltration/persistence path that could be abused if the operator does not realize ingestion occurs.
}
try:
proc = subprocess.run(
["python3", str(bitable_script), "create",
"--table", "MaterialInbox",
"--fields", json.dumps(fields, ensure_ascii=False)],
整个技能描述、触发词与使用说明均仅以中文提供,且未说明是否支持其他语言或允许用户按偏好选择语言。根据语言/地区策略,若技能默认强制单一语言而无用户选择,可能构成自然语言层面的政策问题。
The skill documents external-page fetching via Firecrawl and t.co resolution but does not warn that URLs and possibly fetched content may be sent to third-party services. This creates a privacy and data-governance risk, especially when users provide sensitive or private links under the assumption that the operation is local.
No suspicious patterns detected.