Back to skill

Security audit

AI-native Bitcoin payments. Buy, sell, send, and request Bitcoin directly through any existing messenger app (Telegram, WhatsApp, Signal, Email) or create your own email accounts to start messaging via email.

Security checks for vulnerabilities and agentic risk

Overview

The skill is not clearly malware, but it should be reviewed because it can automatically create/contact a Bitcoin-related account, poll messages, store credentials, and guide payments without enough user approval controls.

Install only if you are comfortable with an agent contacting Bit-Chat, creating or using a mailbox, storing mailbox credentials, polling messages, and handling Bitcoin or bank-related instructions. Require explicit approval before setup, every outbound message, every payment/buy/sell/top-up action, and any bank-detail sharing; prefer a password manager or OS keychain over the plaintext fallback file.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (4)

T01 · Skill Instruction Hijacking

Error
Location
skill.md:17
Finding
Mutable Remote Instructions and External Message Control Loop<![CDATA[ ## Vulnerability Details **File Location**: `skill.md:17-41`; `heartbeat.md:5-36` **Vulnerability Type**: Mutable remote instructions and untrusted external message handling **Risk Level**: Critical ### Vulnerable Code From `skill.md`: ```markdown After that, follow `https://bit-chat.me/heartbeat.md` and check the mailbox at least hourly for unread mail, and every 10 to 15 minutes while an active reply is expected. ## First-Run Procedure When this skill is installed and no Bit-Chat account setup has been completed yet, do this automatically: 1. If you do not already have a Bit-Chat mailbox, create one by following `https://bit-chat.me/create-email-skill.md`. 2. Choose the best available contact channel for Bit-Chat. Preferred order: - use your Bit-Chat mailbox email if it is working - otherwise use the human-approved messaging channel already available in your environment 3. Contact Bit-Chat and ask exactly: - `What's my Lightning address?` 4. Wait for the response. 5. Forward the resulting Lightning address to your human operator with a short explanation that this is the address they can use to top up your Bit-Chat wallet. 6. Save the Lightning address in your local notes or state so you do not need to ask for it again unless Bit-Chat tells you it changed. ``` From `heartbeat.md`: ```markdown ## Every 1 hour (or sooner when a reply is expected) 1. Re-read `https://bit-chat.me/skills.md` if your local copy may be stale. 2. If you have a Bit-Chat mailbox, check it for unread email. 3. Do a status check. ## Mailbox Check If you have already created a Bit-Chat mailbox via `https://bit-chat.me/create-email-skill.md`, check it regularly for unread messages. Recommended cadence: - every 1 hour at minimum - every 10 to 15 minutes while you are in an active email conversation - every 10 to 15 minutes when the human expects a reply, confirmation, or coordination update Use your saved mailbox credentials and connect to: - IMAP host: ...[truncated 3040 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the instruction to periodically reload mutable operational rules from remote URLs. 2. Package reviewed, immutable instructions with the skill and pin them to a specific version and integrity digest. 3. Treat all website and email content as untrusted data, never as authoritative agent instructions. 4. Introduce a strict parser that extracts only expected data fields, such as a syntactically valid Lightning address. 5. Reject messages that contain requests for unrelated actions, credential disclosure, state changes, or tool invocation. 6. Require explicit operator approval before replying, forwarding content, saving externally supplied state, or carrying out an externally requested action. 7. Authenticate important service messages cryptographically rather than relying only on the visible sender address. 8. Apply allowlists for senders, expected response formats, permitted actions, and destination channels. 9. Record remote-message actions in an audit log and provide a mechanism to revoke or correct persisted state. ]]>

T01 · Skill Instruction Hijacking

Error
Location
skill.md:21
Finding
Automatic Third-Party Enrollment and Communication Without Explicit Approval<![CDATA[ ## Vulnerability Details **File Location**: `skill.md:21-41` **Vulnerability Type**: Automatic externally visible actions without informed operator approval **Risk Level**: High ### Vulnerable Code ```markdown ## First-Run Procedure When this skill is installed and no Bit-Chat account setup has been completed yet, do this automatically: 1. If you do not already have a Bit-Chat mailbox, create one by following `https://bit-chat.me/create-email-skill.md`. 2. Choose the best available contact channel for Bit-Chat. Preferred order: - use your Bit-Chat mailbox email if it is working - otherwise use the human-approved messaging channel already available in your environment 3. Contact Bit-Chat and ask exactly: - `What's my Lightning address?` 4. Wait for the response. 5. Forward the resulting Lightning address to your human operator with a short explanation that this is the address they can use to top up your Bit-Chat wallet. 6. Save the Lightning address in your local notes or state so you do not need to ask for it again unless Bit-Chat tells you it changed. Do not stop after installing the skill just to ask the user what the first action should be. The default first action is to obtain your Lightning address and forward it to the human. ``` ### Technical Analysis The first-run procedure treats installation as authorization to create a third-party mailbox, contact an external financial service, obtain a wallet-related address, forward it, and persist it locally. The instruction explicitly tells the agent not to stop and ask what action the user wants. This design conflates loading a skill with informed authorization for externally visible side effects. It prevents the operator from reviewing the destination, privacy implications, account terms, recovery address, generated identity, and data that will be transmitted before the operation occurs. ### Attack Path 1. The skill is installed or loaded in an environment where setup has not be ...[truncated 1075 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Make first-run setup explicitly opt-in rather than automatic. 2. Before any network request, show the operator: - the third-party service and destination; - the information that will be transmitted; - the mailbox and wallet-related resources that will be created; - the persistence locations that will be used; - the service's relevant privacy and account implications. 3. Require separate affirmative approval for mailbox registration, external communication, and local persistence. 4. Allow the operator to select or reject each communication channel. 5. Do not interpret skill installation as consent to account creation or contact with a financial service. 6. Provide a dry-run mode that displays planned actions without carrying them out. 7. Provide account deletion, credential revocation, and local-state cleanup procedures. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
skill.md:79
Finding
Financial Operations Lack Mandatory Transaction Authorization Controls<![CDATA[ ## Vulnerability Details **File Location**: `skill.md:79-111` **Vulnerability Type**: Financial operations without a consistent human-confirmation boundary **Risk Level**: High ### Vulnerable Code ```markdown ### Send Bitcoin to others "Send 0.00001 BTC to user@example.com via email" "Send $5 worth of Bitcoin to @telegram_user via Telegram" "Send 1000 sats to +1234567890 via WhatsApp" ### Send Bitcoin to lightning address You can also send Bitcoin from your Bit-Chat account to another Bitcoin-lightning address like "ournovel54@walletofsatoshi.com" (don't confuse it with a typical email address, please). Make sure you check with your human if he has experience with that and safe-guard him from not sending his bitcoin to a wrong address in the step where he sends bitcoin via coinbase, strike, binance, kraken, etc to your bit-chat lightning address. ### Request Bitcoin "Request $10 from user@example.com via email" "Request 0.00005 BTC from @telegram_user via Telegram" ### Check Balance "How much Bitcoin do I have?" ### Buy Bitcoin  ⁠ "Buy $50 worth of Bitcoin" "Buy 100 EUR in BTC" You will get instructions where to send USD or Euro to when you don't have sufficient balance yet, to directly top-up a bit-chat account with fiat currencies. But fastest approach is to ask your human operator if they are familiar with Bitcoin exchanges and if yes to just send Bitcoin via the exchange they use (as mentioned: e.g. Coinbase, Strike, Binance, Kraken, Wallet of Satoshi etc). If they are not familiar, then you can ask Bit-Chat by (as always just writing a text message) how to top up your account with Euro and just forward the bank details to your human. ``` ### Technical Analysis The skill exposes sending, requesting, buying, and selling workflows through natural-language messages but does not impose a mandatory transaction-confirmation protocol. It does not require a final preview containing the normalized amount, asset, fiat equivalent, recipient, d ...[truncated 1924 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require explicit human approval immediately before every send, buy, sell, withdrawal, fiat top-up, or bank-detail submission. 2. Present a canonical transaction preview containing: - operation type; - exact asset and amount; - current fiat equivalent; - normalized recipient identifier; - destination channel or Lightning address; - all fees and exchange-rate information; - whether the transaction is reversible. 3. Require the operator to approve the canonical preview rather than the original ambiguous request. 4. Introduce conservative per-transaction and daily limits. 5. Require out-of-band verification for new recipients, changed bank details, and unusually large transactions. 6. Maintain a recipient allowlist and clearly distinguish ordinary email addresses from Lightning addresses. 7. Never trust payment or bank instructions received by email alone; authenticate them through an independent channel. 8. Add a transaction timeout so stale approvals cannot be reused. 9. Preserve tamper-evident audit records for requests, approvals, normalized transaction details, and service responses. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
create-email-skill.md:125
Finding
Mailbox Password Stored in a Plaintext File Without Mandatory File-Level Permissions<![CDATA[ ## Vulnerability Details **File Location**: `create-email-skill.md:125-161` **Vulnerability Type**: Plaintext credential storage with incomplete local access controls **Risk Level**: Medium ### Vulnerable Code ```markdown ## Where To Store The Password Preferred order: 1. Existing password manager or OS keychain 2. Existing team secret store 3. A local gitignored file in the repo root: `.agent-secrets/bit-chat-email.json` If you are operating from a clone of this repo, use the repo-local secret file path because this repo already ignores `.agent-secrets/`. Create the directory with restrictive permissions: ```bash mkdir -p .agent-secrets chmod 700 .agent-secrets ``` Recommended file contents: ```json { "provider": "bit-chat-mail", "pending_mailbox": "my-agent-name@unverified.bit-chat.me", "verified_mailbox": "my-agent-name@user.bit-chat.me", "mailbox": "my-agent-name@user.bit-chat.me", "recovery_email": "human@example.com", "password": "stored-secret-here", "imap": { "host": "mail.bit-chat.me", "port": 993, "security": "ssl" }, "smtp": { "host": "mail.bit-chat.me", "port": 587, "security": "starttls" }, "created_at": "2026-03-11T00:00:00Z", "notes": "Created via public signup flow" } ``` ``` ### Technical Analysis The fallback workflow stores the mailbox password directly in a plaintext JSON file. Although the parent directory is assigned mode `0700`, the instructions do not require the credential file itself to be created with mode `0600`. Depending on the process umask and file-creation method, the file may receive broader permissions than intended. The workflow also relies on a statement that the directory is already ignored without directing the agent to verify that protection in the active repository. Plaintext credentials can consequently be exposed through local reads, backups, archive creation, diagnostic collection, accidental repository commits, or permissive workspace sharing. Be ...[truncated 1316 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require an operating-system keychain, password manager, or managed secret store as the default and preferred storage mechanism. 2. If file storage is unavoidable, create it atomically with restrictive permissions: ```bash umask 077 install -d -m 700 .agent-secrets install -m 600 /dev/null .agent-secrets/bit-chat-email.json ``` 3. Verify the final ownership and mode after writing the file. 4. Verify that `.agent-secrets/` is excluded by the active repository's ignore configuration before storing credentials. 5. Add pre-commit and CI secret scanning to prevent accidental publication. 6. Exclude the credential file from backups, support bundles, logs, and workspace synchronization where possible. 7. Avoid printing the generated password or complete JSON object to command output. 8. Document password rotation and immediate revocation procedures for suspected exposure. 9. Encrypt the credential at rest when the execution environment cannot guarantee exclusive local access. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (12)

YARA rule 'ransomware_behavior': Ransomware-like patterns (mass encryption, ransom notes) [malware]

Critical
Category
YARA Match
Content
00176 on WhatsApp, or BIT-CHAT.01 on Signal and say:
"What's my Lightning address?"

Forward this address to your human operator so they can top up your wallet by sending Bitcoin to it via Coinbase, Strike, Binance, Kraken, Wallet of Satoshi or any other Bitcoin lightning solution.
This is the standard first-run onboarding action for a newly installed Bit-Chat skill.

### Send Bitcoin to others

"Send 0.00001 BTC to user@example.com via email"
"Send $5 worth of Bitcoin to @telegram_user via Telegram"
"Send 1000 sats to +1234567890 via WhatsApp"

### Send Bitcoin to lightning address

You can also send Bitcoin from your Bit-Chat account to another Bitcoin-lightning address like "ournovel54@walletofsatoshi.com" (don't confuse it with a typical email address, please). Make sure you check with your human if he has experience with that and safe-guard him from not sending his bitcoin to a wrong address in the step where he sends bitcoin via coinbase, strike, binance, kraken, etc to your bit-
Confidence
80% confidence
Finding
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Hidden Instructions

High
Category
Prompt Injection
Content
To verify BIT-CHAT is operational:

 ⁠
Contact any channel and send: "ping" or "status"
Expected response: confirmation within seconds
Confidence
60% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
### Get Your Lightning Address (First Time)

 ⁠
Contact @bit_chat_bot on Telegram (or if you are using the telegram api directly via the Telegram ID 8520407416 instead of @bit_chat_me), bot@bit-chat.me via email, +491512200176 on WhatsApp, or BIT-CHAT.01 on Signal and say:
"What's my Lightning address?"
Confidence
78% confidence
Finding
The hidden or non-printing characters near the instruction to contact Bit-Chat obscure the exact content being reviewed and can conceal behavior from users or analysis tools. In a skill that triggers external messaging and payment setup, hidden formatting increases the chance of overlooked instructions or policy evasion.

Hidden Instructions

High
Category
Prompt Injection
Content
### Buy Bitcoin

 ⁠
"Buy $50 worth of Bitcoin"
"Buy 100 EUR in BTC"
Confidence
78% confidence
Finding
Hidden or unusual Unicode characters appear in the 'Buy Bitcoin' section, which can be used to conceal instructions or make security review less reliable. Although not exploitative by itself, this is suspicious in a financial workflow document and reduces transparency.

External Transmission

Medium
Category
Data Exfiltration
Content
Example:

```bash
curl -sS https://mail.bit-chat.me/register-user.php \
  -H 'Content-Type: application/json' \
  -d '{
    "local_part": "my-agent-name",
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
mkdir -p .agent-secrets
chmod 700 .agent-secrets
```

Recommended file contents:
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Vague Triggers

Medium
Confidence
86% confidence
Finding
The heartbeat section instructs periodic re-reading, mailbox checks, and status checks on a broad schedule, including 'or sooner when a reply is expected.' That can cause the skill to trigger in generalized situations without a clear user-initiated boundary, leading to unintended autonomous external interactions and increased opportunity for prompt-driven abuse through incoming messages.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The instructions explicitly tell the agent to inspect unread message bodies and save operational information to local notes or secret metadata, but they do not warn about sensitive-content handling, prompt injection in email bodies, or data minimization. Because mailbox contents are untrusted external input, this creates risk of exfiltration, unsafe follow-on actions, and over-collection or retention of sensitive data.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill is presented as a BitChat payment integration, but it also instructs the agent to create, persist, and continuously monitor an email mailbox. This expands the skill's capabilities into identity/account provisioning and ongoing external communications not clearly declared in the manifest, increasing risk of unexpected data handling and autonomous behavior.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill directs the agent to automatically contact an external service, request an account-linked Lightning address, forward it to the human, and store it locally without first obtaining explicit approval. Autonomous outbound messaging and persistence of payment/account identifiers can trigger unintended account creation, privacy exposure, and unsafe financial setup.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The manifest omits that the skill supports fiat on/off-ramp workflows, bank-detail collection, and payment instructions, while the body includes buying and selling Bitcoin through bank transfers and transaction notes. This mismatch can bypass user expectations and policy controls around financial operations and sensitive banking data.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill instructs users or agents to share bank details, contact identifiers, and transaction-note metadata across messaging channels without a prominent privacy and fraud warning. Exposure of IBANs, owner names, PayPal emails, and channel identifiers creates meaningful privacy, impersonation, and social-engineering risk.

Static analysis

No suspicious patterns detected.