Back to skill

Security audit

Agentfinobs

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent financial observability package, but it can expose sensitive transaction and budget data over unauthenticated network endpoints by default.

Review this before installing in any shared, cloud, container, or LAN-reachable environment. Do not enable the built-in dashboard or Prometheus exporter unless you can bind them to localhost or protect them with network controls and authentication. Treat JSONL files, webhook payloads, dashboard responses, and metrics as sensitive financial records because they can include agent IDs, task IDs, counterparties, descriptions, tags, amounts, revenue, PnL, and timing data.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
agentfinobs/dashboard.py:44
Finding

Unauthenticated Dashboard Exposes Financial Data on All Network Interfaces

Content
View full analysis
dict: txs = self.tracker.recent(50) return {"transactions": [tx.to_dict() for tx in txs]} ``` Those dictionaries include sensitive co ...[truncated 3098 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
agentfinobs/prometheus.py:130
Finding

Prometheus Exporter Publicly Exposes Agent Financial Metrics

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
agentfinobs/tracker.py:189
Finding

Transaction Records Are Persisted in Plaintext with Ambient File Permissions

Content
View full analysis
None: with self._lock: try: with open(self._path, "a") as f: f.write(json.dumps(tx.to_dict()) + "\n") except Exception as e: logger.warning(f"JsonlExporter write failed: {e}") def export_snapshot(self, snapshot: "Snapshot") -> None: snap_path = self._path.with_suffix(".snapshots.jsonl") with self._lock: try: with open(snap_path, "a") as f: f.write(json.dumps(snapshot.to_dict()) + "\n") except Exception as e: logger.warning(f"JsonlExporter snapshot write failed: {e}") ``` ### Technical Analysis Persistence is opt-in, but when enabled, complete transaction dictionaries are written as unencrypted JSON lines. File permissions are inherited from the process umask and surrounding directory configuration. The implem ...[truncated 1721 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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 (18)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The declared description promises a full-featured financial observability capability spanning monitoring, budgeting, anomaly detection, and payment-rail integrations. The supplied code chunk only contains a module docstring for an integrations package and mentions a LangChain/LangGraph callback handler. There is no visible implementation of the described financial features or payment integrations in this chunk. Because the actual code shown serves a different, much narrower purpose and does not substantiate the declared functionality, this is a mismatch.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README advertises a built-in HTTP dashboard and webhook export capability but does not warn that exposing these interfaces can leak transaction history, spending metrics, budget state, or other operationally sensitive financial telemetry. In an agent-finance observability tool, this omission can lead users to deploy the dashboard or exporters on reachable interfaces without authentication, network restrictions, or data minimization.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documented dashboard endpoints include full metrics, alerts, budget status, and recent transactions, all of which may reveal sensitive business and financial information if the dashboard is exposed. Because the skill is specifically for monitoring agent spending across payment rails, the listed endpoints materially increase the sensitivity of the exposed data and make undocumented open access more dangerous.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill declares no explicit tool scope or permissions despite advertising features that imply network access, file output, and possibly shell execution. In agent environments, missing scope declarations can cause overbroad default privileges, making it easier for the skill to write files, send data externally, or invoke commands without transparent user approval.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The dashboard starts an HTTP server bound to 0.0.0.0 and exposes sensitive financial observability data such as recent transactions, budget status, alerts, and anomaly statistics without any authentication or authorization checks. In the context of an AI financial monitoring tool, this can leak operational and potentially payment-related metadata to anyone with network access, and the wildcard CORS header further increases the chance of unintended cross-origin access from browsers.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code file defines a built-in exporter that POSTs transaction batches to any configured endpoint, which is a safety-relevant network transmission of user/system data. While the docstring explains usage, it does not warn that enabling this exporter transmits transaction data off-host or advise users to verify the destination and contents.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

This code automatically records every LLM/chat call as a financial transaction and captures metadata including model name, token counts, and latency. Although the module docstrings describe the behavior, there is no runtime disclosure, confirmation, or visible user-facing warning for this automatic tracking, which affects observability data about user/system activity.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The tracker pushes every recorded transaction to all registered exporters via exp.export_tx(tx), which may transmit transaction details to external systems. Although the class docstring shows a webhook exporter example, this code file does not include a confirmation prompt or explicit user-facing warning about that outbound data sharing behavior.

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 · tests/test_integrations.py (reported line 140)May include surrounding context.

python
class TestCLI(unittest.TestCase):
    def test_version(self):
        import subprocess
        result = subprocess.run(
            ["python", "-m", "agentfinobs", "version"],
            capture_output=True, text=True,
        )

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 · tests/test_integrations.py (reported line 150)May include surrounding context.

python
def test_demo(self):
        import subprocess
        result = subprocess.run(
            ["python", "-m", "agentfinobs", "demo"],
            capture_output=True, text=True,
            timeout=10,

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 · tests/test_integrations.py (reported line 180)May include surrounding context.

python
f.write(json.dumps(tx) + "\n")

            import subprocess
            result = subprocess.run(
                ["python", "-m", "agentfinobs", "status", path, "--budget", "100"],
                capture_output=True, text=True,
            )

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 · tests/test_integrations.py (reported line 191)May include surrounding context.

python
def test_status_missing_file(self):
        import subprocess
        result = subprocess.run(
            ["python", "-m", "agentfinobs", "status", "/nonexistent.jsonl"],
            capture_output=True, text=True,
        )

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

When persist_dir is provided, the tracker creates a directory and appends transaction records to a JSONL file on disk. While the module docstring mentions periodic persistence, the code path performing the write lacks a direct user-facing disclosure near the file creation and append operations.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: setuptools has 10 known advisory(ies) (CVE-2013-1633 (Setuptools vulnerable to Man-in-the-middle attacks); CVE-2025-47273 (setuptools has a path traversal vulnerability in PackageIndex.download that lead); CVE-2024-6345 (setuptools vulnerable to Command Injection via package URL) +7 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: wheel has 4 known advisory(ies) (CVE-2026-24049 (Wheel Affected by Arbitrary File Permission Modification via Path Traversal in w); CVE-2022-40898 (pypa/wheel vulnerable to Regular Expression denial of service (ReDoS)); CVE-2022-40898 (An issue discovered in Python Packaging Authority (PyPA) Wheel 0.37.1 and earlie) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: httpx has 2 known advisory(ies) (CVE-2021-41945 (Improper Input Validation in httpx); CVE-2021-41945 (Encode OSS httpx <=1.0.0.beta0 is affected by improper input validation in `http)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: pytest has 2 known advisory(ies) (CVE-2025-71176 (pytest has vulnerable tmpdir handling); CVE-2025-71176 (pytest has vulnerable tmpdir handling)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

This test invokes JsonlExporter to write transaction data to a filesystem path, but the file contains no comment, docstring, or other disclosure near the operation indicating that transaction data is persisted to disk. Under the code-file criteria, file writes can warrant a finding when there is no visible warning or explanatory disclosure in the code being reviewed.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.