Back to skill

Security audit

ClickUp Skill

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed ClickUp API helper with broad account-changing powers, but the behavior matches its project-management purpose and shows no hidden or deceptive activity.

Install only if you are comfortable letting this skill use a ClickUp API token with the same workspace permissions as that token. Prefer the narrowest token/account practical, verify workspace/list/task IDs before mutating or deleting data, and do not rely on the advertised sales, retainer, or dedicated custom-field management claims without checking the actual commands.

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 (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:8
Finding
Unpinned Third-Party Python Dependency## Vulnerability Details **File Location**: `SKILL.md:8-10` **Mirrored Location**: `clickup/SKILL.md:8-10` **Vulnerability Type**: Unpinned dependency and non-reproducible package installation **Risk Level**: Medium **Vulnerable Code**: ```yaml dependencies: - python3 - pip:requests ``` ### Technical Analysis The Skill declares the `requests` package without an exact version, package hash, lock file, or explicit trusted package index. Consequently, the installed code may change between installations even when the Skill package itself remains unchanged. This creates a supply-chain risk if the configured package index is compromised, a malicious package is introduced through dependency resolution, or a future package release is compromised. The audit found no evidence that the current `requests` package is malicious; the vulnerability is the absence of reproducible and integrity-verified dependency resolution. ### Attack Path 1. An attacker compromises a package release, a transitive dependency, or the package index used by the installation environment. 2. The Skill environment resolves `pip:requests` without enforcing a reviewed version or cryptographic hash. 3. Pip downloads and installs the attacker-controlled package content. 4. Malicious package code executes during installation or when `requests` is imported by `scripts/clickup_client.py`. 5. The code operates with the privileges of the installation process or Agent runtime and may access the ClickUp token available in `CLICKUP_API_TOKEN`. ### Impact Assessment Successful exploitation could permit arbitrary Python code execution with the privileges of the Skill installer or Agent process. Depending on the runtime environment, this may expose environment variables—including the ClickUp API token—local files accessible to the process, and ClickUp resources authorized by the token. The affected scope is not inherently limited to ClickUp because compromised ...[truncated 34 chars]
Remediation
## Remediation Suggestions 1. Pin `requests` and every transitive dependency to reviewed versions. 2. Maintain dependencies in a lock file generated from a controlled build environment. 3. Require cryptographic hashes during installation, such as with `pip install --require-hashes`. 4. Configure an explicit trusted package index rather than relying on ambient pip configuration. 5. Run dependency vulnerability and provenance checks in CI. 6. Keep both copies of `SKILL.md` synchronized so that the nested package cannot retain an unsafe dependency declaration. 7. Perform dependency updates through a reviewed process that regenerates and verifies the lock file and hashes.

T09 · Insecure Skill Coding Practices

Note
Location
scripts/clickup_client.py:27
Finding
Authenticated Network Requests Lack Timeouts## Vulnerability Details **File Location**: `scripts/clickup_client.py:27-40` and `scripts/clickup_client.py:224-237` **Mirrored Location**: `clickup/scripts/clickup_client.py:27-40` and `clickup/scripts/clickup_client.py:224-237` **Vulnerability Type**: Unbounded network wait and denial of service **Risk Level**: Low **Vulnerable Code**: ```python def _request(self, method: str, endpoint: str, **kwargs) -> Dict: """Make authenticated request to ClickUp API.""" url = f"{self.BASE_URL}{endpoint}" if "headers" not in kwargs: kwargs["headers"] = self.headers try: response = requests.request(method, url, **kwargs) response.raise_for_status() return response.json() if response.content else {} except requests.exceptions.RequestException as e: return {"error": str(e), "status_code": getattr(e.response, 'status_code', None)} ``` ```python def _request_v3(self, method: str, endpoint: str, **kwargs) -> Dict: """Make authenticated request to ClickUp API v3.""" url = f"https://api.clickup.com/api/v3{endpoint}" if "headers" not in kwargs: kwargs["headers"] = self.headers try: response = requests.request(method, url, **kwargs) response.raise_for_status() return response.json() if response.content else {} except requests.exceptions.RequestException as e: return {"error": str(e), "status_code": getattr(e.response, 'status_code', None)} ``` ### Technical Analysis Both request wrappers call `requests.request()` without a connect or read timeout. The Requests library does not impose a default timeout, so a connection or response that stalls can block indefinitely. The exception handler does not mitigate this issue because no timeout is configured to trigger `requests.exceptions.Timeout`. This affects every ClickUp API operation routed through the version 2 and v ...[truncated 980 chars]
Remediation
## Remediation Suggestions 1. Apply bounded connect and read timeouts to every request: ```python kwargs.setdefault("timeout", (5, 30)) response = requests.request(method, url, **kwargs) ``` 2. Catch `requests.exceptions.Timeout` separately and return a clear timeout error. 3. Use a configured `requests.Session` to centralize transport behavior. 4. Implement bounded exponential backoff for transient failures and HTTP 429 responses. 5. Retry only operations for which repetition is safe, or use idempotency protections for write requests. 6. Impose a maximum retry count and overall request deadline. 7. Apply the same correction to both duplicated client files. 8. Add tests simulating stalled connections, slow responses, connection timeouts, and exhausted retry limits.
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (69)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The code substantially matches many declared capabilities: multi-workspace access via team/workspace IDs, CRUD for spaces/folders/lists/tasks, time tracking and timers with billable flag, docs/page management via API v3, task dependencies/linking, and advanced reporting with pagination and subtask inclusion. However, several declared enterprise/agency-specific capabilities are not actually implemented as dedicated behavior. In particular, there is no custom field CRUD, no client/project tracking logic, no sales pipeline logic, no retainer or recurring billing features, and no real automatic workspace switching mechanism beyond manually passing IDs to methods. Because multiple specific declared core capabilities are absent, the description overstates what the code does, creating a material description-behavior mismatch.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The code substantially matches many major parts of the description: multi-workspace access via team/workspace IDs, CRUD for spaces/folders/lists/tasks, reporting with automatic pagination and forced subtask inclusion, time tracking/timers with billable flag support, docs/pages via API v3, and task dependencies/linking. However, several declared headline capabilities are absent or only implied: there is no custom-field CRUD; no dedicated client/project tracking layer; no sales pipeline/prospect tracking; no retainer or recurring billing management; and no real automatic workspace-switching mechanism beyond manually passing IDs per call. Because these are material advertised capabilities rather than minor omissions, the description overstates what the code actually does.

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
python scripts/clickup_client.py get_teams
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected