Back to skill

Security audit

Yoap Communication

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent communication-protocol documentation, but it asks agents to handle real-person profile and meetup data through a third-party relay with weakly documented privacy and authorization safeguards.

Review carefully before installing. Only use this skill with profiles and messages you are comfortable sending to yoap.io, avoid precise personal or meetup details until trust is established, and do not copy the webhook handler into production without signature verification, replay protection, schema validation, rate limits, and human approval for consequential actions.

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
SKILL.md:410
Finding
Unauthenticated Webhook Events Can Trigger Agent Processing and Negotiation Actions<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:410-428` **Vulnerability Type**: Missing webhook authentication and replay protection **Risk Level**: High ### Vulnerable Code ```python @app.post("/yoap/request") async def handle_yoap(request: Request): data = await request.json() event_type = data["type"] if event_type == "message": # Direct message received await process_dm(data) elif event_type == "thread_created": # Someone started a negotiation with us await auto_review_proposal(data["threadId"], data["proposal"]) elif event_type == "thread_reply": # Counterparty replied in a thread await handle_negotiation(data["threadId"], data["replyType"]) elif event_type == "channel_message": # Group message in a channel await process_channel_msg(data["channelId"], data["content"]) return {"status": "received"} ``` ### Technical Analysis The documented webhook handler trusts every JSON request received at `/yoap/request`. It does not verify a cryptographic signature, shared secret, authenticated client identity, timestamp, nonce, source address, or replay identifier. Attacker-controlled fields are passed directly to message and negotiation handlers. In particular, a forged `thread_created` event can invoke `auto_review_proposal`, while forged direct or channel messages can reach downstream agent-processing logic. Input schema validation alone would not solve the issue because an attacker can submit syntactically valid events. The handler must establish that events originated from the expected YOAP relay and are fresh. ### Attack Path 1. An agent registers an Internet-accessible webhook endpoint following the Skill's example. 2. An attacker discovers or guesses the endpoint, or obtains it from configuration, logs, or registration data. 3. The attacker sends a forged request such as: ```http POST /yoap/request Content-Type: application/json { "type": " ...[truncated 1213 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require every webhook request to carry a cryptographic signature generated with a per-registration secret. 2. Verify the signature over the exact raw request body before parsing or processing the JSON. 3. Include a signed timestamp and unique event identifier, enforce a narrow clock-skew window, and store processed identifiers to prevent replay. 4. Use constant-time signature comparison and reject requests with missing, malformed, or invalid authentication headers. 5. Validate each event against a strict schema, including allowed event types, identifier formats, field lengths, and nested object limits. 6. Apply request-size limits, rate limiting, and processing timeouts. 7. Require explicit human approval before accepting proposals, confirming negotiations, disclosing contact information, or performing other consequential actions. 8. Bind events to the registered agent and verify that referenced threads or channels belong to that agent. 9. Log rejected authentication attempts without recording secrets or sensitive message content. 10. Where supported, add transport-level controls such as mutual TLS or relay IP allowlisting as defense in depth, not as a replacement for signed events. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:471
Finding
Message-Bearing Thread and Channel Resources Are Documented as Publicly Readable<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:471` and `SKILL.md:480` **Vulnerability Type**: Missing authentication and object-level authorization **Risk Level**: High ### Vulnerable Configuration ```text | `/threads/{id}` | GET | — | View thread status + messages | ``` ```text | `/channels/{id}` | GET | — | View channel info + messages | ``` The authentication column uses `—`, indicating that these GET endpoints do not require authentication even though they return messages. ### Technical Analysis The documented API permits retrieval of negotiation-thread messages and channel messages without authentication. Consequently, possession of a thread or channel identifier appears sufficient to read the corresponding resource. High-entropy identifiers may make random guessing more difficult, but identifiers are not an adequate authorization mechanism. They can be exposed through browser history, application logs, monitoring systems, screenshots, shared URLs, webhook payloads, referrer data, or messages. The documentation also does not state that access is restricted to thread participants or channel members. This behavior exceeds minimum privilege for private negotiation and group communication. Public access may be appropriate for explicitly public channel content, but private messages and negotiation records require authentication and object-level authorization. ### Attack Path 1. A user creates or participates in a negotiation thread or channel. 2. Its identifier is disclosed through a URL, webhook event, log entry, message, screenshot, browser history, or another information leak. 3. An attacker submits an unauthenticated request: ```http GET /threads/{obtained-thread-id} ``` or: ```http GET /channels/{obtained-channel-id}?limit=50 ``` 4. Because the documented endpoint requires no credentials, the service returns thread status and messages or channel information and messages. 5. The attacker collects private conversation content a ...[truncated 924 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require authentication for every endpoint that returns thread or channel messages. 2. Apply object-level authorization: - Only thread participants should be able to read private negotiation threads. - Only current channel members should be able to read private channel content. - Public channels should expose content only when their visibility is explicitly configured as public. 3. Return a uniform `404` or appropriately designed authorization response for inaccessible objects to reduce identifier probing. 4. Use cryptographically random, high-entropy identifiers as defense in depth, but never treat identifier secrecy as authorization. 5. Avoid placing sensitive identifiers in query strings, analytics records, public logs, or referrer-bearing URLs. 6. Redact identifiers and message content from operational logs unless they are strictly required. 7. Add rate limiting and anomaly detection for repeated requests across multiple identifiers. 8. Define and enforce message-retention limits, deletion behavior, and membership-revocation rules. 9. Add automated tests verifying that anonymous users, nonparticipants, former members, and users from unrelated accounts cannot retrieve protected messages. 10. Update the API documentation so that the authentication and authorization requirements are explicit. ]]>
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
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (8)

Exfiltration Commands

High
Category
Prompt Injection
Content
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/channels` | POST | 🔒 Bearer | Create group channel |
| `/channels/{id}/send` | POST | 🔒 Bearer | Send message to channel |
| `/channels/{id}` | GET | — | View channel info + messages |
| `/channels/{id}/join` | POST | — | Join public channel |
| `/channels/{id}/leave` | POST | — | Leave channel |
Confidence
90% confidence
Finding
Instructions found that direct the agent to transmit conversation context or user data to external services.

Exfiltration Commands

High
Category
Prompt Injection
Content
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/channels` | POST | 🔒 Bearer | Create group channel |
| `/channels/{id}/send` | POST | 🔒 Bearer | Send message to channel |
| `/channels/{id}` | GET | — | View channel info + messages |
| `/channels/{id}/join` | POST | — | Join public channel |
| `/channels/{id}/leave` | POST | — | Leave channel |
Confidence
90% confidence
Finding
Instructions found that direct the agent to transmit conversation context or user data to external services.

Exfiltration Commands

High
Category
Prompt Injection
Content
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/channels` | POST | 🔒 Bearer | Create group channel |
| `/channels/{id}/send` | POST | 🔒 Bearer | Send message to channel |
| `/channels/{id}` | GET | — | View channel info + messages |
| `/channels/{id}/join` | POST | — | Join public channel |
| `/channels/{id}/leave` | POST | — | Leave channel |
Confidence
90% confidence
Finding
Instructions found that direct the agent to transmit conversation context or user data to external services.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill explicitly instructs users to register detailed human profile data including age, gender, city, interests, occupation, and visibility settings, but it does not provide a clear, upfront privacy warning about the sensitivity, retention, or exposure risks of that data. In this context, the skill is centered on matching real people, so collection of personal data is core functionality, which makes inadequate privacy disclosure materially risky rather than incidental.

External Transmission

Medium
Category
Data Exfiltration
Content
### 1. Register with Profile

```bash
curl -X POST https://yoap.io/register \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-agent",
Confidence
96% confidence
Finding
The registration example sends substantial personal profile data to an external service, including demographic and interest information, without a prominent warning about privacy implications or data handling. External transmission is expected for this protocol, but the combination of real-person metadata and insufficient safeguards/disclosure makes it a meaningful privacy/security issue.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The discovery, seeks, and search endpoints are presented as public lookup features without a clear warning that profile attributes may become searchable or exposed to other parties. Because the protocol is designed to connect humans behind agents, omission of disclosure around public discoverability can lead users to unknowingly publish personal information to a broad audience.

External Transmission

Medium
Category
Data Exfiltration
Content
public_b64 = base64.b64encode(bytes(private_key.public_key)).decode()

# Upload public key to YOAP
requests.post(f"{RELAY}/keys/{address}",
    headers={"Authorization": f"Bearer {token}"},
    json={"publicKey": public_b64})
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Create a Thread

```bash
curl -X POST https://yoap.io/threads \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -d '{
Confidence
88% confidence
Finding
The thread creation example transmits structured meetup details, counterpart identities, and scheduling/location information to the external relay. While such transmission is part of the feature, it can reveal sensitive real-world coordination data about individuals if users are not clearly warned that negotiation metadata may be visible to the service or other participants.

Static analysis

No suspicious patterns detected.