Back to skill

Security audit

Miro REST API Reference

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent Miro API documentation skill with credential and mutation examples that are disclosed and purpose-aligned, though some security examples should be reviewed before production use.

Installers should treat this as reference documentation, not production-ready security code. Use least-privilege Miro scopes, avoid pasting high-scope tokens into agent sessions, pin and review dependencies if using the examples, and replace the OAuth state and webhook signature examples with hardened implementations before production deployment.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
references/examples.md:218
Finding

Webhook signature verification uses an unavailable raw request body

Content
View full analysis
{ // Verify signature (see Signature Verification section) const isValid = verifySignature(req); ``` `references/webhooks.md:240-258`: ```javascript const crypto = require('crypto'); function verifySignature(req) { const signature = req.get('X-Miro-Request-Signature'); const secret = process.env.MIRO_WEBHOOK_SECRET; const body = req.rawBody; // Store raw body as string const hmac = crypto .createHmac('sha256', secret) .update(body) .digest('hex'); return signature === `sha256=${hmac}`; } // Middleware to capture raw body app.use(express.raw({type: 'application/json'})); ``` ### Technical Analysis An HMAC webhook signature must be calculated over the exact request bytes received from the sender. `express.json()` parses and consumes the request body but does not create `req.rawBody`. Consequently, the example in `references/examples.md` passes `undefined` to `Hmac.update()`. The webhook guide has a related middleware-ordering problem: `express.raw()` is shown aft ...[truncated 2282 chars]
Remediation
View remediation
{ const supplied = req.get('X-Miro-Request-Signature'); const body = req.body; if (!supplied || !Buffer.isBuffer(body)) { return res.status(401).send('Unauthorized'); } const expected = `sha256=${crypto .createHmac('sha256', webhookSecret) .update(body) .digest('hex')}`; const suppliedBuffer = Buffer.from(supplied, 'utf8'); const expectedBuffer = Buffer.from(expected, 'utf8'); if ( suppliedBuffer.length !== expectedBuffer.length || !crypto.timingSafeEqual(suppliedBuffer, expectedBuffer) ) { return res.status(401).send('Unauthorized'); } let event; try { event = JSON.parse(body.toString('utf8')); } catch { return res.status(400).send('Invalid JSON'); } res.status(200).send('OK'); setImmediate(() => handleEvent(event)); } ); ``` ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
references/authentication.md:129
Finding

OAuth state is generated with a weak random-number source and is not bound to a session

Content
View full analysis
Remediation
View remediation
pending.expiresAt || typeof req.query.state !== 'string' || req.query.state !== pending.state ) { throw new Error('Invalid OAuth state'); } } ``` ]]>

T08 · Insecure Dependencies

Note
Location
references/examples.md:115
Finding

Dependency installation examples use mutable unpinned package versions

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (73)

YARA rule 'agent_skill_credential_exfiltration_webhook': AI agent skill credential harvesting followed by webhook or external exfiltration [agent_skills]

Critical
Category
YARA Match
Confidence
85% confidence
Finding

YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).

Content

Scanner excerpt · references/webhooks.md (reported line 105)May include surrounding context.

uest): return 'Unauthorized', 401

text
event = request.json
print(f"Received {event['type']} event")

if event['type'] == 'item.created':
    handle_item_created(event['data'])

return 'OK', 200

def handle_item_created(data): print(f"New item: {data['title']}")

if name == 'main': app.run(port=3000)

text

### 2. Register Webhook via API

```bash
curl -X POST https://api.miro.com/v2/teams/{team_id}/webhooks \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourapp.com/webhook/miro",
    "events": ["item.created", "item.updated", "item.deleted"],
    "board_ids": ["board-123"]
  }'

Response:

json
{
  "id": "webhook-123",
  "url": "https://yourapp.com/webhook/miro",
  "events": ["item.created", "item.updated", "item.deleted"],
  "board_ids": ["board-123"],
  "created_at": "2024-01-15T10:30:00Z",
  "status": "ACTIVE"
}

3. Test Webhook (Optional)

bash
cu

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

Base URL: https://api.miro.com/v2

Authentication: OAuth 2.0 or Personal Access Tokens

Example Request:

bash

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

Base URL: https://api.miro.com/v2

Authentication: OAuth 2.0 or Personal Access Tokens

Example Request:

bash

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

text
1. Register app at https://miro.com/app/settings/user-profile/apps
2. Redirect user to authorization endpoint
3. Exchange auth code for access token
4. Use token in Authorization header: Bearer <token>
5. Refresh token when expired (3600 seconds)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

text
1. Register app at https://miro.com/app/settings/user-profile/apps
2. Redirect user to authorization endpoint
3. Exchange auth code for access token
4. Use token in Authorization header: Bearer <token>
5. Refresh token when expired (3600 seconds)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
- `POST /boards` - Create new board
- `GET /boards/{board_id}` - Get board details
- `PATCH /boards/{board_id}` - Update board
- `DELETE /boards/{board_id}` - Delete board

### Items
- `GET /boards/{board_id}/items` - List items on board

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
- `POST /boards/{board_id}/items` - Create item
- `GET /boards/{board_id}/items/{item_id}` - Get item details
- `PATCH /boards/{board_id}/items/{item_id}` - Update item
- `DELETE /boards/{board_id}/items/{item_id}` - Delete item

### Comments
- `GET /boards/{board_id}/comments` - List comments

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
- `POST /boards/{board_id}/comments` - Add comment
- `GET /boards/{board_id}/comments/{comment_id}` - Get comment
- `PATCH /boards/{board_id}/comments/{comment_id}` - Update comment
- `DELETE /boards/{board_id}/comments/{comment_id}` - Delete comment

### Team Members
- `GET /teams/{team_id}/members` - List team members

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
### Team Members
- `GET /teams/{team_id}/members` - List team members
- `POST /teams/{team_id}/members` - Invite member
- `DELETE /teams/{team_id}/members/{user_id}` - Remove member

### Webhooks
- `GET /teams/{team_id}/webhooks` - List webhooks

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
- `GET /teams/{team_id}/webhooks` - List webhooks
- `POST /teams/{team_id}/webhooks` - Create webhook
- `PATCH /teams/{team_id}/webhooks/{webhook_id}` - Update webhook
- `DELETE /teams/{team_id}/webhooks/{webhook_id}` - Delete webhook

## Rate Limiting

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `references/examples.md` - Code examples (curl, HTTP)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 8)May include surrounding context.

md
Miro supports two primary authentication approaches:

1. **OAuth 2.0** (Recommended for production applications)
2. **Personal Access Tokens** (Recommended for development/automation)

---

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 12)May include surrounding context.

md
Miro supports two primary authentication approaches:

1. **OAuth 2.0** (Recommended for production applications)
2. **Personal Access Tokens** (Recommended for development/automation)

---

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 27)May include surrounding context.

md
- Visit https://miro.com/app/settings/user-profile/apps
   - Or: Click Profile → Settings → Apps & Integrations

2. **Create Personal Access Token:**
   - Click "Create new personal access token"
   - Enter a descriptive name
   - Select required scopes (see below)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 146)May include surrounding context.

md
- Visit https://miro.com/app/settings/user-profile/apps
   - Or: Click Profile → Settings → Apps & Integrations

2. **Create Personal Access Token:**
   - Click "Create new personal access token"
   - Enter a descriptive name
   - Select required scopes (see below)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 172)May include surrounding context.

md
- Visit https://miro.com/app/settings/user-profile/apps
   - Or: Click Profile → Settings → Apps & Integrations

2. **Create Personal Access Token:**
   - Click "Create new personal access token"
   - Enter a descriptive name
   - Select required scopes (see below)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 28)May include surrounding context.

md
- Or: Click Profile → Settings → Apps & Integrations

2. **Create Personal Access Token:**
   - Click "Create new personal access token"
   - Enter a descriptive name
   - Select required scopes (see below)
   - Click "Create"

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 179)May include surrounding context.

text

#### 6. Refresh Token When Expired
Access tokens expire after 3600 seconds (1 hour).

**Refresh Request:**
```http

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/authentication.md (reported line 299)May include surrounding context.

md
- See scope list above

### Token Expired (OAuth)
**Cause:** Access token older than 1 hour
**Solution:**
- Refresh token using refresh token
- Implement automatic refresh before expiration

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/endpoints.md (reported line 105)May include surrounding context.

Delete Board

http
DELETE /boards/{board_id}

Response: 204 No Content

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/endpoints.md (reported line 196)May include surrounding context.

Delete Item

http
DELETE /boards/{board_id}/items/{item_id}

Response: 204 No Content

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/endpoints.md (reported line 284)May include surrounding context.

Delete Comment

http
DELETE /boards/{board_id}/comments/{comment_id}

Response: 204 No Content

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/endpoints.md (reported line 331)May include surrounding context.

Remove Team Member

http
DELETE /teams/{team_id}/members/{user_id}

Response: 204 No Content

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/endpoints.md (reported line 379)May include surrounding context.

Delete Webhook

http
DELETE /teams/{team_id}/webhooks/{webhook_id}

Response: 204 No Content

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/examples.md (reported line 119)May include surrounding context.

npm install axios dotenv

text

### .env File

MIRO_TOKEN=miro_pat_your_token_here

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/authentication.md:53