Back to skill

Security audit

Zoho mail skill

Security checks for vulnerabilities and agentic risk

Overview

This skill is a straightforward Zoho Mail API helper that reads and searches mail using user-provided Zoho OAuth credentials, with no hidden execution or persistence found.

Install only if you intend Clawdbot to read Zoho Mail for the configured account. Use the listed read-only OAuth scopes, keep the client secret and refresh token out of shared shells, logs, tickets, and chat, and revoke the refresh token from Zoho if it is exposed or no longer needed.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (8)

Credential Access

High
Category
Privilege Escalation
Content
## Authentication

Zoho uses OAuth 2.0. Access tokens expire after 1 hour, so always refresh before making API calls. The refresh token does not expire unless revoked.

### Get an access token
```bash
Confidence
88% confidence
Finding
The skill instructs users to obtain and use long-lived OAuth refresh credentials and access tokens for mailbox access, but provides minimal safeguards around secret handling. In this context, compromised refresh tokens can grant persistent access to email data, which is especially sensitive because mailboxes often contain password resets, invoices, personal data, and internal business communications.

Credential Access

High
Category
Privilege Escalation
Content
Zoho uses OAuth 2.0. Access tokens expire after 1 hour, so always refresh before making API calls. The refresh token does not expire unless revoked.

### Get an access token
```bash
ZOHO_ACCESS_TOKEN=$(curl -s -X POST "https://accounts.zoho.com/oauth/v2/token" \
  -d "refresh_token=$ZOHO_REFRESH_TOKEN" \
Confidence
88% confidence
Finding
The access-token acquisition workflow is necessary, but the instructions normalize handling mailbox-access credentials directly in shell variables without warning about leakage paths. Tokens present in shell environments can be exposed through history, debugging output, process inspection, or accidental copy/paste, enabling unauthorized mailbox access.

Credential Access

High
Category
Privilege Escalation
Content
## Notes

- Access tokens expire after **1 hour** — refresh before each session
- The refresh token does **not** expire unless revoked
- Rate limit: **30 API requests per minute** per account
- `receivedTime` is in milliseconds since epoch — convert with: `date -d @$((receivedTime/1000))`
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill guides users to retrieve mailbox contents from a remote provider without an up-front privacy warning or data-handling notice. Because email contents can contain highly sensitive personal, business, or credential data, users may invoke the skill without understanding that messages and metadata will be transmitted to Zoho APIs and exposed in local shell output.

External Transmission

Medium
Category
Data Exfiltration
Content
3. Generate a grant code with scopes: `ZohoMail.messages.READ,ZohoMail.folders.READ,ZohoMail.accounts.READ`
4. Exchange the grant code for a refresh token:
   ```bash
   curl -s -X POST "https://accounts.zoho.com/oauth/v2/token" \
     -d "code=YOUR_GRANT_CODE" \
     -d "client_id=YOUR_CLIENT_ID" \
     -d "client_secret=YOUR_CLIENT_SECRET" \
Confidence
60% 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
### Get an access token
```bash
ZOHO_ACCESS_TOKEN=$(curl -s -X POST "https://accounts.zoho.com/oauth/v2/token" \
  -d "refresh_token=$ZOHO_REFRESH_TOKEN" \
  -d "client_id=$ZOHO_CLIENT_ID" \
  -d "client_secret=$ZOHO_CLIENT_SECRET" \
Confidence
60% 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
### Get an access token
```bash
ZOHO_ACCESS_TOKEN=$(curl -s -X POST "https://accounts.zoho.com/oauth/v2/token" \
  -d "refresh_token=$ZOHO_REFRESH_TOKEN" \
  -d "client_id=$ZOHO_CLIENT_ID" \
  -d "client_secret=$ZOHO_CLIENT_SECRET" \
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Description-Behavior Mismatch

Low
Confidence
98% confidence
Finding
The manifest description and introductory text say the skill can read, search, and manage Zoho Mail. However, all documented commands are limited to authentication, listing accounts/folders/messages, reading message content, searching, and viewing metadata; there are no operations for sending, deleting, moving, labeling, or otherwise modifying mail state. This is a semantic mismatch between the claimed capability and the implemented/documented behavior.

Static analysis

No suspicious patterns detected.