Back to skill

Security audit

jf-store-traffic

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated store-traffic purpose, but it can delete remote stores and devices without an enforced confirmation step.

Review this skill before installing if the agent will have real JF API credentials. Use it only in accounts where the agent is allowed to create, edit, configure, query, and delete store/device resources, and require explicit human approval before any delete-store or delete-device command.

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
scripts/store_traffic.py:291
Finding

Destructive API operations lack an enforced confirmation gate

Content
View full analysis

Vulnerability Details

File Location: scripts/store_traffic.py:291-302, scripts/store_traffic.py:467-477, scripts/store_traffic.py:888, and scripts/store_traffic.py:925
Vulnerability Type: Destructive remote operations without confirmation
Risk Level: Medium

Vulnerable Code

python
def action_delete_store(args) -> None:
    session = load_session(args.session)
    require_step(session, "store", "No store to delete.")

    store_id = session["steps"]["store"]["data"]["id"]
    api_post("/rtc/store/delete", {"id": store_id})

    session["steps"]["store"]      = {"completed": False, "data": None}
    session["steps"]["device"]     = {"completed": False, "data": None}
    session["steps"]["flowConfig"] = {"completed": False, "data": None}
    save_session(args.session, session)

    print(f"[ok] Store deleted: {store_id}")
python
def action_delete_device(args) -> None:
    session = load_session(args.session)
    require_step(session, "device", "No device to delete.")

    device_id = session["steps"]["device"]["data"]["id"]
    api_post("/rtc/device/delete", {"id": device_id})

    session["steps"]["device"]     = {"completed": False, "data": None}
    session["steps"]["flowConfig"] = {"completed": False, "data": None}
    save_session(args.session, session)

    print(f"[ok] Device deleted: {device_id}")
python
sub.add_parser("delete-store", help="Delete the current store")
python
sub.add_parser("delete-device", help="Delete the current device")

Technical Analysis

The delete-store and delete-device handlers immediately issue authenticated deletion requests after checking only whether the relevant resource exists in the local session. The require_step() checks are state checks, not confirmation or authorization gates.

Neither command requires an interactive confirmation, a resource-bound confirmation value, nor an explicit force flag. The Skill documentation describes the deletion order but do ...[truncated 1753 chars]

Remediation
View remediation

Remediation Suggestions

Require a fresh, explicit confirmation before each destructive request:

  1. Add a resource-bound argument such as --confirm-delete STORE_ID or --confirm-delete DEVICE_ID.
  2. Reject the operation when the supplied value does not exactly match the resource ID loaded from the session.
  3. Default to a dry-run or preview that displays the exact resource type, ID, and name without modifying remote state.
  4. Require the Agent to present this preview and obtain fresh user approval before invoking the confirmed operation.
  5. For interactive use, add a confirmation prompt, while retaining a non-interactive confirmation token for automation.
  6. Consider requiring an additional explicit flag, such as --force, for store deletion because it also clears dependent device and flow-configuration state from the local session.
  7. Record the confirmed target and operation in an audit log without including API secrets.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • 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 (48)

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

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/store_traffic.py (reported line 115)May include surrounding context.

python
for attempt in range(retries + 1):
        try:
            resp = requests.post(url, json=body, headers=headers, timeout=30)
            result = resp.json()
        except requests.RequestException as exc:
            if attempt < retries:

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill documentation claims broad deployment, device onboarding, analytics, and report-generation capabilities, but the finding indicates the implemented behavior does not match and instead introduces signing/crypto-related capability not clearly disclosed. This mismatch is dangerous because users and orchestrators may authorize the skill under false assumptions, enabling sensitive API interaction or credential use that was not transparently declared.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 74)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 77)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 80)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 83)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 86)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 94)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 97)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 110)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 113)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 116)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 117)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 118)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 121)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 132)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 135)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 138)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 139)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 140)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 160)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 163)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 166)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 174)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 175)May include surrounding context.

md
python scripts/store_traffic.py --session ./session init