Back to skill

Security audit

Vaudtax

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its Vaud tax purpose, but it needs review because it handles very sensitive tax attachments by default and has unsafe attachment extraction that could write files outside the intended folder.

Install only if you are comfortable letting the agent read sensitive Vaud tax files and selected supporting PDFs. Use the quick overview mode for privacy, avoid extracting attachments from untrusted .vaudtax files, delete extracted temp files after use, and treat tax estimates as sending derived financial data to the official vd.ch calculator.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/parse_vaudtax.py:130
Finding

Archive-Controlled Path Traversal During Attachment Extraction

Content
View full analysis
_ so the name stays unique and readable. Works for PDFs, JPEG images, and PNG images. """ root, _ = open_vaudtax(vaudtax_path) index = {} for doc in root.findall(f".//{ns('documents')}"): key = text(doc, "key") if key: index[key] = text(doc, "filename") or key if keys == ["all"]: keys = list(index) outdir = Path(outdir) if outdir else Path(tempfile.mkdtemp(prefix="vaudtax_")) outdir.mkdir(parents=True, exist_ok=True) paths = [] with zipfile.ZipFile(vaudtax_path) as z: for key in keys: target = outdir / f"{key}_{index.get(key, key)}" with z.open(key) as src: target.write_bytes(src.read()) paths.append(target.resolve()) return paths ``` ### Technical Analysis The ZIP entry key and original filename are obtained from attacker-controlled XML metadata and incorporated directly into an output path. Neither value is restricted to a basename, validated against an allowlist, nor checked for path separators, absolute paths, or `..` components. `Path` path joining does not automatically confine a resulting path to `outdir`. A malicious attachment key containing traversal components can therefore produce a target path outside the intended temporary or user-selected extraction directory. The subsequent call to `target.resolve()` occurs only after the file has already been written and is not used to enforce containment. It ther ...[truncated 1275 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/parse_vaudtax.py:121
Finding

Unbounded ZIP, XML, and Attachment Processing Allows Resource Exhaustion

Content
View full analysis
Remediation
View remediation
MAX_ATTACHMENT_SIZE: raise ValueError("Attachment exceeds allowed size") dst.write(chunk) ``` 5. Limit XML input size before parsing and consider a hardened XML parser with depth and entity protections. 6. Stop extraction when aggregate expanded data exceeds the configured declaration limit. 7. Remove partially written files when validation fails. 8. Add regression tests using oversized entries, high compression ratios, excessive entry counts, deeply nested XML, and aggregate-size limit violations. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:71
Finding

Basic Summary Workflow Collects Unnecessary Sensitive Identifiers from Salary Certificates

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill description emphasizes local .vaudtax parsing and summarization, but the documented behavior also includes remote tax-calculator queries and tax simulation logic. This mismatch can mislead operators and users about data flow and exposure, causing sensitive financial data or derived tax values to be sent off-host when they expected purely local processing.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code constructs a POST request and sends sensitive tax data such as taxable income, wealth, family status, and children counts to an external government website. Even if the destination is legitimate, transmitting highly sensitive financial data to a remote service is dangerous when that capability is not justified by the manifest, because it can violate user expectations, privacy policies, or data-handling constraints.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill invokes shell scripts, writes extracted attachments to disk, and can make HTTP requests, but it declares no explicit tool scope or permission boundaries. In an agent environment, this increases the chance of over-broad tool access or accidental execution paths beyond the minimum needed, especially when handling sensitive tax files and attachments.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document is written as authoritative operational guidance using French tax terms and Vaud/Swiss-specific rules throughout, without stating that the skill is region-specific or offering any language/locale choice. This can violate the language/locale policy when applied outside its intended audience because users are not given an opt-in or alternative locale handling.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill instructs users to run a script that sends tax inputs directly to an external government server via HTTP POST, but it does not clearly warn that potentially sensitive financial and household data will leave the local environment. In the context of tax-declaration handling, this creates a meaningful privacy and data-governance risk because users may unknowingly transmit personal taxable income, wealth, civil status, and child-related information to a third party.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill manifest describes working with local .vaudtax files, but this script reaches out to a live Canton Vaud website to perform calculations. That expands the trust boundary and creates undeclared network behavior, which is risky because users invoking a file-processing skill would not reasonably expect their tax workflow to depend on or contact an external service.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code prints all primary user-facing labels and instructions in French, such as the results headings and the final command guidance. The file does not provide any user opt-in for language selection or state that the tool is intentionally restricted to French-speaking users, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The attachment extraction function writes tax-declaration attachments containing highly sensitive personal and financial documents to persistent storage, including a temporary directory when no output directory is specified. The script does not clearly warn the caller that files will remain on disk until manually deleted, which increases the risk of unintended disclosure through other local users, backups, endpoint indexing, or later forensic recovery.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/test_compute_code800.py (reported line 20)May include surrounding context.

python
@unittest.skipUnless(FIXTURE.exists(), f"fixture not present: {FIXTURE}")
class TestComputeContext(unittest.TestCase):
    def _json(self):
        out = subprocess.run(
            [sys.executable, str(SCRIPT), str(FIXTURE), "--json"],
            capture_output=True, text=True, check=True,
        )

Static analysis

No suspicious patterns detected.