Back to skill

Security audit

VOC洞察专家

Security checks across malware telemetry and agentic risk

Overview

This package is broader than a VOC review analyst and should be reviewed before install because it can use API credentials, call remote LinkFox services, publish files, create paid orders, and manage scheduled tasks.

Install only if you intentionally want the full LinkFox ecommerce automation bundle, not just offline VOC analysis. Before use, verify the LinkFox gateway configuration, keep API keys scoped, avoid uploading private files because upload URLs are public, and require explicit confirmation for scheduling, billing, payment, and skill-creation actions.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (156)

subprocess module call

Medium
Category
Dangerous Code Execution
Content
timed_out = False
    try:
        proc = subprocess.run(
            [sys.executable, str(main_script), params_str],
            capture_output=True,
            text=True,
Confidence
95% confidence
Finding
proc = subprocess.run( [sys.executable, str(main_script), params_str], capture_output=True, text=True, encoding="utf-8", errors="rep

Tainted flow: 'req' from os.environ.get (line 334, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
}
    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 ""
Confidence
88% confidence
Finding
with urlopen(req, timeout=HTTP_TIMEOUT) as response:

Tainted flow: 'url' from os.environ.get (line 235, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
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 = ""
Confidence
95% confidence
Finding
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)

Tainted flow: 'req' from os.environ.get (line 244, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
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
Confidence
94% confidence
Finding
with urlopen(req, timeout=30) as resp:

Tainted flow: 'url' from os.environ.get (line 235, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
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 = ""
Confidence
92% confidence
Finding
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)

Tainted flow: 'req' from os.environ.get (line 244, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
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
Confidence
90% confidence
Finding
with urlopen(req, timeout=30) as resp:

Tainted flow: 'req' from os.environ.get (line 72, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
method="POST",
    )
    try:
        with urlopen(req, timeout=120) as response:
            return json.loads(response.read().decode("utf-8"))
    except HTTPError as e:
        body = e.read().decode("utf-8") if e.fp else ""
Confidence
95% confidence
Finding
with urlopen(req, timeout=120) as response:

Tainted flow: 'url' from os.environ.get (line 235, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
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 = ""
Confidence
92% confidence
Finding
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)

Tainted flow: 'req' from os.environ.get (line 244, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
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
Confidence
90% confidence
Finding
with urlopen(req, timeout=30) as resp:

Tainted flow: 'req' from os.environ.get (line 274, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
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", "")
Confidence
95% confidence
Finding
with urlopen(req, timeout=timeout) as resp:

Tainted flow: 'url' from os.environ.get (line 235, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
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 = ""
Confidence
92% confidence
Finding
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)

Tainted flow: 'req' from os.environ.get (line 244, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
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
Confidence
91% confidence
Finding
with urlopen(req, timeout=30) as resp:

Tainted flow: 'url' from os.environ.get (line 235, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
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 = ""
Confidence
89% confidence
Finding
r = requests.post(url, json=body or {}, headers=headers, timeout=timeout)

Tainted flow: 'req' from os.environ.get (line 244, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
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
Confidence
87% confidence
Finding
with urlopen(req, timeout=30) as resp:

Tainted flow: 'req' from os.environ.get (line 72, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
method="POST",
    )
    try:
        with urlopen(req, timeout=120) as response:
            return json.loads(response.read().decode("utf-8"))
    except HTTPError as e:
        body = e.read().decode("utf-8") if e.fp else ""
Confidence
96% confidence
Finding
with urlopen(req, timeout=120) as response:

Tainted flow: 'req' from os.environ.get (line 121, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
method="POST",
    )
    try:
        with urlopen(req, timeout=120) as response:
            body = response.read().decode("utf-8")
            if not body.strip():
                # delete 等接口可能无返回体
Confidence
91% confidence
Finding
with urlopen(req, timeout=120) as response:

Lp3

Medium
Category
MCP Least Privilege
Confidence
81% confidence
Finding
The skill advertises and appears to invoke capabilities such as network access and file write/report persistence, yet no declared permissions are present. This creates a governance gap: reviewers and runtime policy systems cannot accurately constrain or audit what the skill is allowed to do, increasing the risk of unexpected data access, outbound requests, or local file writes.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The declared purpose is narrow VOC review analysis, but the described behavior spans unrelated and much more powerful actions including authentication/API-key retrieval, ordering/payment flows, file upload, task management, developer tooling, and generic AIGC orchestration. This mismatch is dangerous because users and reviewers may trust the skill for low-risk analysis while it actually has access to broader operational and potentially sensitive actions.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The skill is documented as a text generation/analysis capability, but it contains instructions for agents to automatically pivot into image/video generation workflows based on inferred user intent. This expands the skill's effective scope without explicit user confirmation, increasing the chance of unintended remote actions, extra data propagation to downstream services, and policy bypass through hidden orchestration behavior.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The documentation is internally contradictory: it says image/video generation are not applicable to this skill, while earlier sections direct automatic invocation of those exact downstream generation skills. This kind of mismatch can mislead reviewers and runtime agents, causing hidden capability expansion and making it easier for unsafe or unauthorized actions to occur without transparent disclosure.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
This onboarding document introduces authentication recovery, account registration, and billing/payment workflows that are unrelated to the advertised VOC review-insight analysis purpose of the skill. That scope expansion is dangerous because it conditions the agent to collect credentials/phone data and guide purchases, creating an opportunity for phishing, unauthorized account actions, or abuse of the skill beyond its declared function.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
The file explicitly instructs the agent to collect a user's phone number, send verification codes, log in, obtain API keys, and initiate paid plan orders, none of which are justified by a VOC insight analysis skill. In this context, these capabilities materially increase the risk of social-engineering, account takeover assistance, and unauthorized commercial transactions under the guise of a benign analytics feature.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The code implements asynchronous AI text generation and polling against a remote gateway, which does not match the declared skill purpose of VOC insight analysis. This capability mismatch is dangerous because it can mislead users and orchestrators into sending review or product data to a different external workflow than expected.

Context-Inappropriate Capability

Medium
Confidence
83% confidence
Finding
The file embeds a generic media-downloading utility unrelated to the declared VOC-insight purpose. Unnecessary download capability broadens the attack surface and could later be abused for fetching attacker-controlled content, SSRF-like access to internal HTTP services, or unsafe storage of large files.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
This file implements account onboarding, SMS login, API-key issuance, package purchasing, and payment handling, which is materially unrelated to a VOC review-insight analysis skill. Such capability mismatch is dangerous because it expands the skill into credential collection and monetization workflows users would not expect from the declared purpose, increasing phishing and abuse risk.

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
skills/linkfox-task-scheduler/references/api.md:57