T01 · Skill Instruction Hijacking
- Location
skills/linkfox-aba-intelligent-query/SKILL.md:159- Finding
Silent Transmission of Conversation-Derived Feedback to an External Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The keyword-mining functions are coherent, but the package needs Review because it adds under-disclosed feedback transmission and risky credential/network handling.
Install only if you trust LinkFox with your keyword queries, prompts, session metadata, and any optional feedback reports. Avoid custom LINKFOX_* gateway environment overrides unless they point to a trusted HTTPS LinkFox endpoint, review any feedback before submission, do not upload private files through the file-upload helper, and use an isolated environment with pinned dependencies where possible.
skills/linkfox-aba-intelligent-query/SKILL.md:159Silent Transmission of Conversation-Derived Feedback to an External Service
skills/linkfox-aigc-textgen/scripts/aigc_textgen.py:75Configurable Gateway Can Redirect API Credentials and User Data to an Untrusted Host
skills/linkfox-report-generator/scripts/inject_report.py:157Report Injector Allows Arbitrary HTML and JavaScript Execution
skills/linkfox-aba-intelligent-query/scripts/onboarding.py:166Unpinned Runtime Dependencies Create Supply-Chain Exposure
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
method="POST",
)
try:
with urlopen(req, timeout=120) as resp:
return json.loads(resp.read().decode("utf-8"))
except HTTPError as e:
body = e.read().decode("utf-8") if e.fp else ""
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
method="POST",
)
try:
with urlopen(req, timeout=150) as response:
return json.loads(response.read().decode("utf-8"))
except HTTPError as e:
body = e.read().decode("utf-8") if e.fp else ""
The POST target URL is derived from environment-controlled base URLs, and the same request path can carry sensitive data such as phone numbers, SMS codes, access tokens, refresh tokens, generated API keys, and team identifiers. If an attacker can influence the environment, they can redirect these requests to an attacker-controlled host and exfiltrate credentials or payment-related data; in a skill that already handles login and token issuance, this context makes the issue more dangerous.
except RuntimeError as e:
return {"_error": str(e)}
try:
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)
return r.json()
except Exception as e:
body_text = ""
The gateway request uses a URL assembled from environment-controlled base configuration and sends the LinkFox API key in the Authorization header. An attacker who can set the environment can reroute this traffic to a malicious server and capture the API key, user/account metadata, or manipulate order and package responses; because this script also supports order creation and account operations, the blast radius is substantial.
headers["Content-Type"] = "application/json"
req = Request(url, method=method, data=body_bytes, headers=headers)
try:
with urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
status = e.code
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
req = _lf_Request(url, headers={"User-Agent": "LinkFox-Skill/2.0"})
try:
with _lf_urlopen(req, timeout=timeout) as resp:
if guessed_ext == "bin":
ct = resp.headers.get("Content-Type", "")
if "mp4" in ct:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
}
req = Request(url, data=data, headers=headers, method="POST")
try:
with urlopen(req, timeout=HTTP_TIMEOUT) as response:
return json.loads(response.read().decode("utf-8"))
except HTTPError as e:
body = e.read().decode("utf-8") if e.fp else ""
The POST target URL is derived from environment-controlled base URLs such as LINKFOX_LOGIN_API_URL and LINKFOX_AGENT_USER_API_URL, and the function sends sensitive material including SMS login data, access tokens, refresh tokens, and generated API keys to that destination. If an attacker can influence the runtime environment, this becomes credential exfiltration or SSRF-to-attacker infrastructure with little friction.
except RuntimeError as e:
return {"_error": str(e)}
try:
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)
return r.json()
except Exception as e:
body_text = ""
The urllib gateway request uses a URL assembled from environment-controlled LINKFOX_AGENT_API_URL/LINKFOX_TOOL_GATEWAY and attaches the Authorization API key header. An attacker who can set the environment can redirect these requests to an arbitrary server and harvest API keys or induce outbound requests to internal services.
headers["Content-Type"] = "application/json"
req = Request(url, method=method, data=body_bytes, headers=headers)
try:
with urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
status = e.code
The request sends LINKFOX_AGENT_API_KEY from the environment to a network endpoint whose base URL is also environment-controlled via LINKFOX_TOOL_GATEWAY. If an attacker can influence that endpoint, the code will transmit the API token to an arbitrary server, enabling credential exfiltration and unauthorized API use.
headers={"Content-Type": "application/json", "Authorization": api_token},
)
try:
with urlopen(req, timeout=30) as resp:
body = json.loads(resp.read().decode())
break
except urllib.error.HTTPError as e:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
req = Request(url, headers={"User-Agent": "LinkFox-Skill/2.0"})
try:
with urlopen(req, timeout=timeout) as resp:
# 从 Content-Type 进一步修正扩展名
if guessed_ext == "bin":
ct = resp.headers.get("Content-Type", "")
The download_media function performs outbound HTTP requests to an arbitrary caller-supplied URL with only a scheme check for http/https. This is a classic SSRF primitive: an attacker who controls the URL can make the agent contact internal services, cloud metadata endpoints, or other sensitive network locations, and then persist the response locally.
req = Request(url, headers={"User-Agent": "LinkFox-Skill/2.0"})
try:
with urlopen(req, timeout=timeout) as resp:
# 从 Content-Type 进一步修正扩展名
if guessed_ext == "bin":
ct = resp.headers.get("Content-Type", "")
download_media() performs outbound requests to any caller-supplied http(s) URL and then writes the response to local storage. That creates an SSRF primitive that can be used to reach internal services or attacker-controlled endpoints, and the skill context does not justify arbitrary remote fetching for a keyword lookup/export tool.
req = Request(url, headers={"User-Agent": "LinkFox-Skill/2.0"})
try:
with urlopen(req, timeout=timeout) as resp:
# 从 Content-Type 进一步修正扩展名
if guessed_ext == "bin":
ct = resp.headers.get("Content-Type", "")
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
headers={"Content-Type": "application/json", "Authorization": api_token},
)
try:
with urlopen(req, timeout=30) as resp:
body = json.loads(resp.read().decode())
break
except urllib.error.HTTPError as e:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
headers={"Content-Type": "application/json", "Authorization": api_token},
)
try:
with urlopen(req, timeout=30) as resp:
body = json.loads(resp.read().decode())
break
except urllib.error.HTTPError as e:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
headers={"Content-Type": "application/json", "Authorization": api_token},
)
try:
with urlopen(req, timeout=30) as resp:
body = json.loads(resp.read().decode())
break
except urllib.error.HTTPError as e:
download_media() performs arbitrary outbound fetches to any attacker-controlled http:// or https:// URL with no allowlist, host validation, or private-network protections. In an agent/runtime context this creates a classic SSRF primitive that can be used to reach internal services, cloud metadata endpoints, or other network-restricted resources, and the downloaded content is then written into the session workspace.
req = Request(url, headers={"User-Agent": "LinkFox-Skill/2.0"})
try:
with urlopen(req, timeout=timeout) as resp:
# 从 Content-Type 进一步修正扩展名
if guessed_ext == "bin":
ct = resp.headers.get("Content-Type", "")
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.
This finding indicates a combination of local directory and metadata management, authorization-token use from environment variables, external STS retrieval, arbitrary file upload, arbitrary remote download, and global indexing. In the context of a mislabeled keyword tool, this is highly dangerous because it can support data exfiltration, covert storage, or abuse of ambient credentials.