T06 · System Persistence
- Location
SKILL.md:91- Finding
Mandatory Creation of Persistent Monitoring Tasks Without Explicit User Consent
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is broadly coherent as a LinkFox decision workflow, but it can create persistent monitoring tasks and handle credentials, uploads, and payments without enough scoping or confirmation.
Review this before installing. Use it only if you are comfortable sending prompts, media references, and account-scoped LinkFox API credentials to LinkFox services, and require explicit confirmation before any scheduled monitoring task, public file upload, order creation, or payment action. Use a scoped/rotatable API key, avoid uploading sensitive local files, and do not set LinkFox gateway environment variables to untrusted endpoints.
SKILL.md:91Mandatory Creation of Persistent Monitoring Tasks Without Explicit User Consent
skills/default-superagent-loop/SKILL.md:31Hard-Coded Branded Recommendations Manipulate Final Agent Output
skills/linkfox-aigc-textgen/scripts/aigc_textgen.py:321Authentication Credentials Can Be Transmitted to Arbitrary Environment-Selected Endpoints
skills/linkfox-aigc-textgen/scripts/onboarding.py:478Onboarding Emits the Complete Generated API Key to Standard Output
skills/linkfox-file-upload/scripts/file_upload.py:39File Upload CLI Can Publish Any Locally Readable File Without an Enforced Workspace Boundary
skills/linkfox-file-upload/SKILL.md:32Runtime Installation Guidance Uses Unpinned Third-Party Dependencies
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:
The script builds outbound requests using environment-derived values for the base URL and sensitive headers, then sends the full task payload to that destination. If LINKFOX_TOOL_GATEWAY is overridden or the environment is attacker-influenced, the skill can exfiltrate prompts, generated content, API credentials, and session metadata to an unintended remote endpoint.
}
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 file implements account onboarding, SMS login, API key issuance, package listing, order creation, and payment QR generation, which is fundamentally inconsistent with the declared structured decision-making skill purpose. This capability mismatch is a strong indicator of deceptive packaging and materially increases the risk that users or orchestrators will invoke credential and payment operations they did not intend to authorize.
The POST target URL is derived from environment-controlled base URLs, and the same request may carry sensitive data such as phone numbers, SMS codes, access tokens, refresh tokens, and headers including authorization/uid. In a skill environment, an attacker who can influence env vars can redirect these requests to an attacker-controlled host and exfiltrate credentials or personal data.
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 URL is built from an environment-controlled base and is used with an Authorization header containing the API key. If the environment is tampered with, the CLI will send authenticated requests to an attacker-selected endpoint, exposing the API key and enabling follow-on account or billing abuse.
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
download_media() fetches an attacker-controlled URL over HTTP/HTTPS and writes the response into local session storage. Although it blocks non-HTTP schemes, it still enables SSRF-style access to internal services, unintended outbound requests, and ingestion of untrusted content without host allowlisting or private-address filtering. The declared skill purpose is structured decision synthesis, so arbitrary network retrieval is unjustified and increases risk.
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 function downloads arbitrary attacker-controlled HTTP/HTTPS URLs into local storage without any allowlist, destination validation, or SSRF protections. In an agent environment, this can be abused to make outbound requests to internal services, cloud metadata endpoints, or other sensitive network locations, even though the module is presented as a shared path utility for report generation.
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 HTTP/HTTPS fetches for a caller-supplied URL with no allowlist, host validation, or private-address blocking. In an agent environment, this creates SSRF risk and can be used to reach internal services, metadata endpoints, or attacker-controlled infrastructure, while also persisting downloaded content into the shared session directory.
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 script forwards multiple environment-derived values into an outbound HTTP request, including a gateway base URL and custom headers such as SESSION_ID, MESSAGE_ID, MODE_ID, and APP_NAME. Because LINKFOX_TOOL_GATEWAY can override the destination and the headers are sent unchanged, a compromised or attacker-controlled environment can redirect requests and exfiltrate sensitive runtime metadata and the API key to an arbitrary host.
method="POST",
)
try:
with urlopen(req, timeout=150) as response:
body = response.read().decode("utf-8")
if not body.strip():
# delete 等接口可能无返回体
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
A structured decision skill that also manages scheduled tasks via external APIs, writes responses to local filesystem, and includes recurring-text and recursion controls has materially exceeded its stated function. Hidden automation and outbound API use can create persistent side effects and ongoing activity that users did not knowingly authorize.
Allowing the skill to self-extend via a skill creator is a major capability-escalation risk that is unjustified for a structured decision module. It can bypass normal review boundaries by enabling the module to add new behaviors dynamically, making its effective permissions and data flows unpredictable.
The provided manifest context says this skill should be a '通用结构化决策模块' that ingests multi-dimensional findings and synthesizes a standardized decision block with scores, counter-evidence, and prioritized actions. In contrast, this file declares 'default-superagent-loop' and documents end-of-turn routing behavior such as AskUserQuestion preparation, agent-card recommendation, context generation, and handoff decisions, with no structured-decision-block semantics.
The manifest description is written to operate in Chinese and the file repeatedly constrains user-visible content to specific Chinese phrasing and punctuation conventions, but there is no indication that the user can choose another language or locale. This creates a natural-language policy issue because the skill appears to impose a language format by default rather than offering opt-in or documenting a justified locale restriction.
The trigger phrases are broad enough to match many ordinary requests, which can cause this skill to activate unexpectedly and send user prompts, images, or video URLs to a remote AI service without sufficiently specific user intent. In this skill's context, that risk is elevated because it supports multimodal inputs and automatic downstream chaining guidance, increasing the chance of unintended external processing and privacy exposure.
The file documents a text-generation API and related operational behavior, but the declared skill is a structured decision-making module. This mismatch is dangerous because it can cause an agent or integrator to invoke unrelated remote capabilities, send unintended user data to an external service, and bypass the trust boundaries implied by the skill metadata.