Back to skill

Security audit

VIN (Vehicle Identification Number) Query - VIN车辆识别代码查询

Security checks for vulnerabilities and agentic risk

Overview

This is a straightforward VIN lookup skill that calls JisuAPI, with no hidden persistence or unrelated local access, but users should understand that query data and the API key go to that provider.

Install only if you are comfortable sending VINs or car model IDs to JisuAPI and storing a JISU_API_KEY in the environment. Consider restricting and rotating that key, and avoid using the skill for confidential vehicle records unless your privacy requirements allow this provider call pattern.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
vin.py:24
Finding

API Credential Exposed in URL Query Parameters

Content
View full analysis

Vulnerability Details

File Location: vin.py:24-37, vin.py:72-79, and vin.py:114-121
Vulnerability Type: API credential exposure through URL query strings
Risk Level: Medium

Vulnerable Code

python
def query_vin(appkey: str, req: dict):
    params = {"appkey": appkey}

    vin = req.get("vin")
    if vin:
        params["vin"] = vin
    strict = req.get("strict")
    if strict is not None:
        params["strict"] = strict

    try:
        resp = requests.get(VIN_QUERY_URL, params=params, timeout=10)

The oil endpoint uses the same pattern:

python
params = {
    "appkey": appkey,
    "carid": carid,
}

try:
    resp = requests.get(VIN_OIL_URL, params=params, timeout=10)

The gearbox endpoint also uses this pattern:

python
params = {
    "appkey": appkey,
    "carid": carid,
}

try:
    resp = requests.get(VIN_GEARBOX_URL, params=params, timeout=10)

Technical Analysis

Passing appkey through the params argument of requests.get() serializes the credential into the request URL, for example:

text
https://api.jisuapi.com/vin/query?appkey=SECRET&vin=...

HTTPS encrypts the URL while it is in transit between the client and server, but it does not prevent the complete URL from being recorded at either endpoint or by trusted intermediary infrastructure. Application telemetry, HTTP debugging, reverse proxies, API gateways, server access logs, and exception-reporting systems may retain query strings.

Consequently, the API key is exposed to a broader set of systems and operators than necessary. The same weakness affects all three API operations.

Attack Path

  1. An operator configures a valid secret in the JISU_API_KEY environment variable.
  2. The Skill reads that value and adds it to the GET request parameter dictionary.
  3. requests embeds the key in the outgoing URL query string.
  4. A proxy, gateway, server, debugging facility, or telemetry platform records the complete URL.
  5. An attacker o ...[truncated 908 chars]
Remediation
View remediation

Remediation Suggestions

  1. Prefer an API-supported authorization header rather than a URL parameter. For example, if supported by the provider:

    python
    headers = {"Authorization": f"Bearer {appkey}"}
    params = {"vin": vin, "strict": strict}
    resp = requests.get(VIN_QUERY_URL, headers=headers, params=params, timeout=10)
    
  2. If the provider supports POST-based authentication, place the credential in the request body instead of the URL and continue using HTTPS.

  3. If JisuAPI requires appkey in the query string:

    • Disable query-string logging for these endpoints.
    • Configure proxies, gateways, observability tools, and error-reporting services to redact appkey.
    • Never log prepared request URLs or parameter dictionaries containing the key.
    • Restrict the key to only the APIs and source addresses required by this Skill, where provider controls permit it.
    • Apply quota and billing alerts to detect unauthorized use.
    • Rotate the credential periodically and immediately after suspected exposure.
  4. Centralize API request construction and secret redaction so all three operations receive the same protections.

  5. Document the provider-imposed residual risk if query-string authentication cannot be replaced.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares executable and sensitive capabilities via metadata (python3, environment variable access) and clearly depends on an external API, but it does not define an explicit tool/permission scope. That can lead to overbroad execution in agent frameworks, making it harder to enforce least privilege and increasing the chance the skill can access network or secrets beyond what users expect.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill is designed to send VIN values to JisuAPI, but the description shown to users does not warn that VINs are transmitted to a third-party service. VINs can be sensitive vehicle-linked identifiers, so the lack of disclosure undermines informed consent and can cause unintended data exposure to an external provider.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · vin.py (reported line 14)May include surrounding context.

python
import requests


VIN_QUERY_URL = "https://api.jisuapi.com/vin/query"
VIN_OIL_URL = "https://api.jisuapi.com/vin/oil"
VIN_GEARBOX_URL = "https://api.jisuapi.com/vin/gearbox"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · vin.py (reported line 15)May include surrounding context.

python
import requests


VIN_QUERY_URL = "https://api.jisuapi.com/vin/query"
VIN_OIL_URL = "https://api.jisuapi.com/vin/oil"
VIN_GEARBOX_URL = "https://api.jisuapi.com/vin/gearbox"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · vin.py (reported line 16)May include surrounding context.

python
import requests


VIN_QUERY_URL = "https://api.jisuapi.com/vin/query"
VIN_OIL_URL = "https://api.jisuapi.com/vin/oil"
VIN_GEARBOX_URL = "https://api.jisuapi.com/vin/gearbox"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code sends a user-supplied VIN together with the service API key to a third-party endpoint without any user-facing disclosure or consent step. VINs can be sensitive identifiers in some contexts, and transmitting them externally may violate user expectations, privacy requirements, or organizational data-handling rules even though the transmission is necessary for the feature.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The oil lookup sends the queried carid and API key to an external API without surfacing that network transmission to the user. The privacy risk is lower than for raw VIN data because carid is an internal model identifier, but undisclosed third-party transmission still creates governance, transparency, and dependency risks.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The gearbox lookup also transmits a queried carid and the configured API key to a third-party service without notice in the command flow. While the transmitted identifier is not highly sensitive by itself, silent external transmission may still conflict with user expectations and security review requirements.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.