Back to skill

Security audit

AI Economic Tracker

Security checks for vulnerabilities and agentic risk

Overview

This is a local economic tracking skill that writes user-directed balance and transaction logs, with no evidence of hidden network access or malicious behavior.

Install only if you are comfortable storing balance, cost, and income history locally in JSONL files. If you set ECONOMIC_TRACKER_DATA_DIR, choose a dedicated data folder so the tracker does not write logs somewhere confusing or overly broad.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
This markdown file includes user-facing output entirely in Chinese, which can indicate a forced language/locale for the skill experience. The file does not state that Chinese output is optional, configurable, or justified as a region-specific tool, so it conflicts with the language/locale policy criteria.

Tainted flow: 'INCOME_LOG' from os.getenv (line 20, credential/environment) → open (file write)

Medium
Category
Data Flow
Content
"balance_after": round(self.balance, 2),
        }
        
        with open(INCOME_LOG, "a") as f:
            f.write(json.dumps(record) + "\n")
        
        self._save_state()
Confidence
65% confidence
Finding
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Tainted flow: 'DAILY_LOG' from os.getenv (line 19, credential/environment) → open (file write)

Medium
Category
Data Flow
Content
"balance_after": round(self.balance, 2),
        }
        
        with open(DAILY_LOG, "a") as f:
            f.write(json.dumps(record) + "\n")
        
        self._save_state()
Confidence
65% confidence
Finding
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Tainted flow: 'BALANCE_FILE' from os.getenv (line 18, credential/environment) → open (file write)

Medium
Category
Data Flow
Content
"reason": reason,
        }
        
        with open(BALANCE_FILE, "a") as f:
            f.write(json.dumps(record) + "\n")
Confidence
65% confidence
Finding
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Static analysis

No suspicious patterns detected.