Is addozhang/google-tasks safe?

https://github.com/openclaw/skills/tree/main/skills/addozhang/google-tasks

84
SAFE

The addozhang/google-tasks skill is a legitimate Google Tasks CRUD integration with no evidence of malicious intent: SKILL.md contains no prompt injection, all runtime API traffic targets official Google endpoints exclusively, installation produced no unexpected network connections or process activity, and honeypot canary files remained unmodified. The primary structural concerns are that auth.py and refresh_token.js traverse three directory levels above the scripts/ directory to locate OAuth credentials — an intentional design convention for OpenClaw workspace deployments that introduces credential exposure risk in non-standard installation paths — and that create_task.sh sources a local config file in the shell execution context, creating a cross-skill code execution escalation path if the config is tampered with. These are design-level risks rather than indicators of active malice, and the skill is safe to install in the intended workspace environment with awareness of these patterns.

Category Scores

Prompt Injection 92/100 · 30%
Data Exfiltration 72/100 · 25%
Code Execution 80/100 · 20%
Clone Behavior 95/100 · 10%
Canary Integrity 95/100 · 10%
Behavioral Reasoning 72/100 · 5%

Findings (8)

HIGH Auth scripts read OAuth credentials from outside skill directory via ../../.. traversal -28

Both refresh_token.js and auth.py compute credential file paths by traversing three directory levels above the scripts/ subdirectory. In the intended OpenClaw workspace deployment layout (workspace/skills/google-tasks/scripts/), this resolves to the workspace root — an intentional design convention for sharing credentials across workspace-level skills. However, this design means the skill unconditionally reads from outside its own directory tree. In the audit environment (/home/oc-exec/skill-under-test/scripts/), the path resolves to /home/ rather than the skill or user home directory. The shell-based refresh_token.sh correctly scopes paths to $SKILL_DIR, creating a documented inconsistency that suggests the JS and Python scripts were not reviewed with the same scrutiny. Users installing this skill outside the intended workspace structure may unknowingly expose unexpected directories to the credential search path.

MEDIUM create_task.sh sources config file in current shell context — tamper enables code execution -10

create_task.sh uses the bash source builtin to load google-tasks-config.sh, executing its contents with the same privileges as the calling script. The current config file contains only DEFAULT_LIST="Private" and is benign. However, any agent, skill, or process with write access to the skill directory can modify this file. The next time a user asks the agent to create a Google Task, the tampered config will execute arbitrary shell commands in the agent's session. This creates a persistent code execution vector activated by normal user behavior.

MEDIUM Node.js exec() called with OAuth URL constructed from credentials file content -7

refresh_token.js constructs an OAuth authorization URL from values read out of credentials.json (client_id, client_secret, redirect_uris) and passes it to child_process.exec() using template literal interpolation: exec(${start} "${authUrl}"). While URLSearchParams is used to build authUrl (encoding most shell-relevant characters), the exec() pattern with a string partially derived from an external file is inherently risky. A maliciously crafted credentials.json with redirect_uri values containing characters that survive URL encoding (e.g., backtick, $()) could potentially achieve shell command injection on platforms where the open/xdg-open command is invoked.

INFO auth.mjs present but content not captured — ESM auth entry point unverified -3

The file scripts/auth.mjs is present in the installed skill directory and recorded in the filesystem baseline with a known hash, but its source content was not included in the evidence collection. The skill already ships three other authentication implementations (auth.py, refresh_token.js, refresh_token.sh). This fourth unreviewed entry point represents residual audit surface that cannot be cleared.

INFO Four separate authentication runtime implementations shipped for a bash-first skill -5

The skill documentation describes itself as 'lightweight bash scripts' and the main scripts (get_tasks.sh, create_task.sh, delete_task.sh) are indeed pure bash. However, the repository ships four distinct authentication implementations: refresh_token.sh (bash), auth.py (Python), refresh_token.js (Node.js CJS), and auth.mjs (Node.js ESM). Each additional runtime increases the install footprint, maintenance burden, and audit surface without adding distinct functionality for users who already have bash available.

INFO Honeypot credential files read during audit window — attributed to audit harness operations -5

inotifywait and auditd records show .env, .ssh/id_rsa, .aws/credentials, .npmrc, .docker/config.json, and gcloud application_default_credentials.json were opened during the monitoring window. Two access batches are present: the first at audit timestamp 1771908249 (approximately 04:44:09), which precedes skill installation at 1771908267 by 18 seconds — consistent with the audit harness establishing a canary baseline before install. The second batch at 1771908272 follows the completion of all skill inspection EXECVE commands — consistent with post-install integrity verification. No write syscalls or outbound network transmissions to these paths were observed from skill-attributable processes. Canary integrity check confirms all files unmodified.

LOW Full read+write OAuth scope grants permanent access to all user task data -15

The skill requests https://www.googleapis.com/auth/tasks (full read+write), stores the resulting token in token.json, and auto-refreshes it indefinitely. A compromised token or agent session grants the ability to enumerate all task list names and contents (potentially revealing sensitive personal and professional schedules), create tasks that sync to calendar apps (social engineering vector), or permanently delete all tasks across all lists. The token persists silently across sessions with no expiry enforcement in the skill's own code.

LOW Config file sourcing creates cross-skill code execution chain and task deletion enables data destruction -13

Two compounding behavioral risks: (1) The shell source pattern means a malicious skill that can write files in the workspace could plant a backdoor in google-tasks-config.sh that executes whenever the user asks the agent to create a task — a highly natural and frequent operation. (2) delete_task.sh accepts a list name and task identifier as arguments; if argument validation is bypassed or the agent is manipulated into passing crafted identifiers, legitimate user tasks can be irreversibly deleted. These risks are individually low but meaningful in adversarial multi-skill deployments.