Back to skill

Security audit

abe-freeride

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent model-management purpose, but its service and credential documentation conflict while it can send an API key to a HeyBossAI endpoint and persistently change OpenClaw model settings.

Review before installing. Use only a limited SkillBoss key you are comfortable sending to api.heybossai.com, back up ~/.openclaw/openclaw.json before running mutating commands, and do not rely on the README’s OpenRouter key instructions until the publisher makes the service identity consistent. Prefer pinned install dependencies and avoid running installation as root/admin.

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)

T09 · Insecure Skill Coding Practices

Warning
Location
main.py:25
Finding

Credential Transmission to a Service Inconsistent with the Primary Documentation

Content
View full analysis

Vulnerability Details

File Location: main.py:25, 43-79; README.md:49-61, 260-278; SKILL.md:14-21
Vulnerability Type: Credential disclosure caused by inconsistent service identity and insufficiently transparent credential handling
Risk Level: Medium

Vulnerable Code

python
SKILLBOSS_API_URL = "https://api.heybossai.com/v1/pilot"
python
def get_api_key() -> Optional[str]:
    """Get SkillBoss API key from environment or OpenClaw config."""
    # Try environment first
    api_key = os.environ.get("SKILLBOSS_API_KEY")
    if api_key:
        return api_key

    # Try OpenClaw config
    if OPENCLAW_CONFIG_PATH.exists():
        try:
            config = json.loads(OPENCLAW_CONFIG_PATH.read_text())
            # Check env section
            api_key = config.get("env", {}).get("SKILLBOSS_API_KEY")
            if api_key:
                return api_key
        except (json.JSONDecodeError, KeyError):
            pass

    return None


def fetch_all_models(api_key: str) -> list:
    """Fetch available AI models from SkillBoss API Hub."""
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }

    try:
        response = requests.post(
            SKILLBOSS_API_URL,
            headers=headers,
            json={"type": "chat", "prefer": "price", "limit": 30, "include_docs": True},
            timeout=30
        )
        response.raise_for_status()
        data = response.json()
        return data.get("data", {}).get("result", [])
    except requests.RequestException as e:
        print(f"Error fetching models: {e}")
        return []

The conflicting primary README instructions state:

markdown
### 1. Get a Free OpenRouter Key

Go to [openrouter.ai/keys](https://openrouter.ai/keys) → Create account → Generate key

### 2. Set Your Key

```bash
export OPENROUTER_API_K
...[truncated 3051 chars]
Remediation
View remediation

Remediation Suggestions

  1. Make the service identity consistent across README.md, SKILL.md, CLI output, configuration variable names, and source code.
  2. If OpenRouter is the intended backend, use its documented API endpoint and read OPENROUTER_API_KEY.
  3. If SkillBoss/HeyBossAI is required, explicitly disclose that the bearer key will be sent to https://api.heybossai.com before requesting or using the credential.
  4. Require explicit user confirmation before the first credential-bearing request, particularly when loading the key from an existing OpenClaw configuration.
  5. Store and retrieve the credential through a dedicated secret store rather than parsing a broad configuration file where feasible.
  6. Restrict the API key to model-catalog access and the minimum required account permissions.
  7. Validate that redirects are not followed to unrelated hosts for authenticated requests, or strip the Authorization header on cross-origin redirects.
  8. Document key revocation and rotation procedures in case users previously supplied a credential without understanding the destination.

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Mutable and Unpinned Installation Dependencies

Content
View full analysis

Vulnerability Details

File Location: requirements.txt:1; setup.py:9-11; README.md:39-43
Vulnerability Type: Supply-chain exposure through unpinned executable dependencies
Risk Level: Medium

Vulnerable Code

requirements.txt contains:

text
requests>=2.31.0

setup.py repeats the open-ended dependency constraint:

python
install_requires=[
    "requests>=2.31.0",
],

The documented installation workflow also retrieves a mutable latest release:

bash
npx clawhub@latest install free-ride
cd ~/.openclaw/workspace/skills/free-ride
pip install -e .

Technical Analysis

The installation process does not reproduce a fixed, reviewed dependency set:

  • requests>=2.31.0 permits future releases not present during this audit.
  • No lockfile or package hashes verify the integrity of the resolved Python dependency and its transitive dependencies.
  • npx clawhub@latest explicitly downloads and executes whichever release is currently tagged as latest.
  • Package installation occurs with the invoking user's privileges.

This does not prove that the current requests or ClawHub packages are malicious. It creates a supply-chain vulnerability in which a compromised upstream account, registry, package release, or dependency resolution path can replace reviewed behavior after publication of the Skill.

Attack Path

  1. An attacker compromises an upstream package publisher, distribution account, package registry, or release pipeline.
  2. The attacker publishes a malicious version satisfying requests>=2.31.0, compromises a transitive dependency, or replaces the release referenced by clawhub@latest.
  3. A user follows the documented installation instructions after the malicious release becomes available.
  4. The package manager resolves and downloads the mutable malicious version because no exact version or integrity hash prevents it.
  5. Installation hooks or impo ...[truncated 1077 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin every direct dependency to an exact reviewed version instead of using >=.
  2. Generate a lockfile that includes the complete transitive dependency graph.
  3. Require cryptographic package hashes, for example through a hash-locked requirements file and pip install --require-hashes.
  4. Replace npx clawhub@latest with a specific audited version.
  5. Document the expected package registries and avoid untrusted or implicit extra indexes.
  6. Add automated dependency vulnerability and provenance checks to the release process.
  7. Periodically update dependencies through reviewed changes rather than resolving arbitrary future versions during user installation.
  8. Advise users not to install the package with administrator or root privileges.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (17)

Tainted flow: 'headers' from os.environ.get (line 68, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · main.py (reported line 74)May include surrounding context.

python
}

    try:
        response = requests.post(
            SKILLBOSS_API_URL,
            headers=headers,
            json={"type": "chat", "prefer": "price", "limit": 30, "include_docs": True},

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

The documented behavior does not align cleanly with the declared purpose: it mixes SkillBoss branding with OpenRouter references and introduces extra operational capabilities such as package installation and a watcher component. Behavior/description mismatches are dangerous because they hide side effects and external dependencies, making it easier for a user or agent to approve actions they do not fully understand.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 5)May include surrounding context.

md
### Stop paying for AI. Start riding free.

[![ClawHub Downloads](https://api.clawhub-badge.xyz/badge/free-ride/downloads.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Current Installs](https://api.clawhub-badge.xyz/badge/free-ride/installs-current.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Stars](https://api.clawhub-badge.xyz/badge/free-ride/stars.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Version](https://api.clawhub-badge.xyz/badge/free-ride/version.svg)](https://clawhub.ai/skills/free-ride)

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 6)May include surrounding context.

md
### Stop paying for AI. Start riding free.

[![ClawHub Downloads](https://api.clawhub-badge.xyz/badge/free-ride/downloads.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Current Installs](https://api.clawhub-badge.xyz/badge/free-ride/installs-current.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Stars](https://api.clawhub-badge.xyz/badge/free-ride/stars.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Version](https://api.clawhub-badge.xyz/badge/free-ride/version.svg)](https://clawhub.ai/skills/free-ride)

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 7)May include surrounding context.

md
### Stop paying for AI. Start riding free.

[![ClawHub Downloads](https://api.clawhub-badge.xyz/badge/free-ride/downloads.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Current Installs](https://api.clawhub-badge.xyz/badge/free-ride/installs-current.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Stars](https://api.clawhub-badge.xyz/badge/free-ride/stars.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Version](https://api.clawhub-badge.xyz/badge/free-ride/version.svg)](https://clawhub.ai/skills/free-ride)

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 8)May include surrounding context.

md
### Stop paying for AI. Start riding free.

[![ClawHub Downloads](https://api.clawhub-badge.xyz/badge/free-ride/downloads.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Current Installs](https://api.clawhub-badge.xyz/badge/free-ride/installs-current.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Stars](https://api.clawhub-badge.xyz/badge/free-ride/stars.svg)](https://clawhub.ai/skills/free-ride)
[![ClawHub Version](https://api.clawhub-badge.xyz/badge/free-ride/version.svg)](https://clawhub.ai/skills/free-ride)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README markets 'free AI' and automatic model management without clearly disclosing that prompts, code, and related request data will be sent to OpenRouter-hosted remote models. In a coding-agent context, this can expose sensitive source code, secrets, or proprietary data to a third-party service without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README markets 'free AI' and automatic model management without clearly disclosing that prompts, code, and related request data will be sent to OpenRouter-hosted remote models. In a coding-agent context, this can expose sensitive source code, secrets, or proprietary data to a third-party service without informed consent.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

The README instructs users to run npx clawhub@latest install free-ride, which executes remote package code at install time without pinning to a vetted version. If the upstream package is compromised or a malicious update is published, users could execute attacker-controlled code during installation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README tells users to place an OpenRouter API key in an environment variable or application config but gives no warning about secret handling, shell history exposure, config file permissions, or avoiding committing credentials. This increases the chance of accidental credential leakage or insecure storage.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill instructs the agent to read environment variables, write to ~/.openclaw/openclaw.json, install packages, and restart services, but it declares no explicit tool scope or permission boundaries. That creates an authorization gap where a user or orchestrator cannot clearly tell that the skill needs env, filesystem, process execution, and likely network access before it is invoked.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger language is broad enough to fire on generic requests about free AI, model switching, rate limits, or reducing costs, which can cause the skill to activate outside its narrow configuration purpose. In context, that is risky because activation can lead to config edits, environment handling, package installation, and gateway restarts when the user may have only asked for advice or comparison information.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · main.py (reported line 25)May include surrounding context.

python
# Constants
SKILLBOSS_API_URL = "https://api.heybossai.com/v1/pilot"
OPENCLAW_CONFIG_PATH = Path.home() / ".openclaw" / "openclaw.json"
CACHE_FILE = Path.home() / ".openclaw" / ".freeride-cache.json"
CACHE_DURATION_HOURS = 6

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · main.py (reported line 74)May include surrounding context.

python
}

    try:
        response = requests.post(
            SKILLBOSS_API_URL,
            headers=headers,
            json={"type": "chat", "prefer": "price", "limit": 30, "include_docs": True},

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill writes directly to ~/.openclaw/openclaw.json and can change the user's primary and fallback model configuration without any confirmation, backup, or preview. In a tool that manages AI routing and auth profiles, silent config mutation is risky because it can unexpectedly redirect future traffic to external providers and break or alter user security expectations.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The dependency is specified as requests>=2.31.0, which allows any future version and does not guarantee a reproducible or reviewed installation. This is risky because builds may pull in vulnerable or incompatible releases over time, and the skill appears to manage API/model integrations where requests is likely used for network access.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.31.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
88% confidence
Finding

The manifest does not pin the requests version, so it is impossible to verify whether the installed package includes fixes for known advisories affecting some releases. In a skill that likely makes outbound API calls to manage models and configuration, an affected requests version could expose credentials or weaken transport/request safety depending on how the library is used.

Content

No source excerpt is available for this finding.