Back to skill

Security audit

Platform Healthcheck

Security checks for vulnerabilities and agentic risk

Overview

This health-check skill is mostly coherent, but it automatically reads API keys from other skill config files and sends them to platform endpoints without clear opt-in or full disclosure.

Install only if you are comfortable with this skill making outbound requests to the listed platforms and using ClawQuests or The Colony API keys from existing local skill configs during a normal check. Prefer running with test or least-privilege tokens, review data/platforms.json before use, and avoid default authenticated checks unless you trust the endpoints and redirect behavior.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/healthcheck.py:174
Finding
Automatic Credential Access and Redirect-Based Credential Disclosure<![CDATA[ ## Vulnerability Details **File Location**: `scripts/healthcheck.py:61-69`, `scripts/healthcheck.py:174-190`; credential sources and destinations are configured in `data/platforms.json:3-23` **Vulnerability Type**: Automatic access to credentials owned by other Skills and insufficient destination controls for authenticated requests **Risk Level**: Medium ### Vulnerable Code ```python def load_auth_token(config_path, key): """Load an auth token from a config file.""" expanded = os.path.expanduser(config_path) try: with open(expanded) as f: data = json.load(f) return data.get(key, "") except (OSError, json.JSONDecodeError, KeyError): return "" ``` ```python # Auth check (separate request) auth_url = platform.get("auth_url") auth_config = platform.get("auth_config") auth_key = platform.get("auth_key") if auth_url and auth_config and auth_key: token = load_auth_token(auth_config, auth_key) if token: auth_header = platform.get("auth_header", "Authorization") auth_prefix = platform.get("auth_prefix", "Bearer ") auth_req = Request(auth_url, headers={ "User-Agent": "PlatformHealthCheck/1.0", auth_header: f"{auth_prefix}{token}", }) try: auth_resp = urlopen(auth_req, timeout=TIMEOUT) result.auth_status = "OK" if auth_resp.status < 400 else "FAIL" except HTTPError as e: result.auth_status = "FAIL" if e.code in (401, 403) else "OK" except Exception: result.auth_status = "ERROR" ``` Relevant configuration: ```json { "name": "ClawQuests", "url": "https://clawquests.com/api/v1/quests?limit=1", "auth_url": "https://clawquests.com/api/v1/agents/me", "auth_header": "Authorization", "auth_prefix": "Bearer ", "auth_config": "~/.clawdbot/skills/clawquests/config.json", "auth_key": "api_key", "category": "bounties" }, { "name": "The Colony", "url": "https://the ...[truncated 3649 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Make authenticated checks explicitly opt-in** - Add a flag such as `--check-auth`. - Perform connectivity checks without opening credential files unless the user explicitly enables authentication testing. 2. **Disclose credential behavior** - Document every credential path, key name, and receiving hostname in `SKILL.md`. - Warn users that authentication checks transmit reusable credentials over the network. 3. **Enforce an authentication destination allowlist** - Maintain a fixed mapping between each credential source and its permitted HTTPS hostname. - Reject configuration entries whose `auth_url` hostname does not exactly match the approved service. - Do not permit user-info components, nonstandard schemes, or untrusted ports. 4. **Prevent unsafe authenticated redirects** - Disable redirects for requests carrying credentials, or implement a custom redirect handler. - If redirects are necessary, only follow them when the destination remains HTTPS and has the exact same hostname and approved port as the original URL. - Strip all authentication headers before any cross-origin redirect. 5. **Reduce credential privileges** - Use dedicated, read-only health-check tokens where platforms support them. - Avoid reusing tokens capable of state-changing account operations. - Provide clear token revocation and rotation guidance. 6. **Restrict credential-file access** - Prefer credentials explicitly supplied by the user through a narrowly scoped configuration. - Validate resolved paths against an approved set rather than accepting arbitrary paths from platform configuration. - Check that credential files have restrictive filesystem permissions. 7. **Separate uptime and authentication results** - Treat authentication checks as a distinct operation so ordinary availability monitoring does not require access to unrelated Skill secrets. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (39)

Lp3

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding
The skill advertises and invokes a Python health-check script that performs network operations and likely writes history/output, but the manifest declares no explicit tool scope such as permissions or allowed-tools. This creates a capability-transparency gap: reviewers and runtimes cannot easily constrain or reason about what the skill may access, increasing the risk of unintended network access or file modification when the skill is executed.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill states that it checks authentication status across 20+ external platforms, but the user-facing description does not clearly warn that real API keys or credentials may be sent to third-party endpoints. This can lead operators to run the skill without understanding that secrets will be exercised against many services, potentially triggering account actions, logging of credential-associated activity, rate limits, or disclosure through misconfiguration.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
"results": [
      {
        "name": "Bankr",
        "url": "https://api.bankr.bot/agent/prompt",
        "category": "defi",
        "status": "UP",
        "http_code": 403,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "Basescan",
        "url": "https://api.basescan.org/api?module=proxy&action=eth_blockNumber",
        "category": "blockchain",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
      {
        "name": "CoinGecko",
        "url": "https://api.coingecko.com/api/v3/ping",
        "category": "data",
        "status": "UP",
        "http_code": 200,
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

Detected: suspicious.insecure_tls_verification, suspicious.install_untrusted_source

HTTPS certificate verification is disabled.

Warn
Code
suspicious.insecure_tls_verification
Location
scripts/healthcheck.py:102

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
data/history.json:176

Install source points to URL shortener or raw IP.

Warn
Code
suspicious.install_untrusted_source
Location
data/platforms.json:50