Back to skill

Security audit

LedgerAI

Security checks for vulnerabilities and agentic risk

Overview

This bookkeeping skill mostly does what it says, but it sends financial data and API credentials to network endpoints with weak safeguards.

Review carefully before installing. Only use it if you are comfortable sending invoices, receipts, expense data, report inputs, your email address, and API keys to the LedgerAI/Voss Consulting Group endpoint. Avoid setting LEDGERAI_API_URL unless you fully trust the destination, and do not run the auto-signup flow in environments where stderr is logged or shared.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/forge-client.sh:3
Finding

Unvalidated API endpoint permits credential and financial-data exfiltration

Content
View full analysis
&2 || { echo "❌ Signup failed" >&2; exit 1; } fi [ -z "$API_KEY" ] && { echo "❌ Set LEDGERAI_API_KEY or LEDGERAI_EMAIL" >&2; exit 1; } ACTION="${1:-help}"; shift || true case "$ACTION" in invoice) curl -sf -X POST "$API_BASE/v1/invoices/process" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;; expenses) curl -sf -X POST "$API_BASE/v1/expenses/categorize" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;; report) curl -sf -X POST "$API_BASE/v1/reports/generate" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;; health) curl -sf "$API_BASE/v1/health" ;; esac ``` ### Technical Analysis The script allows `LEDGERAI_API_URL` to replace the expected LedgerAI origin without validating the URL scheme or hostname. The selected endpoint receives signup emails, bearer credentials, invoice contents, expense records, and financial-report input. An attacker who can influence the process environment can set the variable to an attacker-controlled HTTP or HTTPS server. Because plaintext HTTP is also accepted, a network attacker may additionally intercept sensitive requests when an insecure endpoint is configured. Shell quoting prevents the URL value from directly producing shell command injection, but it does not prevent the script from intentionally transmi ...[truncated 1296 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/forge-client.sh:9
Finding

Newly issued API key is exposed through standard error

Content
View full analysis
&2 || { echo "❌ Signup failed" >&2; exit 1; } ``` ### Technical Analysis After successful email-based signup, the script prints the complete API key to standard error. Standard error is frequently retained by CI systems, terminal recording, agent transcripts, orchestration platforms, monitoring services, and centralized log collectors. The key is a bearer credential, so possession may be sufficient for authentication. Printing it creates additional uncontrolled copies outside the process environment and bypasses protections normally applied to secret stores or masked variables. ### Attack Path 1. A user configures `LEDGERAI_EMAIL` without an existing `LEDGERAI_API_KEY`. 2. The script requests a new key from the configured API. 3. The complete key is written to standard error. 4. An execution environment captures standard error in logs, an agent transcript, or a job record. 5. An attacker or unauthorized operator with access to that output retrieves the key. 6. The attacker reuses the bearer credential against the LedgerAI API within the key's assigned permissions and lifetime. ### Impact Assessment The vulnerability can disclose a newly issued LedgerAI API credential to anyone able to read captured process output. The resulting access is limited to the server-side privileges and data scope of the exposed key, but may include submission or retrieval of sensitive bookkeeping information where supported by the service. It does not directly grant local operating-system privileges. ]]>
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 (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The documented behavior does not fully match what the skill can do: it includes email-based API key creation and references additional endpoints/capabilities not clearly disclosed, while claiming receipt scanning without showing its implementation path. In a finance context, this is dangerous because hidden or unclear behaviors can cause sensitive financial data or user identifiers to be transmitted externally without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill does not warn users that financial documents, receipts, invoice URLs, and related metadata may be sent to an external API. In a bookkeeping context, that omission is particularly risky because financial data is highly sensitive and may include personal, business, tax, or payment information.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The script prints the newly issued API key directly to stderr, exposing a bearer credential to terminals, logs, CI output, shell history captures, and calling applications. Because this key authorizes access to financial-processing endpoints, leakage can enable unauthorized use of the account and access to sensitive bookkeeping operations.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill demonstrates shell-based network actions via curl but does not declare any tool scope or allowed-tools boundaries. That omission increases the chance of unintended command execution or over-broad agent behavior, because users and orchestrators are not clearly informed that the skill may invoke shell/network capabilities.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The activation language is broad enough to match many ordinary finance-related requests, which can cause the skill to trigger in situations where the user did not intend to use an external bookkeeping provider. Because this skill handles potentially sensitive invoices, receipts, and financial records, over-broad triggering raises the risk of unnecessary third-party data exposure.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The skill instructs sending an email address to an external service to create an API key, and later sends invoice data to the same third-party endpoint. External transmission is expected for an API client, but in this context it still represents a real privacy and security risk because personally identifiable and financial information may leave the local environment and go to a service not fully described in the skill.

Content

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

Set LEDGERAI_API_KEY or LEDGERAI_EMAIL for auto-signup (free, no credit card).

bash
curl -X POST https://anton.vosscg.com/v1/keys -H 'Content-Type: application/json' -d '{"email":"you@example.com"}'

Usage

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill metadata describes LedgerAI bookkeeping functionality, but the script silently defaults to a third-party domain (anton.vosscg.com) rather than an obviously official LedgerAI endpoint. This creates a trust-boundary mismatch: sensitive financial data, emails, and API credentials may be sent to an unexpected host, which is especially dangerous given the bookkeeping context involves invoices, expenses, and reports.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script can create a new API key from only an email address, which exceeds the stated bookkeeping purpose and introduces an undeclared account-provisioning capability. In a financial-processing skill, this is risky because it can trigger unauthorized registration flows, send user identifiers to a remote service, and bootstrap credential creation without clear consent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
86% confidence
Finding

This line sends the user's email address to an external service to provision an API key. External transmission is expected for SaaS-backed bookkeeping, but it is still a real security/privacy issue here because the destination is not clearly trustworthy from the script and the signup flow is implicit rather than clearly disclosed.

Content

Scanner excerpt · scripts/forge-client.sh (reported line 7)May include surrounding context.

sh
API_KEY="${LEDGERAI_API_KEY:-}"
EMAIL="${LEDGERAI_EMAIL:-}"
if [ -z "$API_KEY" ] && [ -n "$EMAIL" ]; then
  RESP=$(curl -sf -X POST "$API_BASE/v1/keys" -H "Content-Type: application/json" -d "{\"email\": \"$EMAIL\"}")
  API_KEY=$(echo "$RESP" | grep -o '"api_key":"[^"]*"' | cut -d'"' -f4)
  [ -n "$API_KEY" ] && echo "✅ Free key: $API_KEY" >&2 || { echo "❌ Signup failed" >&2; exit 1; }
fi

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script transmits user email, invoice data, expense data, reports, and bearer credentials to a remote API without any user-facing disclosure at runtime. In the bookkeeping context, this increases sensitivity because the transmitted payloads likely contain financial records, receipts, and other confidential business information.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This line sends user-supplied JSON and a bearer API key to external invoice, expense, and reporting endpoints. While such transmission is functionally necessary for a cloud bookkeeping service, the risk is heightened because the payloads may contain highly sensitive financial data and the script does not provide meaningful disclosure or host validation.

Content

Scanner excerpt · scripts/forge-client.sh (reported line 14)May include surrounding context.

sh
[ -z "$API_KEY" ] && { echo "❌ Set LEDGERAI_API_KEY or LEDGERAI_EMAIL" >&2; exit 1; }
ACTION="${1:-help}"; shift || true
case "$ACTION" in
  invoice) curl -sf -X POST "$API_BASE/v1/invoices/process" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  expenses) curl -sf -X POST "$API_BASE/v1/expenses/categorize" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  report) curl -sf -X POST "$API_BASE/v1/reports/generate" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  health) curl -sf "$API_BASE/v1/health" ;;

Static analysis

No suspicious patterns detected.