T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/status.js:58- Finding
Read-Only Status Helper Unnecessarily Requires the Wallet Private Key
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill appears to be a real SOHO Pay blockchain helper, but it needs review because it can use a raw wallet private key to send mainnet transactions and some high-impact actions are under-scoped or under-controlled.
Install only after reviewing the contract addresses and use a dedicated wallet with limited funds/allowances. Prefer testnet first, avoid reusing a mainnet wallet private key, and be aware that payment, registration, repayment, and approval transactions may be irreversible and can spend gas or move USDC/credit.
scripts/status.js:58Read-Only Status Helper Unnecessarily Requires the Wallet Private Key
The skill also supports repayment flows and may send approve() transactions for USDC allowances, which is a meaningful fund-authorization capability beyond simple payment initiation. Even if payment execution uses EIP-712 in one path, the overall skill still exercises broader direct transaction authority than advertised.
The skill also supports repayment flows and may send approve() transactions for USDC allowances, which is a meaningful fund-authorization capability beyond simple payment initiation. Even if payment execution uses EIP-712 in one path, the overall skill still exercises broader direct transaction authority than advertised.
The skill also supports repayment flows and may send approve() transactions for USDC allowances, which is a meaningful fund-authorization capability beyond simple payment initiation. Even if payment execution uses EIP-712 in one path, the overall skill still exercises broader direct transaction authority than advertised.
The skill also supports repayment flows and may send approve() transactions for USDC allowances, which is a meaningful fund-authorization capability beyond simple payment initiation. Even if payment execution uses EIP-712 in one path, the overall skill still exercises broader direct transaction authority than advertised.
The lockfile pins transitive dependency ws to 8.17.1, and the finding cites known advisories for memory disclosure and memory-exhaustion denial of service in that version. Even though this skill is focused on EIP-712 payment signing and ws is brought in through ethers, a vulnerable WebSocket library can still expose the process to remote attacks if any websocket-based provider or connection path is used.
The script directly submits on-chain approve() and repay() transactions using the caller's wallet, which materially differs from the stated skill purpose of initiating payments via EIP-712 signatures. This mismatch is dangerous because a user expecting an off-chain signature flow may instead grant token allowance and execute irreversible state-changing transactions, increasing the risk of unintended fund movement and deceptive wallet use.
The skill explicitly requires a sensitive environment variable (PRIVATE_KEY) and uses it to sign blockchain authorizations and transactions, but the manifest does not declare any tool scope or permission boundary for environment access. That omission weakens reviewability and least-privilege controls, making it easier for an agent runtime to grant broader secret access than operators expect.
The skill’s stated purpose is payment initiation via EIP-712, but it also sends an unrelated state-changing on-chain registration transaction when the signer is not registered or active. This creates a hidden side effect that can spend gas, alter account state, and enroll the user in a protocol flow they did not explicitly authorize, which is dangerous in a wallet/agent context.
The script broadcasts registerAgent immediately after a failed pre-flight check without any confirmation prompt or upfront warning. That means a user invoking a payment script may unknowingly trigger a separate on-chain transaction, incurring gas costs and changing protocol state with no final consent gate.
Automatic agent registration is not necessary to merely construct or submit a payment authorization and broadens the skill’s authority beyond its declared scope. In an agent setting, this can be abused to induce users to sign or broadcast unexpected transactions under the guise of a payment flow.
The script requires a raw PRIVATE_KEY from the environment and constructs a Wallet capable of broadcasting transactions, despite the skill being described as EIP-712-based payment initiation. This is dangerous because it expands the trust boundary from message signing to full transaction authority, exposing users to key-handling risk and enabling direct asset movement if the script behavior is misunderstood or modified.
This script performs only read-only blockchain queries, but it unnecessarily requires a PRIVATE_KEY and instantiates a wallet from it. That expands secret exposure for no operational need: users may load a live signing key into an environment, shell history, CI job, or agent runtime just to check status, increasing the risk of accidental leakage or downstream misuse.
The dependency uses a caret range, which permits automatic installation of newer minor and patch releases instead of a single reviewed version. In a payment-signing skill, this increases supply-chain risk because compromised or breaking upstream releases in a cryptography or transaction library could affect signing, transaction construction, or secret handling.
"pay": "node scripts/pay.js"
},
"dependencies": {
"ethers": "^6.13.0",
"dotenv": "^16.0.0"
},
"engines": {
The dotenv dependency is also version-ranged with a caret, allowing unreviewed updates to be pulled in during installation. While lower risk than a signing library, this still creates avoidable supply-chain exposure in a skill likely handling private keys, RPC URLs, or payment configuration via environment variables.
},
"dependencies": {
"ethers": "^6.13.0",
"dotenv": "^16.0.0"
},
"engines": {
"node": ">=18.0.0"
No suspicious patterns detected.