T09 · Insecure Skill Coding Practices
- Location
scripts/verify-otp.sh:25- Finding
Authentication Token Disclosed Through Verification Script Output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Reva wallet skill performs real crypto-wallet actions and has credential-handling and transfer-confirmation gaps that users should review carefully before installing.
Install only if you trust Reva and are comfortable with an agent holding a local wallet access token. Before using transfers, manually confirm the exact recipient, network, token, and amount, and avoid entering OTPs or initiating transfers in environments where command output or process arguments may be logged.
scripts/verify-otp.sh:25Authentication Token Disclosed Through Verification Script Output
scripts/verify-otp.sh:6One-Time Password and Email Exposed Through Process Arguments
scripts/auth-manager.sh:15Unnecessary Personal Account Data Persisted Alongside Bearer Token
This mismatch is more serious because the skill is presented as wallet management but apparently includes chat/message forwarding and local room-state persistence unrelated to the stated purpose. Hidden messaging behavior can create an unexpected data flow path to external services, increasing risk of sensitive prompt or transaction data being sent off-platform.
This mismatch is more serious because the skill is presented as wallet management but apparently includes chat/message forwarding and local room-state persistence unrelated to the stated purpose. Hidden messaging behavior can create an unexpected data flow path to external services, increasing risk of sensitive prompt or transaction data being sent off-platform.
This mismatch is more serious because the skill is presented as wallet management but apparently includes chat/message forwarding and local room-state persistence unrelated to the stated purpose. Hidden messaging behavior can create an unexpected data flow path to external services, increasing risk of sensitive prompt or transaction data being sent off-platform.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
## Authentication
Reva uses a passwordless authentication flow. Users receive a one-time password (OTP) via email, verify it, and receive an access token for subsequent operations.
### Login/Register Flow
The skill explicitly requires local storage and reuse of an access token for protected operations, creating a durable credential on disk for a cryptocurrency wallet. If the local environment or other skills are compromised, this token could be reused to access balances, profile data, and initiate transactions without re-verifying the user.
2. System sends OTP to the email
3. User provides the OTP code
4. System verifies OTP and returns access token
5. Access token is stored securely for future operations
**The access token MUST be stored securely after verification and reused for all protected operations.**
Mandating persistent storage of the access token increases the blast radius of any host compromise or cross-skill file exposure. In the context of a wallet skill, theft of this token could directly enable unauthorized viewing of sensitive account data and potentially financial operations.
4. System verifies OTP and returns access token
5. Access token is stored securely for future operations
**The access token MUST be stored securely after verification and reused for all protected operations.**
## Available Commands
Automatically storing the access token for future use creates persistent credential material beyond the immediate login flow. Because this skill manages crypto-wallet actions, persistent bearer-token storage materially raises the risk of account takeover if the environment is shared or compromised.
4. Ask user to provide the OTP code they received
5. Call the verification script: `{baseDir}/scripts/verify-otp.sh <email> <otp>`
6. If successful, inform user they are now authenticated
7. The access token is automatically stored for future use
### 2. Claim PayID
The workflow allows immediate execution of cryptocurrency transfers once fields are parsed, without an explicit final user confirmation. For irreversible blockchain transfers, this is highly dangerous because intent-parsing mistakes, prompt confusion, or malicious conversational steering can result in permanent loss of funds.
Storing wallet access tokens in a predictable local file path under the user's home directory creates a credential theft target. Even with restrictive permissions, bearer tokens on disk remain valuable and may be exposed through host compromise, backups, logs, or other local tooling.
**Token Storage:**
- Access tokens are stored locally in `~/.openclaw/payid/auth.json` with restricted file permissions (chmod 600)
- This is a standard OAuth/JWT token pattern - tokens are stored locally for session persistence
- Users can clear their token at any time by deleting the auth file or using the skill's logout functionality
- Tokens expire and require re-authentication when invalid
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
**Data Security:**
- Never log or display access tokens to the user
- OTP codes are only entered once and never stored
- All API requests use HTTPS encryption (enforced in scripts)
- All JSON payloads are constructed using `jq` to prevent injection attacks
The workflow says to forward user messages to 'Reva AI', introducing an external message-passing path that may transmit sensitive financial instructions, identifiers, or account context outside the documented wallet API endpoints. In a wallet skill, undocumented forwarding behavior is dangerous because it can exfiltrate user data and reduce control over how transaction intent is interpreted.
### Send Funds (Simple)
1. User: "send 0.01 usdt on bnb to aldo"
2. Forward message to Reva AI
3. Reva AI processes and sends funds
4. Display transaction confirmation with links
This script performs a live funds transfer immediately once invoked, with no confirmation prompt, review step, or dry-run behavior before an irreversible financial action. In a wallet-management skill context, that increases the chance of accidental or socially engineered transfers because a caller can trigger value movement with only positional arguments.
The skill invokes shell scripts but does not declare any explicit tool scope or allowed-tools restrictions. In an agent environment, this weakens isolation and reviewability, making it easier for the skill to gain broader execution capability than users or the platform expect.
Overly broad login/register triggers can cause the skill to activate during generic authentication-related conversation, increasing the chance of unsolicited OTP flows or collection of email addresses. In a wallet context, accidental activation is riskier because it can lead users into credential and account-linking actions they did not intend.
The balance-check trigger includes very general wording like checking how much money a user has, which may activate in ordinary financial discussion. Because the skill accesses authenticated wallet data, this could disclose sensitive balances when the user did not explicitly mean to query Reva.
The account-info trigger is broad enough to catch generic personal-information questions, potentially causing the skill to retrieve and expose private account attributes like email, wallet address, referral code, or social handles. In a financial skill, unintended disclosure of this data materially increases privacy and targeting risk.
Generic transfer triggers like 'pay someone' or 'send money' can collide with everyday conversation and activate a real fund-transfer workflow. In a wallet-management skill, accidental activation is especially dangerous because it may lead to irreversible financial actions.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
AUTH_FILE="$AUTH_DIR/auth.json"
mkdir -p "$AUTH_DIR"
chmod 700 "$AUTH_DIR"
get_token() {
if [ -f "$AUTH_FILE" ]; then
No suspicious patterns detected.