Back to skill

Security audit

Easyaccounts

Security checks for vulnerabilities and agentic risk

Overview

This skill appears purpose-built for EasyAccounts finance management, but it needs review because it can send credentials and private financial data over plaintext HTTP and stores reusable auth material locally.

Install only if you control or trust the EasyAccounts server. Prefer HTTPS, avoid Internet-exposed HTTP endpoints, avoid passing passwords on the command line, protect any .env file, and understand that the skill can create/update records and generate server-side Excel files containing financial 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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/_common.sh:58
Finding

Authentication Tokens and Financial Data May Be Transmitted over Plaintext HTTP

Content
View full analysis
/dev/null) || { rm -f "$tmp"; return 1; } ``` ```bash # scripts/_common.sh:158-174 local token token=$(ea_load_token) if [[ "$method" == "GET" ]]; then curl -sS -w '\n__HTTP_STATUS__:%{http_code}' \ -H "authorization: $token" \ "${EASYACCOUNTS_URL}/api${path}" else local tmp tmp=$(_ea_write_body_tmp "$body") curl -sS -w '\n__HTTP_STATUS__:%{http_code}' \ -H "authorization: $token" \ -H "Content-Type: application/json; charset=utf-8" \ -X "$method" \ --data-binary "@$tmp" \ "${EASYACCOUNTS_URL}/api${path}" rm -f "$tmp" fi ``` The documented configuration explicitly provides a plaintext HTTP example: ```bash # README.md:36-45 # Required EASYACCOUNTS_URL=http://your-easyaccounts-server:8081 # Optional EASYACCOUNTS_USERNAME=admin EASYACCOUNTS_PASSWORD=yourpassword ``` ### Technical Analysis The URL validation accepts both `http://` and `https://` without restricting plaintext HTTP to loopback or another demonstrably secure transport. The same base URL is used for login, bearer-token transmission, financial-data queries, transaction creation, and transaction updates. The login protocol hashes the password with MD5 before sending it, but this does not compensate ...[truncated 1825 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/login.sh:22
Finding

Login Instructions Expose Plaintext Passwords through Command-Line Arguments and Persistent Environment Files

Content
View full analysis
# explicit arguments # login.sh # read from environment variables # # Environment variables: # EASYACCOUNTS_USERNAME # EASYACCOUNTS_PASSWORD ``` ```bash # scripts/login.sh:22-29 USERNAME="${1:-${EASYACCOUNTS_USERNAME:-}}" PASSWORD="${2:-${EASYACCOUNTS_PASSWORD:-}}" if [[ -z "$USERNAME" || -z "$PASSWORD" ]]; then ea_die "Usage: $0 , or set EASYACCOUNTS_USERNAME / EASYACCOUNTS_PASSWORD" fi HASHED=$(ea_md5 "$PASSWORD") ``` The Skill explicitly directs the agent to place the password in a positional argument: ```bash # SKILL.md:65 bash {baseDir}/scripts/login.sh ``` It also recommends persistent plaintext password storage: ```bash # README.md:34-47 EASYACCOUNTS_USERNAME=admin EASYACCOUNTS_PASSWORD=yourpassword # Security recommendation: chmod 600 ~/.openclaw/.env ``` ### Technical Analysis A password passed as a positional command-line argument can be exposed outside the login script. Depending on the host and execution environment, it may appear in: - Process listings while the command is running - Shell history - Agent tool-call records - Debug traces - Audit logs - Process monitoring or telemetry systems - Error reports that capture invoked commands The alternative configuration stores the plaintext password in `~/.openclaw/.env`. The README recommends mode `600`, but the scripts do not enforce or verify this permission before using the credentials. The password may therefore remain exposed if the file was created with broader permissions, copied into backups, or collected by unrelated tooling. The token file handling is comparatively appropria ...[truncated 1770 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • 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 (22)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README presents the skill entirely in Chinese and all example invocations are Chinese phrases, with no indication that other languages are supported or that the Chinese-only scope is intentional and user-selectable. This can violate language/locale policy when a skill implicitly requires one language without opt-in or clear justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README tells users to configure a server URL and optional username/password, but does not clearly warn that the skill will transmit financial records, queries, exports, and possibly credentials to that external EasyAccounts service. In a finance-management context, this omission can cause users to expose sensitive personal spending data to a remote host without making an informed trust decision.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · README.md (reported line 47)May include surrounding context.

EASYACCOUNTS_PASSWORD=yourpassword

text

> 安全建议:`chmod 600 ~/.openclaw/.env`

## 依赖

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill invokes shell commands and network utilities (bash, curl, jq) but does not declare an explicit tool scope such as permissions or allowed-tools. That increases the chance the runtime grants broader execution than necessary, enabling unintended command execution or data access if the skill is triggered in the wrong context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill is designed to handle highly sensitive financial data and may prompt for usernames and passwords, but it does not present an upfront privacy and credential-handling warning. Without that warning, users may provide secrets or personal financial details without understanding that they will be processed and transmitted to an external self-hosted service.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger condition says the skill applies to 'any operation involving the EasyAccounts system,' which is overly broad for a skill that can read financial records, export reports, and process credentials. Broad activation criteria raise the risk of accidental invocation on ambiguous prompts, causing unintended access, modification, or disclosure of sensitive household finance data.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

The skill intentionally transmits authentication material and financial data to an external EasyAccounts instance via shell scripts and curl. In a finance-management context this is expected functionality, but it is still security-relevant because it moves sensitive data off the model boundary to a network service whose trustworthiness depends entirely on the configured EASYACCOUNTS_URL.

Content

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

md
### 规则 1:**必须使用本 skill 提供的脚本,严禁自己拼 curl**

本 skill 在 `scripts/` 下提供了所有需要的脚本,**全部经过端到端测试**。它们处理了:
- Windows + Git Bash 的 UTF-8/GBK 编码坑(直接用 `curl -d` 会乱码)
- token 自动加载和续期
- 必填字段校验、错误码解析、来源标记追加
- 401 自动重试 + env 凭据自动登录

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file gives conflicting instructions about whether EASYACCOUNTS_URL should include /api, with one section telling the agent to append /api and another saying the variable must not contain any path because scripts append /api internally. In practice this can cause requests to be sent to the wrong endpoint, leak credentials or tokens to an unintended path, or push the agent into repeated retries and unsafe recovery behavior around authentication.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The Excel export workflow creates server-side files containing complete financial records but does not prominently warn users before export that a persistent sensitive artifact will be generated on the server. This increases the risk of unintended retention, unauthorized access by other users or administrators, and privacy breaches if export directories are broadly accessible or insufficiently cleaned up.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · scripts/_common.sh (reported line 75)May include surrounding context.

sh
local token="$1"
  mkdir -p "$EA_CONFIG_DIR"
  printf '%s' "$token" > "$EA_TOKEN_FILE"
  chmod 600 "$EA_TOKEN_FILE"
}

# 读取 token

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/_common.sh (reported line 98)May include surrounding context.

sh
# ============================================================

# 把 JSON body 写到临时文件
# 重要:Windows + Git Bash 上,curl -d "$body" 会通过 ANSI code page 传递命令行参数,
# 导致 UTF-8 中文被错误转码为 GBK。改用 --data-binary @file 完全绕过该问题。
_ea_write_body_tmp() {
  local body="$1"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script automatically uses EASYACCOUNTS_USERNAME and EASYACCOUNTS_PASSWORD from the environment to log in and then sends the resulting credential material to whatever EASYACCOUNTS_URL is configured. Because the URL validator allows plain HTTP as well as HTTPS, credentials or password-derived values can be exposed over cleartext transport or redirected to an unintended host without any user-facing warning at the point of use.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

This login request transmits hashed password material to the remote server during authentication. Because EASYACCOUNTS_URL may be plain HTTP, an attacker on the network could intercept the login exchange; additionally, an unsalted MD5-derived password value is weak and may be replayable or crackable depending on server design.

Content

Scanner excerpt · scripts/_common.sh (reported line 130)May include surrounding context.

sh
'{username: $u, password: $p}')
  tmp=$(_ea_write_body_tmp "$body")

  response=$(curl -sS -w '\n__HTTP_STATUS__:%{http_code}' \
    -H "Content-Type: application/json; charset=utf-8" \
    -X POST \
    --data-binary "@$tmp" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/_common.sh (reported line 152)May include surrounding context.

sh
}

# 内部:执行一次 HTTP 调用,返回响应
# 用法:_ea_curl <method> <path> [<body>]
# path 是后端 API 路径(如 /auth/login),脚本会自动加 /api 前缀
_ea_curl() {
  local method="$1"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The common request wrapper automatically attaches the stored token and performs network calls to EASYACCOUNTS_URL, including POST/PUT bodies that may contain user financial data. The file contains developer comments but no user-visible warning, prompt, or disclosure around this outbound transmission behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code file performs an HTTP/API submission via ea_post to add a financial transaction, transmitting user-provided data such as account IDs, amount, date, and note. The script has no confirmation prompt, logging/print statement, or inline warning disclosing that it will send this data to a remote service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The Excel export path causes the backend to generate and persist a report file on the server, and the script reports success without clearly surfacing that a new file is being stored in a server-side directory containing potentially sensitive financial records. In a household finance skill, this increases privacy and data-retention risk because users may believe they are only performing a query while actually creating an additional export artifact that can be accessed later through frontend download flows or operational file copying.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This shell script performs a state-changing HTTP/API request via ea_put to update a flow record, which can affect user data. Although the header comments describe usage, there is no visible confirmation prompt, warning message, or user-facing disclosure immediately before executing the remote update.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script's comments, usage text, and error/success messages are presented in Chinese, and there is no indication that the skill is region-specific or that users can opt into a preferred language. This may violate a language/locale policy when a skill is expected to be locale-neutral or user-selectable.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

Natural-language instructions and example user utterances in the file are entirely Chinese, with no indication that other languages are supported or that Chinese is an intentional, documented locale constraint. This can constitute a language/locale policy issue when a skill effectively assumes a specific language without opt-in or justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

This shell script makes HTTP/API calls via ea_get to retrieve notices and version/configuration data, which may transmit system-related information, but there is no confirmation prompt, visible user-facing log, or warning in the script comments about this behavior. For code files, safety-relevant network operations should include some form of disclosure when not otherwise obvious to the user.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script's natural-language comments and usage guidance are written only in Chinese, and later user-facing strings such as error and success messages are also Chinese-only. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is documented and justified.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.