zoho-email
53 findings (18 critical, 3 high, 32 medium), mainly tool chaining abuse, data exfiltration, hardcoded secrets. Most recent scan 2026-02-07.
This Zoho Email integration skill presents MULTIPLE SERIOUS SECURITY CONCERNS that require immediate attention. The most critical issues are: (1) hardcoded credentials in test scripts exposing real email accounts, (2) insecure plaintext credential storage recommendations, (3) command injection risks in email query processing, and (4) missing tool restrictions. The skill handles sensitive email data and credentials but lacks adequate security controls. While OAuth2 support is present, the implementation stores tokens in plaintext. The bulk operation features could be abused for resource exhaustion. The skill requires significant security improvements before production use, particularly around credential management, input validation, and security documentation.
Scanner's overall assessment (LLM analyzer)
Second scanner: NVIDIA SkillSpector
Independent static run, no language model, over the same files as the Cisco scan above. How the two scanners compare across the whole corpus: Two scanners, one corpus.
What this skill does
Complete Zoho Mail integration with OAuth2, REST API (5-10x faster), HTML emails, attachments, and batch operations. Perfect for email automation and workflows.
- Package
- 26 files, 232 KB
- SKILL.md
- 2158 words, 12+ sections
- Code
- Python (9), Shell (7)
SKILL.md covers: Zoho Email Integration · ✨ Features · 🔐 Authentication & Performance · 📧 Email Operations · ⚡ Batch & Bulk Operations · 🔒 Security · 📦 Installation · ⚙️ Setup · 1. Get an App-Specific Password · 2. Configure Credentials · 3. Test Connection · 🚀 Usage
Findings
CRITICAL Base64 encoding (often used before data exfiltration) Data Exfiltrationstatic
Pattern detected: base64.b64encode
scripts/apply_oauth2.py:103
return base64.b64encode(auth_string.encode()).decode()CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export credentials
SKILL.md:500
export ZOHO_PASSWORD="your-app-password"CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0;31m
test-app-password.sh:9
RED='\033[0;31m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[1;33m
test-app-password.sh:10
YELLOW='\033[1;33m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0;34m
test-app-password.sh:11
BLUE='\033[0;34m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0m
test-app-password.sh:12
NC='\033[0m' # No ColorCRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: </script>
scripts/oauth-setup.py:57
<script>setTimeout(function() { window.close(); }, 3000);</script>CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: setTimeout(
scripts/oauth-setup.py:57
<script>setTimeout(function() { window.close(); }, 3000);</script>CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: function(
scripts/oauth-setup.py:57
<script>setTimeout(function() { window.close(); }, 3000);</script>CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_EMAIL='your-email@domain.com'", file
scripts/apply_oauth2_cli.py:131
print(" export ZOHO_EMAIL='your-email@domain.com'", file=sys.stderr)CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_PASSWORD='your-app-specific-password'", file
scripts/apply_oauth2_cli.py:132
print(" export ZOHO_PASSWORD='your-app-specific-password'", file=sys.stderr)'''CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_EMAIL='your-email@domain.com'", file
scripts/apply_oauth2_cli.py:137
print(" export ZOHO_EMAIL='your-email@domain.com'", file=sys.stderr)CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_PASSWORD='your-app-specific-password'", file
scripts/apply_oauth2_cli.py:138
print(" export ZOHO_PASSWORD='your-app-specific-password'", file=sys.stderr)'''CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_EMAIL='your-email@domain.com'", file
scripts/add_oauth_cli.py:114
print(" export ZOHO_EMAIL='your-email@domain.com'", file=sys.stderr)CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_PASSWORD='your-app-specific-password'", file
scripts/add_oauth_cli.py:115
print(" export ZOHO_PASSWORD='your-app-specific-password'", file=sys.stderr)''',CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_EMAIL='your-email@domain.com'", file
scripts/add_oauth_cli.py:119
print(" export ZOHO_EMAIL='your-email@domain.com'", file=sys.stderr)CRITICAL CREDENTIAL HARVESTING detected by YARA Hardcoded Secretsstatic
Detects potential exposure of sensitive information like API keys, passwords, tokens, and certificates: export ZOHO_PASSWORD='your-app-specific-password'", file
scripts/add_oauth_cli.py:120
print(" export ZOHO_PASSWORD='your-app-specific-password'", file=sys.stderr)'''CRITICAL Hardcoded Credentials in Test Scripts Data Exfiltrationllm
Multiple test scripts contain hardcoded email addresses (brian@creativestudio.co.za) that could expose the developer's actual email account. While these appear to be test scripts, they demonstrate a pattern of hardcoding sensitive information and could lead to credential exposure if users copy these patterns.
test-rest-api-fixes.sh
export ZOHO_EMAIL="brian@creativestudio.co.za" in test scripts and TEST_RECIPIENT="brian@creativestudio.co.za" in examplesHIGH Insecure Credential Storage Recommendation Data Exfiltrationllm
The skill's setup instructions recommend storing credentials in plaintext files (~/.clawdbot/zoho-credentials.sh) with only basic file permissions (chmod 600). While better than no protection, this approach stores passwords in plaintext on disk, making them vulnerable to file system access, backups, or malware.
SKILL.md
Create ~/.clawdbot/zoho-credentials.sh with export ZOHO_EMAIL and export ZOHO_PASSWORD in plaintextHIGH Command Injection Risk in Email Processing Command Injectionllm
The zoho-email.py script processes email content and subjects that could contain malicious payloads. While the code uses json.dumps for output, there are multiple places where email content is processed without sanitization, particularly in search queries and email body handling. The IMAP search functionality accepts user-controlled query strings that are passed directly to IMAP commands.
scripts/zoho-email.py
query parameter in search_emails() is passed to IMAP search without sanitization: mail.search(None, query)HIGH Unrestricted Tool Usage - Missing allowed-tools Declaration Unauthorized Tool Usellm
The skill does not declare 'allowed-tools' in its YAML manifest, meaning it can use any agent tool without restriction. The skill executes Python scripts that perform network operations, file I/O, and email operations. Users cannot verify what tools the skill will use before installation.
SKILL.md
YAML manifest shows: allowed-tools: Not specified. Python scripts perform network requests, file operations, and execute external commands.MEDIUM HTTP client library imports that enable external communication Data Exfiltrationstatic
Pattern detected: import requests
scripts/zoho-email.py:114
import requestsMEDIUM HTTP client library imports that enable external communication Data Exfiltrationstatic
Pattern detected: import requests
scripts/zoho-email.py:141
import requestsMEDIUM HTTP client library imports that enable external communication Data Exfiltrationstatic
Pattern detected: import urllib.request
scripts/zoho-email.py:1808
import urllib.requestMEDIUM Reading environment variables that may contain secrets Data Exfiltrationstatic
Pattern detected: os.environ.get('ZOHO_PASSWORD
scripts/zoho-email.py:26
PASSWORD = os.environ.get('ZOHO_PASSWORD')MEDIUM Reading environment variables that may contain secrets Data Exfiltrationstatic
Pattern detected: os.environ.get("ZOHO_PASSWORD
scripts/zoho-email.py:1768
"zoho_password_env_set": bool(os.environ.get("ZOHO_PASSWORD")),MEDIUM HTTP client library imports that enable external communication Data Exfiltrationstatic
Pattern detected: import urllib.request
scripts/apply_oauth2.py:79
import urllib.requestMEDIUM HTTP client library imports that enable external communication Data Exfiltrationstatic
Pattern detected: import urllib.request
scripts/oauth-setup.py:99
import urllib.requestMEDIUM HTTP client library imports that enable external communication Data Exfiltrationstatic
Pattern detected: import urllib.request
scripts/oauth-setup.py:126
import urllib.requestMEDIUM Reading environment variables that may contain secrets Data Exfiltrationstatic
Pattern detected: os.environ.get('ZOHO_PASSWORD
examples/batch-cleanup.py:163
if not os.environ.get('ZOHO_EMAIL') or not os.environ.get('ZOHO_PASSWORD'):MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get Specific Email
SKILL.md:220
python3 scripts/zoho-email.py get Inbox 4590MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get latest email
SKILL.md:332
# List attachmentsMEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get specific email
SKILL.md:365
email = zoho.get_email(folder="Sent", email_id="4590")MEDIUM SKILL DISCOVERY ABUSE detected by YARA Skill Discovery Abusestatic
Detects manipulation of skill discovery to increase unwanted activation: Perfect
SKILL.md:562
python3 scripts/zoho-email.py mark-unread INBOX 1004 1005MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get email: python3 scripts/zoho-email
test.sh:60
echo " • Get email: python3 scripts/zoho-email.py get INBOX <email_id>"MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get attachments for this email
examples/attachment-demo.py:73
# Get attachments for this emailMEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Read, Search, Monitor, Send
scripts/zoho-email.py:4
Handles: Read, Search, Monitor, Send emailsMEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: GET, POST
scripts/zoho-email.py:183
method: HTTP method (GET, POST, PATCH, DELETE)MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: get('email', EMAIL
scripts/zoho-email.py:357
'fromAddress': self.tokens.get('email', EMAIL),MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: get('email') or EMAIL
scripts/zoho-email.py:641
self.email = self.oauth_tokens.get('email') or EMAILMEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get a specific email
scripts/zoho-email.py:922
"""Get a specific email by ID"""MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get unread: python3 zoho-email
scripts/zoho-email.py:1669
print(" Get unread: python3 zoho-email.py unread")MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get email: python3 zoho-email
scripts/zoho-email.py:1670
print(" Get email: python3 zoho-email.py get <folder> <id>")MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: read: python3 zoho-email
scripts/zoho-email.py:1678
print(" Mark as read: python3 zoho-email.py mark-read <folder> <id1> <id2> ...")MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get unread: python3 zoho-email
scripts/zoho-email.py:1718
print(" Get unread: python3 zoho-email.py unread")MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Get email: python3 zoho-email
scripts/zoho-email.py:1719
print(" Get email: python3 zoho-email.py get <folder> <id>")MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: read: python3 zoho-email
scripts/zoho-email.py:1728
print(" Mark as read: python3 zoho-email.py mark-read <folder> <id1> <id2> ...")MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: get("email
scripts/zoho-email.py:1788
report["oauth_email_in_token"] = bool(tokens.get("email") or tokens.get("user") or tokens.get("user_email"))MEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Read, Search, Monitor, Send
scripts/apply_oauth2.py:16
Handles: Read, Search, Monitor, Send emailsMEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: Read, Search, Monitor, Send
scripts/apply_oauth2.py:20
Handles: Read, Search, Monitor, Send emailsMEDIUM TOOL CHAINING ABUSE detected by YARA Tool Chaining Abusestatic
Detects suspicious tool chaining patterns that could lead to data exfiltration: get('email') or EMAIL
scripts/apply_oauth2.py:201
self.email = self.oauth_tokens.get('email') or EMAILMEDIUM OAuth2 Token Storage Without Encryption Data Exfiltrationllm
OAuth2 tokens are stored in plaintext JSON files (~/.clawdbot/zoho-mail-tokens.json) without encryption. While file permissions may restrict access, the tokens (including refresh tokens) are vulnerable if the file system is compromised. Refresh tokens provide long-term access and should be protected with encryption.
scripts/zoho-email.py
with open(token_path, 'w') as f: json.dump(tokens, f, indent=2) - tokens stored in plaintextMEDIUM Potential Resource Exhaustion in Bulk Operations Resource Abusellm
The bulk_action and empty-spam/empty-trash functions can process large numbers of emails without rate limiting or resource constraints. The code includes a limit parameter but defaults to processing 100 emails at once, which could cause performance issues or trigger rate limits on Zoho's servers.
scripts/zoho-email.py
limit parameter defaults to 100, no rate limiting between operations, no timeout protection for large batchesWhat is in the package
26 files, 232 KB. Show the list.
| File | Kind | Size |
|---|---|---|
CHANGELOG.md | doc | 13 KB |
OAUTH2_SETUP.md | doc | 11 KB |
README.md | doc | 7.0 KB |
SKILL.md | doc | 17 KB |
requirements.txt | doc | 910 B |
test-app-password.sh | script | 4.2 KB |
test-batch-operations.sh | script | 2.6 KB |
test-rest-api-fixes.sh | script | 3.7 KB |
test.sh | script | 2.0 KB |
examples/attachment-demo.py | script | 5.1 KB |
examples/auto-reply.py | script | 1.3 KB |
examples/batch-cleanup.py | script | 5.8 KB |
examples/morning-briefing.sh | script | 538 B |
examples/send-html-newsletter.py | script | 3.9 KB |
examples/vip-monitor.sh | script | 854 B |
scripts/add_oauth_cli.py | script | 5.5 KB |
scripts/apply_oauth2.py | script | 15 KB |
scripts/apply_oauth2_cli.py | script | 6.8 KB |
scripts/oauth-setup.py | script | 14 KB |
scripts/zoho-email.py | script | 92 KB |
examples/clawdbot-commands/emails.sh | script | 1.2 KB |
examples/templates/README.md | doc | 5.3 KB |
examples/templates/announcement.html | data | 4.4 KB |
examples/templates/newsletter.html | data | 3.1 KB |
examples/templates/simple.html | data | 1.6 KB |
examples/templates/welcome.html | data | 5.4 KB |
External hosts referenced
accounts.zoho.com github.com api-console.zoho.com img.shields.io mail.zoho.com clawdhub.com your-site.com keepachangelog.com semver.org tools.ietf.org www.zoho.com
Hostnames that appear in the skill's files. Referencing a host is not a finding; compare against the findings above and the skill's stated purpose.
Environment variables referenced
ZOHO_EMAIL API_MODE ZOHO_PASSWORD MESSAGE_ID ZOHO_API_BASE_URL EMAIL_ID TEST_EMAIL ZOHO_API_RATE_DELAY ZOHO_API_TIMEOUT BASE_DIR EMAIL EMAILS PASSED ZOHO_IMAP_PORT ZOHO_SMTP_PORT ZOHO_TOKENS_JSON
Package contents recorded 2026-10-22. The scan above ran against the version current at scan time; the two can differ if the skill has since been updated.
What we checked
- Static analyzer. Pattern rules over SKILL.md and bundled files: known-bad commands, exfiltration URLs, secrets, obfuscation.
- Llm analyzer. A language model reads the skill and reports intent-level issues the rules cannot express.
- Meta analyzer. A second model pass that validates, deduplicates and re-scores the other analyzers' findings.
What we did not check
- Runtime behaviour. The skill was not executed; findings come from reading its files.
- Anything fetched at install or run time, including remote scripts, package dependencies, and URLs the skill tells the agent to open.
- Content the analyzers cannot read: images, binaries, and some non-English text.
- Known scanner bypass classes. See the methodology and limitations page.
Sources
- Repository: https://clawhub.ai/skills/zoho-email-integration
- Raw scan result: zoho-email-integration-scan.json
- Badge for your README:
 - Request a re-scan