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

Content
View full analysis

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
View 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

Content
View full analysis

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
View 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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 44)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 49)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 54)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 99)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 109)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 112)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 126)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 132)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 138)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 144)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 151)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 154)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 159)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 166)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 169)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 172)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 185)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 192)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 204)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 209)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 213)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 221)May include surrounding context.

md
python scripts/clickup_client.py get_teams

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 232)May include surrounding context.

md
python scripts/clickup_client.py get_teams