T03 · Remote Payload Retrieval and Execution
- Location
README.md:25- Finding
Remote Installer Is Downloaded and Executed Without Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to do what it says for Linear todos, but its install guidance and credential/profile-file handling create review-worthy risk.
Review before installing. Prefer an already installed uv or a package-manager install instead of curl | sh, use a dedicated minimal Linear API key, prefer LINEAR_API_KEY over saved plaintext config, set LINEAR_TIMEZONE explicitly if you do not want USER.md read, and add cron entries only if you intentionally want scheduled runs.
README.md:25Remote Installer Is Downloaded and Executed Without Verification
src/linear_todos/config.py:169Linear API Key Is Persisted in Plaintext Using a Non-Atomic Permission Sequence
src/linear_todos/config.py:11Skill Automatically Searches for and Reads an OpenClaw USER.md File
pyproject.toml:20Dependency Installation Is Not Reproducibly Pinned
The explicit shell pipe chaining pattern (curl ... | sh) is dangerous because it removes the opportunity for users to inspect what will execute and turns a network response directly into code execution. In the context of a source-execution skill, normalizing this pattern increases supply-chain and workstation compromise risk for users following setup instructions.
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Or with Homebrew
brew install uv
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
### 3. Get a Linear API Key
1. Go to [linear.app/settings/api](https://linear.app/settings/api)
2. Create a new API key (name it "Linear Todos" or whatever you prefer)
3. Copy the key — you'll need it for the next step
### 4. Run Setup Wizard
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
The skill is explicitly source-executing and documents capabilities to read environment variables, access files, write configuration, make network requests, and invoke shell commands, but it does not declare any explicit tool scope restrictions such as permissions or allowed-tools. That creates an avoidable trust gap: consumers must rely on documentation rather than enforceable platform constraints, so future code changes could expand behavior without corresponding policy controls.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
### Recommended Security Practices
1. **Use a dedicated API key:** Create a separate Linear API token with minimal scope for this skill. Revoke it if you uninstall or stop using the skill.
2. **Prefer environment variables:** Set `LINEAR_API_KEY` in your shell instead of running `setup` — no plaintext file is created.
3. **Audit the code:** Review `src/linear_todos/api.py` to verify HTTP destinations before first use.
4. **Run initial setup in isolation:** If unsure, run the skill in a container/VM for the first setup to inspect behavior.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Natural Date Examples:
uv run python main.py create "Task" --date "tomorrow"
uv run python main.py create "Task" --date "Friday"
uv run python main.py create "Task" --date "next Monday"
uv run python main.py create "Task" --date "in 3 days"
The metadata explicitly states that the config file may store the Linear API key in plaintext JSON on disk, even though protected with 0o600 permissions and only written during manual setup. This is a real credential persistence risk: any local compromise of the user account, backups, accidental file exposure, or unsafe file handling could disclose the API key and enable unauthorized access to the user's Linear workspace.
"sensitive": true,
"autoWrite": false,
"permissions": "0o600",
"note": "Config file is written ONLY during manual 'setup' command with 0o600 permissions (user read/write only). Environment variables can be used instead to avoid persisted state."
},
"network": {
"destinations": ["https://api.linear.app"],
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
# Linear Todos Cron Jobs - EXAMPLE ONLY
# ======================================
# ⚠️ WARNING: This file contains EXAMPLE cron entries. It does NOT
# automatically modify your crontab. Adding these is a manual
# user action. Review before using.
#
# To add these jobs, run: crontab -e
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# automatically modify your crontab. Adding these is a manual
# user action. Review before using.
#
# To add these jobs, run: crontab -e
# Then paste the entries you want (modify paths first!)
SHELL=/bin/bash
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# automatically modify your crontab. Adding these is a manual
# user action. Review before using.
#
# To add these jobs, run: crontab -e
# Then paste the entries you want (modify paths first!)
SHELL=/bin/bash
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# automatically modify your crontab. Adding these is a manual
# user action. Review before using.
#
# To add these jobs, run: crontab -e
# Then paste the entries you want (modify paths first!)
SHELL=/bin/bash
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
class LinearAPI:
"""Client for the Linear GraphQL API."""
API_URL = "https://api.linear.app/graphql"
def __init__(self, api_key: Optional[str] = None, config=None):
"""Initialize the Linear API client.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
class LinearAPI:
"""Client for the Linear GraphQL API."""
API_URL = "https://api.linear.app/graphql"
def __init__(self, api_key: Optional[str] = None, config=None):
"""Initialize the Linear API client.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
class LinearAPI:
"""Client for the Linear GraphQL API."""
API_URL = "https://api.linear.app/graphql"
def __init__(self, api_key: Optional[str] = None, config=None):
"""Initialize the Linear API client.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if variables:
payload["variables"] = variables
response = requests.post(
self.API_URL,
headers=headers,
json=payload,
The README recommends piping a remote script directly into a shell, which executes unreviewed code fetched over the network. If the remote host, CDN path, or transport is compromised, users could run attacker-controlled code on their machine during installation.
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Or with Homebrew
brew install uv
This markdown file documents a setup flow that saves settings to ~/.config/linear-todos/config.json, immediately after collecting a Linear API key. The README does not warn users that credentials or other sensitive configuration may be written to disk, which is a privacy and system-safety relevant behavior for markdown under the missing user warnings rule.
Skill requests more permissions than appear necessary for its stated functionality. Review if elevated access is justified.
}
**Permissions:** Created with user-only read/write (0o600).
### Setup Behavior
During interactive setup, the wizard temporarily sets `LINEAR_API_KEY` in the process environment to validate the API key before saving. This only occurs during the setup session and is not persisted beyond the setup process.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
docker run -it --rm -v $(pwd):/app python:3.12 bash
cd /app && pip install -e . && python main.py setup
This TOML manifest file is in scope for vague-trigger review. The description says the skill is "a powerful todo management system" with "smart date parsing," but it does not define any explicit invocation phrases, activation boundaries, or exclusions, making the skill scope broad and underspecified from a trigger/activation perspective.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
The inline note says secrets.choice used below for security scan compliance, but the function immediately below also imports random and never uses it. This is a documentation/code contradiction about implementation intent, even though the security impact is low because greeting selection does in fact use secrets.choice later.
The skill searches upward from its own directory and reads workspace-level USER.md files to infer a timezone, which expands its data access beyond what is necessary for todo management. Even though it only extracts a timezone-like value, this is still an undocumented cross-boundary read of user/workspace content and can violate least-privilege expectations in an agent skill.
No suspicious patterns detected.