T09 · Insecure Skill Coding Practices
- Location
SKILL.md:55- Finding
OAuth Credentials Can Be Sent to an Untrusted Host Through ZOHO_DC
- Content
View full analysis
- Remediation
View remediation
&2; exit 1 ;; esac ``` ]]>
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a Zoho Projects API helper, but it asks for broad credentials and includes risky write/delete operations without enough scoping or warnings.
Review before installing. Use the narrowest Zoho OAuth scopes available, omit bug-management scope unless you truly need it, avoid storing tokens in shared plaintext config, validate ZOHO_DC against official Zoho domains, and require explicit user confirmation before any task deletion or other destructive write.
SKILL.md:55OAuth Credentials Can Be Sent to an Untrusted Host Through ZOHO_DC
SKILL.md:31OAuth Setup Requests Permissions Beyond the Skill's Declared Functionality
The skill instructs storing a refreshed access token into persistent local configuration, which increases credential exposure and persistence risk. If that config store is accessible to other skills, users, logs, or backups, a stolen token could be reused to access and modify Zoho Projects data.
Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN
Access tokens expire **hourly**. If you get a 401, tell the user their token has expired and they need to refresh it using their refresh token (see Setup below). Store the refreshed token with:
```bash
openclaw config set skills.entries.zoho-projects.apiKey NEW_TOKEN
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
| Variable | Description |
|---|---|
| `ZOHO_ACCESS_TOKEN` | OAuth2 access token from Zoho (expires hourly) |
| `ZOHO_PORTAL_ID` | Your portal ID (get it from the List Portals call below) |
| `ZOHO_REFRESH_TOKEN` | (optional) Stored refresh token for auto-renewal |
| `ZOHO_CLIENT_ID` | (optional) OAuth client ID for token refresh |
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
List tasks in a project
curl -s "https://projectsapi.zoho.com/api/v3/portal/$ZOHO_PORTAL_ID/projects/$PROJECT_ID/tasks" \
-H "Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN"
Optional: ?status=open&sort_column=due_date&sort_order=asc
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST "https://accounts.zoho.com/oauth/v2/token" \
-d "grant_type=authorization_code" \
-d "client_id=$ZOHO_CLIENT_ID" \
-d "client_secret=$ZOHO_CLIENT_SECRET" \
The manifest description at L003 says the skill manages Zoho Projects by listing portals/projects and handling tasks, comments, time logs, milestones, and task lists, but it does not claim project creation or project modification. The file documents POST and PATCH operations for projects, which are materially broader write capabilities than the stated description.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
List tasks in a project
curl -s "https://projectsapi.zoho.com/api/v3/portal/$ZOHO_PORTAL_ID/projects/$PROJECT_ID/tasks" \
-H "Authorization: Zoho-oauthtoken $ZOHO_ACCESS_TOKEN"
Optional: ?status=open&sort_column=due_date&sort_order=asc
The skill exposes destructive task deletion that is not disclosed in the manifest description, increasing the chance a user or higher-level agent invokes a destructive action without informed consent. Hidden destructive capabilities are dangerous because they expand the operational surface beyond what an operator may expect.
The deletion command is destructive and the documentation does not warn that it may permanently remove project data. Without an explicit warning or confirmation requirement, accidental deletion becomes more likely, especially in an agent-driven workflow.
No suspicious patterns detected.