Back to skill

Security audit

Antom Reconciliation Expert

Security checks for vulnerabilities and agentic risk

Overview

The skill is mainly a financial report analyzer, but it depends on changeable remote instructions and update prompts that can affect behavior without package review.

Install only if you are comfortable with this skill contacting marmot-cloud CDN for rules and knowledge, and with those remote documents influencing answers. Use it in a constrained environment for merchant financial files, avoid untrusted oversized XLSX inputs, and treat any update prompt as an administrative action to verify before running.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (2)

T01 · Skill Instruction Hijacking

Warning
Location
scripts/retrieval/cdn_loader.py:35
Finding

Mandatory Runtime Loading of Mutable Remote Agent Instructions

Content
View full analysis
⚠️ **IMPORTANT**: Do NOT manually construct CDN URLs by guessing paths. Always load documents by executing the `cdn_loader.py` functions listed in §3.2. ``` The remote locations and retrieval methods are defined as follows: ```python RULES_BASE_URL = "https://cdn.marmot-cloud.com/page/antom_bill_reconciliation_doc/rules" WIKI_BASE_URL = "https://cdn.marmot-cloud.com/page/antom_bill_reconciliation_doc/wiki" ``` ```python def _fetch_from_cdn(relative_path: str, timeout: int = 5) -> str: """ Fetch rules specification documents from CDN. Args: relative_path: Relative path, e.g., 'workflows/comprehensive-analysis.md' timeout: Request timeout in seconds Returns: Document content, empty string on failure """ url = f"{RULES_BASE_URL.rstrip('/')}/{relative_path.lstrip('/')}" try: resp = requests.get(url, timeout=timeout) resp.raise_for_status() return resp.text except requests.RequestException as e: logger.warning(f"Rules CDN fetch failed {url}: {e}") return "" except Exception as e: logger.error(f"Rules CDN unknown error {url}: {e}") return "" def _fetch_from_wiki(filename: str, timeout: int = 5) -> str: """ Fetch content from CDN Wiki. Args: ...[truncated 4236 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/core/parser.py:55
Finding

Unbounded XLSX Loading Permits Resource-Exhaustion Denial of Service

Content
View full analysis
List[str]: from openpyxl import load_workbook # NOTE: read_only=True can return only the first column for xlsx files # exported by some Antom pipelines (sheet dimension attribute does not # cover the full row range). Use the default (non-read_only) mode and # iterate by ws.max_column to guarantee the entire header row is read. wb = load_workbook(filename=file_path, data_only=True) try: ws = wb.active max_col = ws.max_column or 0 if max_col <= 0: return [] return [ (str(ws.cell(row=1, column=c).value).strip() if ws.cell(row=1, column=c).value is not None else "") for c in range(1, max_col + 1) ] finally: wb.close() ``` The full parser then loads the same untrusted workbook again in non-streaming mode and iterates through all reported rows and cells: ```python def parse_xlsx_file(file_path: str) -> Dict[str, Any]: """Parse single XLSX file, return data + metadata (including empty batch detection).""" from openpyxl import load_workbook rows = [] try: # Fix: cannot use read_only=True, otherwise header reading may be incomplete for some files wb = load_workbook(filename=file_path, read_only=False) ws = wb.active # Get header headers = [] for cell in next(ws.iter_rows(min_row=1, max_row=1)): headers.append(str(cell.value) if cell.value is not None else "") # Read data rows for row_idx, row in enumerate(ws.iter_rows(min_row=2), start=2): row_dict = {} ...[truncated 3386 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill claims to operate on local CSV/XLSX reports, yet its workflow depends on remote CDN retrieval, version checks, and update guidance. This hidden remote behavior expands the trust boundary, can leak usage metadata to external services, and undermines the user's expectation that the skill is offline except for local file parsing.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill claims to operate on local CSV/XLSX reports, yet its workflow depends on remote CDN retrieval, version checks, and update guidance. This hidden remote behavior expands the trust boundary, can leak usage metadata to external services, and undermines the user's expectation that the skill is offline except for local file parsing.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

Embedding update orchestration with git clone/pull/copy instructions adds software management behavior unrelated to reconciliation analysis. This increases attack surface by normalizing code replacement workflows driven by remote metadata, which can facilitate supply-chain compromise or social engineering if the repository or manifest is tampered with.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill advertises that it parses only local settlement-detail files, but this module is designed to fetch rules and wiki content from a remote CDN. That creates an undeclared network dependency and a trust boundary violation: remote content can influence skill behavior, outputs, or prompt context, and may leak usage metadata even if no local file data is uploaded directly.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill documents file access and remote network dependencies but does not declare any explicit tool scope or allowed-tools boundary. That creates an authorization gap: a host may grant broader capabilities than the merchant would expect from a 'local report analysis' skill, increasing the chance of unintended file reads or outbound requests.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest description exposes triggers such as "fee analysis", "fee model", and especially "settlement", which are broad enough to overlap with many ordinary merchant conversations beyond this skill's narrow Settlement Detail scope. Although the file contains strong scope constraints elsewhere, the trigger list itself is not narrowly bounded and provides no explicit negative trigger examples at the invocation point.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill markets itself as parsing only local files and not supporting online operations, but it requires remote document loading from CDN endpoints. Even if the remote access is 'only' for knowledge content, it still creates an external dependency and a channel for unexpected data flow or supply-chain tampering.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill states it cannot perform online report actions, yet it still performs remote version-manifest checks and document retrieval during normal workflow. This contradiction can mislead operators about when the skill communicates externally and weakens informed consent around network use.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
78% confidence
Finding

The tool index describes parse_reports() as supporting DSL filtering/aggregation and warns about field-list checking in constants.py. A generic filtering/query language is broader than the narrowly described role of analyzing Settlement Detail reports for validation and fee analysis.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The module docstring says it parses 'transaction details, settlement details, settlement summary', implying broader report support. However, detect_report_type() explicitly validates that files are Settlement Detail only and rejects other report types, so the documented behavior does not match the implemented behavior.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The manifest describes a local Settlement Detail parser for settlement validation, fee analysis, and reconciliation knowledge Q&A, but this file includes a reusable SQL-like DSL with WHERE, SELECT, GROUP BY, ORDER BY, LIMIT, nested boolean logic, pattern matching, and aggregations over arbitrary columns. That capability is broader than what is directly justified by the manifest's constrained expert role and introduces a generic data-query surface not disclosed there.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Embedding repository and repo-path metadata enables update discovery behavior that is not justified by the stated local-file analysis purpose. On its own this is not code execution, but in combination with remote version messaging it expands the skill's capability surface and can facilitate misleading or unnecessary update workflows.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

These loaders retrieve remote workflow, capability, constraint, tool, guardrail, and wiki documents that are outside direct local CSV/XLSX parsing. In an agent setting, remotely loaded instructions or knowledge can materially alter analysis behavior, creating supply-chain and prompt-injection risk if the CDN content changes or is compromised.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The version check performs a remote manifest request and exposes repository metadata that is unrelated to local reconciliation analysis. While less severe than remote instruction loading, it still creates an undeclared outbound call and can be used for telemetry, dependency confusion, or social-engineering-style update prompting if the manifest source is tampered with.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
61% confidence
Finding

The module docstring advertises support for 'WHERE/SELECT/GROUP BY/ORDER BY/LIMIT' without clarifying execution semantics, while execute() applies SELECT last after grouping and limiting. This is not a code bug by itself, but the documentation presents the DSL in a way that can mislead consumers about what the query language actually does.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The code performs network requests for CDN content without any user-facing disclosure or consent mechanism. In a skill marketed as local-only analysis, silent outbound requests weaken privacy expectations and make the mismatch more dangerous because operators may assume no external communication occurs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The version-check path makes an external network call without warning the user. Even if only metadata is fetched, this creates hidden egress and can surprise users who selected the skill based on its local-only description.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.