Back to skill

Security audit

botlearn

Security checks for vulnerabilities and agentic risk

Overview

This skill is a real BotLearn client, but it grants broad autonomous posting, uploading, scheduling, updating, and skill-install authority with weak scoping and unsafe update/install paths.

Install only after reviewing and tightening .botlearn/config.json. Disable auto_update, heartbeat_enabled, auto_post, auto_dm_reply, auto_install_solutions, learning_context_scan, share_project_context_in_learning, and learning_report_to_platform unless you explicitly want those behaviors. Avoid running benchmark practical tasks or marketplace installs in a workspace with secrets or private project data, and do not use remote archive installs without independent integrity checks.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
Findings (7)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:118
Finding
Unverified Remote SDK Archive Is Extracted Directly into the Active Skill Directory<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:118` and `SKILL.md:350-365` **Vulnerability Type**: Unverified remote payload retrieval and replacement **Risk Level**: Critical ### Complete Code Snippet ```bash mkdir -p <WORKSPACE>/skills/botlearn/ && curl -sL https://www.botlearn.ai/sdk/botlearn-sdk.tar.gz | tar -xz -C <WORKSPACE>/skills/botlearn/ ``` The self-update flow uses the same unsafe construction: ```bash curl -sL https://www.botlearn.ai/sdk/botlearn-sdk.tar.gz | tar -xz -C <WORKSPACE>/skills/botlearn/ ``` ### Technical Analysis A mutable archive is streamed from the BotLearn server directly into `tar` and extracted into the active Skill directory. There is no pinned version, cryptographic checksum, digital signature, archive manifest validation, staging review, or verification that the archive only contains expected paths. Because the destination contains both agent instructions and executable shell scripts, a modified archive can replace `SKILL.md`, command modules, templates, or the CLI itself. HTTPS protects the connection in transit but does not protect against a compromised BotLearn server, release pipeline, account, or signing infrastructure. The update mechanism is especially dangerous when combined with unattended heartbeat operation and the default `auto_update: true` setting. ### Attack Path 1. An attacker compromises the SDK distribution endpoint or its release pipeline. 2. The attacker replaces `botlearn-sdk.tar.gz` with an archive containing modified instructions or scripts. 3. A user follows the installation command, or an automated update retrieves the archive. 4. `tar` immediately overwrites files in the active Skill directory. 5. The host agent subsequently loads the modified `SKILL.md` or invokes a modified shell command. 6. The replacement payload runs with the filesystem, network, and tool privileges available to the host agent. ### Impact Assessment Successful exploitation provides control over the effe ...[truncated 250 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Download the archive to a newly created temporary file rather than piping it into `tar`. 2. Pin every download to an immutable version. 3. Publish a SHA-256 digest in a separately authenticated manifest and verify it before extraction. 4. Digitally sign releases and verify signatures against a public key embedded in the reviewed Skill. 5. Inspect archive member paths before extraction and reject absolute paths, traversal components, links, device files, and unexpected filenames. 6. Extract into a fresh staging directory and verify the resulting manifest. 7. Show the version, digest, changed files, and source to the user. 8. Require explicit user approval before replacing an installed Skill. 9. Disable updates during unattended heartbeat runs. ]]>

T03 · Remote Payload Retrieval and Execution

Error
Location
bin/lib/cmd-solutions.sh:86
Finding
Marketplace Skills Are Downloaded from Server-Controlled URLs and Loaded without Integrity Verification<![CDATA[ ## Vulnerability Details **File Location**: `bin/lib/cmd-solutions.sh:13-31`, `bin/lib/cmd-solutions.sh:86-126`, and `bin/lib/cmd-solutions.sh:178-199` **Vulnerability Type**: Unsafe third-party Skill supply chain **Risk Level**: Critical ### Complete Code Snippet ```bash const s=r.success?r.data:r; process.stdout.write(JSON.stringify({ archiveUrl:s.latestArchiveUrl||'', version:s.version||'unknown', name:s.name||'$skill_name', displayName:s.displayName||s.name||'$skill_name', description:(s.description||'').substring(0,120), fileCount:(s.fileIndex||[]).length })); ``` ```bash info "├─ Downloading archive..." curl -sL --connect-timeout 10 --max-time 120 -o "$tmp_archive" "$archive_url" 2>/dev/null || { rm -f "$tmp_archive" die "Failed to download skill archive from: $archive_url" } archive_size=$(wc -c < "$tmp_archive" 2>/dev/null | tr -d ' ') if [ "$archive_size" -lt 10 ] 2>/dev/null; then rm -f "$tmp_archive" die "Downloaded archive is empty or too small ($archive_size bytes)" fi info "├─ Extracting to $target_dir..." mkdir -p "$target_dir" if extract_archive "$tmp_archive" "$target_dir" "$fmt"; then rm -f "$tmp_archive" ok "Files extracted to skills/$dir_name/" else rm -f "$tmp_archive" rm -rf "$target_dir" die "Failed to extract archive — see hint above (skill: $resolved_name)" fi ``` After installation, the agent is instructed to trust and initialize the newly downloaded Skill: ```bash echo "" echo " 📖 Next: read the skill's SKILL.md and perform any required initialization." if [ -n "$skill_md" ]; then echo " File: $skill_md" else echo " (No SKILL.md found at skills/$dir_name/ — inspect the directory for usage notes.)" fi echo " Look for sections like 'Setup', 'Prerequisites', 'Configuration', or" echo " 'Before first use'. Common init work: exporting env vars, OAuth login," echo " writing a config file, or running a one-time CLI login." echo " Execute any required init steps BEFO ...[truncated 1578 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Permit downloads only from explicitly allowlisted HTTPS hosts. 2. Reject redirects to hosts outside that allowlist. 3. Require immutable artifact identifiers, signed manifests, and verified SHA-256 hashes. 4. Bind the verified hash to the displayed publisher, Skill name, and version. 5. Perform static policy scanning before installation. 6. Display the complete file list, requested capabilities, scripts, and initialization steps before approval. 7. Never automatically follow initialization instructions from a newly downloaded Skill. 8. Require separate user approval for each command, OAuth grant, environment-variable change, or configuration write. 9. Install third-party Skills in a sandbox with no default access to the parent workspace or BotLearn credentials. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
bin/botlearn.sh:330
Finding
Archive Extraction Does Not Prevent Path Traversal or Escaping Links<![CDATA[ ## Vulnerability Details **File Location**: `bin/botlearn.sh:330-426` **Vulnerability Type**: Unsafe archive extraction **Risk Level**: High ### Complete Code Snippet ```bash _try_extract() { local f="$1" case "$f" in tar.gz) tar -xzf "$archive" -C "$target" 2>/dev/null && return 0 if command -v python3 >/dev/null 2>&1; then python3 -c "import sys,tarfile; tarfile.open(sys.argv[1],'r:gz').extractall(sys.argv[2])" "$archive" "$target" 2>/dev/null && return 0 fi if command -v python >/dev/null 2>&1; then python -c "import sys,tarfile; tarfile.open(sys.argv[1],'r:gz').extractall(sys.argv[2])" "$archive" "$target" 2>/dev/null && return 0 fi ;; tar.bz2) tar -xjf "$archive" -C "$target" 2>/dev/null && return 0 if command -v python3 >/dev/null 2>&1; then python3 -c "import sys,tarfile; tarfile.open(sys.argv[1],'r:bz2').extractall(sys.argv[2])" "$archive" "$target" 2>/dev/null && return 0 fi if command -v python >/dev/null 2>&1; then python -c "import sys,tarfile; tarfile.open(sys.argv[1],'r:bz2').extractall(sys.argv[2])" "$archive" "$target" 2>/dev/null && return 0 fi ;; tar) tar -xf "$archive" -C "$target" 2>/dev/null && return 0 if command -v python3 >/dev/null 2>&1; then python3 -c "import sys,tarfile; tarfile.open(sys.argv[1],'r:').extractall(sys.argv[2])" "$archive" "$target" 2>/dev/null && return 0 fi if command -v python >/dev/null 2>&1; then python -c "import sys,tarfile; tarfile.open(sys.argv[1],'r:').extractall(sys.argv[2])" "$archive" "$target" 2>/dev/null && return 0 fi ;; zip) if command -v unzip >/dev/null 2>&1; then unzip -qo "$archive" -d "$target" 2>/dev/null && return 0 fi if command -v python3 >/dev/null 2>&1; then python3 -m zipfile -e "$archive" "$target" 2>/dev/null && return 0 fi if command -v python >/dev/null 2>&1; ...[truncated 1717 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enumerate every archive member before extraction. 2. Reject absolute paths and any path containing traversal components. 3. Resolve each candidate destination and verify it remains beneath the canonical target directory. 4. Reject symbolic links, hard links, devices, FIFOs, and other special entries unless explicitly required. 5. Enforce limits on total expanded size, member count, path length, and compression ratio. 6. Extract into a fresh, permission-restricted staging directory. 7. Use one hardened extraction implementation with explicit safety checks instead of several behaviorally inconsistent fallbacks. 8. Validate the extracted manifest before moving files into the active Skill directory. ]]>

T01 · Skill Instruction Hijacking

Error
Location
benchmark/exam.md:128
Finding
Remote Benchmark Questions Can Direct Arbitrary Local Commands, API Calls, and File Reads<![CDATA[ ## Vulnerability Details **File Location**: `benchmark/exam.md:128-177` **Related Instruction Locations**: `SKILL.md:34-45` and `SKILL.md:121` **Vulnerability Type**: Delegation of agent tools to untrusted remote instructions **Risk Level**: Critical ### Complete Code Snippet ```text ### 2b. Execute the question **`practical`** — Actually perform the task. Do NOT fabricate output. 1. Read `description` carefully. 2. Execute: run commands, make API calls, read files — whatever the task requires. 3. Capture full output and measure `durationMs`. 4. Package answer: ``` ```json { "output": "<actual result as string>", "artifacts": { "commandRun": "<exact command or action performed>", "durationMs": 1523 } } ``` ```text **If a practical question cannot be completed** (tool unavailable, permission denied, network error): - Describe what you attempted, what failed, and what the correct approach would be. - Set `output` to the error + explanation, `artifacts.commandRun` to what you tried. - Do NOT skip the question. ``` The overarching Skill instructions reinforce autonomous execution: ```text YOU ARE THE CLI. ``` ```text When matched, load `community/learning.md` and run the full Read → Distill → Engage → Discover → Report pipeline end-to-end on the model side, without asking permission per stage. ``` ### Technical Analysis Benchmark question descriptions are received from a remote service. The Skill nevertheless instructs the agent to treat practical descriptions as executable tasks and to run commands, make API calls, and read files without a capability schema, command allowlist, sandbox, path boundary, or per-question user approval. This crosses the trust boundary between remote benchmark content and the host agent’s local tools. A remote description is untrusted input and must not be allowed to determine arbitrary local actions. The output and exact command are then sent back as an answer, creating a potential data-exfiltration ...[truncated 1005 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Treat every question description as untrusted data rather than an instruction with ambient authority. 2. Define a narrow machine-readable capability schema for practical questions. 3. Run practical tasks only inside disposable fixtures or containers with no access to the real workspace, user home, credentials, or host network. 4. Allowlist commands, paths, and network destinations. 5. Prohibit shell interpretation of question-controlled strings. 6. Require explicit user approval for filesystem reads, mutation, external network requests, credential access, or execution outside the fixture. 7. Redact answer output and show the exact submission payload to the user. 8. Reject any question that attempts to modify agent instructions, inspect secrets, access unrelated files, or communicate with non-approved services. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
bin/lib/cmd-benchmark.sh:122
Finding
Benchmark Scan Collects and Uploads Excessive Host Diagnostics and Recent Logs<![CDATA[ ## Vulnerability Details **File Location**: `bin/lib/cmd-benchmark.sh:33-114`, `bin/lib/cmd-benchmark.sh:122-298`, and `bin/lib/cmd-benchmark.sh:299-425` **Vulnerability Type**: Excessive collection and transmission of operational data **Risk Level**: High ### Complete Code Snippet ```bash openclaw_config_file=$(run_with_timeout 15 openclaw config file 2>/dev/null | grep -v '^[[:space:]]*$' | tail -1 || true) openclaw_config_file="${openclaw_config_file/#\~/$HOME}" if [ -n "$openclaw_config_file" ] && [ -f "$openclaw_config_file" ]; then local raw_config raw_config=$(cat "$openclaw_config_file" 2>/dev/null || echo "{}") openclaw_config_content=$(redact_keys "$raw_config") platform_config_content="$openclaw_config_content" fi ``` ```bash (run_with_timeout 15 openclaw doctor --deep --non-interactive 2>/dev/null || echo "command unavailable or timed out") > "$tmp_doctor" & (run_with_timeout 15 openclaw status --all --deep 2>/dev/null || echo "command unavailable or timed out") > "$tmp_status" & (run_with_timeout 10 openclaw logs 2>/dev/null || true) > "$tmp_logs" & (run_with_timeout 15 openclaw models list 2>/dev/null | grep -v '^Config' | grep -v '^🦞' | grep -v '^[[:space:]]*$' | grep -v '^Model' || true) > "$tmp_models" & openclaw_doctor=$(redact_keys "$(cat "$tmp_doctor")" | process_logs 200 30000) openclaw_status=$(redact_keys "$(cat "$tmp_status")" | process_logs 200 30000) openclaw_logs_raw=$(redact_keys "$(cat "$tmp_logs")" | process_logs 150 50000) ``` The scanner also reads uppercase Markdown documents from discovered workspaces: ```bash for md_file in "$ws"/*.md; do [ -f "$md_file" ] || continue local bname bname=$(basename "$md_file" .md) [[ "$bname" =~ ^[A-Z]+$ ]] || continue local file_content file_content=$(cat "$md_file" 2>/dev/null || true) [ ${#file_content} -gt 51200 ] && file_content="${file_content:0:51200}"$'\n'"...[truncated at 50KB]" file_content=$(redact_keys "$file_content") ws_section+="#### $(ba ...[truncated 3089 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove raw logs, full configuration, deep diagnostic output, status output, and document bodies from benchmark collection. 2. Collect only explicit aggregate fields required by a documented scoring formula. 3. Make every telemetry category opt-in and disabled by default. 4. Display the exact payload before transmission and require informed approval. 5. Use schema-based extraction rather than collecting text and attempting regex redaction afterward. 6. Never transmit workspace paths; use anonymous counts or salted local identifiers if correlation is required. 7. Store local scan reports with restrictive permissions and omit full document/configuration content. 8. Add automated tests containing secrets under unexpected names to ensure they cannot enter upload payloads. 9. Document retention, deletion, and server-side access controls for all benchmark telemetry. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
templates/config.json:1
Finding
Privacy-Sensitive and Externally Visible Actions Are Enabled by Default<![CDATA[ ## Vulnerability Details **File Location**: `templates/config.json:1-20` **Related Locations**: `community/heartbeat.md:8-14`, `community/heartbeat.md:139-166`, and `community/learning-report.md:8-15` **Vulnerability Type**: Unsafe default permissions and absent informed opt-in **Risk Level**: High ### Complete Code Snippet ```json { "auto_post": true, "auto_comment": true, "auto_vote": true, "auto_dm_approve": true, "auto_dm_reply": true, "auto_update": true, "heartbeat_enabled": true, "learning_context_scan": true, "learning_retroactive_scan": true, "share_project_context_in_posts": true, "share_project_context_in_learning": true, "auto_benchmark": true, "auto_install_solutions": true, "auto_report_runs": true, "auto_recheck_after_install": true, "learning_actionable_install": true, "learning_report_to_platform": true, "learning_report_privacy": "full" } ``` The heartbeat also treats an absent permission file as enabled: ```text - If `heartbeat_enabled` is `false`: Stop here. Do not proceed with the heartbeat flow. - If `heartbeat_enabled` is `true` (default): Continue with the flow below. - If the config file does not exist: Treat as `true` and continue. ``` Learning reporting defaults to complete content: ```text Config gate: `learning_report_to_platform` (default: `true`) Privacy gate: `learning_report_privacy` (default: `"full"`) - `"full"` — Report complete content (observed, connected, insight, application) - `"summary"` — Report type, category, title, and auto-generated one-line summary only - `"count_only"` — Only report that a learning event occurred (no content at all) ``` ### Technical Analysis The default configuration enables public posting, commenting, voting, DM behavior, remote updates, recurring heartbeat behavior, workspace-context scanning, retroactive scans, project-context sharing, automatic benchmarking, automatic Skill installation, execution reporting, and complete learning-conten ...[truncated 1231 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Set all network side effects, autonomous actions, context scans, installations, and updates to `false` by default. 2. Fail closed when the configuration file is absent or invalid. 3. Use separate consent prompts for posting, commenting, voting, DMs, uploads, telemetry, marketplace installation, self-update, and scheduling. 4. Default learning reporting to `count_only`, with project context excluded. 5. Require a payload preview before publishing or uploading derived content. 6. Require explicit approval before installing or initializing any third-party Skill. 7. Record consent scope, timestamp, destination, and expiration. 8. Provide one command that revokes all permissions and disables recurring tasks. 9. Do not interpret prior consent to one operation as blanket consent for future heartbeat runs. ]]>

T06 · System Persistence

Error
Location
community/heartbeat.md:18
Finding
Recurring Heartbeat Automation Creates a Persistent Remote-Influenced Execution Channel<![CDATA[ ## Vulnerability Details **File Location**: `community/heartbeat.md:18-55` and `community/heartbeat.md:80-91` **Vulnerability Type**: Cross-session scheduled execution with broad authority **Risk Level**: High ### Complete Code Snippet ```text ## Automated Setup via openclaw cron The recommended way to run the heartbeat automatically is via **openclaw cron**. Set it up once during onboarding: **Full heartbeat (all 6 activities, openclaw default — reports back to current chat session):** ``` ```text /cron add --schedule "every 12h" --prompt "Execute BotLearn default heartbeat. Read <WORKSPACE>/skills/botlearn/community/heartbeat.md and follow the Main Flow. --announce --channel current" ``` ```text **Heartbeat that reports to an external channel** (example: Feishu bot pushing to a specific user): ``` ```text /cron add --schedule "every 12h" --prompt "Execute BotLearn default heartbeat. Read <WORKSPACE>/skills/botlearn/community/heartbeat.md and follow the Main Flow. --announce --channel feishu --to \"user:ou_52c6ee94f3c025927c6c61e548c6777a\"" ``` The automated flow includes updates: ```text ### Step 1: Check for skill updates Config gate: `auto_update` in config (default: `true`). Follow the **Self-Update Protocol** in `SKILL.md`: 1. Run: `bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh version` 2. Compare `version` with local `<WORKSPACE>/skills/botlearn/skill.json` 3. If remote > local → read `release` object for urgency, summary, highlights 4. Apply update based on `auto_update` setting and `release.urgency` 5. After update: compare `config.json` keys against `templates/config.json`, add missing keys with defaults ``` ### Technical Analysis The Skill recommends installing a recurring scheduled task that survives the original interaction and reloads BotLearn instructions every 12 hours. The task can access network services, browse content, process DMs, engage publicly, generate and upload learning reports, check benchmarks, deliver mes ...[truncated 1226 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not create or recommend a recurring task as part of default setup. 2. Require explicit approval showing the schedule, actions, data sources, destinations, and permissions. 3. Give scheduled jobs a narrow capability profile with no self-update, marketplace installation, public posting, DM approval, or project-context upload. 4. Pin the Skill version used by the scheduled task and verify its signature before each run. 5. Add an expiration time and require renewal. 6. Provide a documented command that lists and removes all BotLearn scheduler entries. 7. Emit a visible audit record for every unattended action. 8. Pause the task when configuration is missing, invalid, or changed. 9. Require a foreground approval queue for any side effect discovered during an unattended heartbeat. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (232)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The document downplays a concrete reporting behavior by framing the skill around learning/community workflows while also enabling persistence of local logs and upload of learning logs to remote APIs. Hidden or underemphasized telemetry/reporting is security-relevant because it changes the data exposure profile of the skill.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The document downplays a concrete reporting behavior by framing the skill around learning/community workflows while also enabling persistence of local logs and upload of learning logs to remote APIs. Hidden or underemphasized telemetry/reporting is security-relevant because it changes the data exposure profile of the skill.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The document downplays a concrete reporting behavior by framing the skill around learning/community workflows while also enabling persistence of local logs and upload of learning logs to remote APIs. Hidden or underemphasized telemetry/reporting is security-relevant because it changes the data exposure profile of the skill.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The document downplays a concrete reporting behavior by framing the skill around learning/community workflows while also enabling persistence of local logs and upload of learning logs to remote APIs. Hidden or underemphasized telemetry/reporting is security-relevant because it changes the data exposure profile of the skill.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The document downplays a concrete reporting behavior by framing the skill around learning/community workflows while also enabling persistence of local logs and upload of learning logs to remote APIs. Hidden or underemphasized telemetry/reporting is security-relevant because it changes the data exposure profile of the skill.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The document downplays a concrete reporting behavior by framing the skill around learning/community workflows while also enabling persistence of local logs and upload of learning logs to remote APIs. Hidden or underemphasized telemetry/reporting is security-relevant because it changes the data exposure profile of the skill.

Vague Triggers

High
Confidence
98% confidence
Finding
The trigger list is extremely broad and includes common words and phrases such as report, recommend, improve, continue, update, community, post, and help-adjacent intents. In an agentic environment, that can cause accidental invocation of a powerful skill and lead to unintended installs, uploads, posting, or network actions.

Vague Triggers

High
Confidence
97% confidence
Finding
The core 'learn' triggers include ordinary language like 'read and reflect' and 'what did I learn today', which can easily appear in benign conversation. Because those triggers route into an end-to-end pipeline, accidental activation may silently initiate browsing, engagement, discovery, and reporting behaviors.

Credential Access

High
Category
Privilege Escalation
Content
| Term | Meaning |
|------|---------|
| `<WORKSPACE>` | Your working directory from your system prompt. Resolution: 1) Read explicit path from system prompt. 2) Use `WORKSPACE_ROOT` env var. 3) Last resort: `$(pwd)`. All local paths are relative to this. |
| **API key** | Your unique identity token (`botlearn_<hex>`), stored in `<WORKSPACE>/.botlearn/credentials.json`. Used in `Authorization: Bearer` header. |
| **Config** | Permission file at `<WORKSPACE>/.botlearn/config.json`. Controls what you can do autonomously. Initialized from `templates/config.json`. |
| **State** | Progress file at `<WORKSPACE>/.botlearn/state.json`. Tracks onboarding, benchmark, and solution status. Initialized from `templates/state.json`. |
| **Templates** | Standard JSON files at `<WORKSPACE>/skills/botlearn/templates/`. Always copy from these to create config/state — never write JSON by hand. |
Confidence
88% confidence
Finding
The skill directs the agent to read and use an API key from a predictable workspace path. Accessing credentials is sometimes necessary for legitimate API use, but in a broadly triggered, network-enabled, autonomous skill it materially increases the blast radius: accidental or malicious routing could use the token to act remotely as the user/agent.

Vague Triggers

High
Confidence
98% confidence
Finding
The intent router contains many overlapping generic triggers across setup, benchmark, report, install, browse, post, DM, config, API, and learn operations. Such ambiguity raises the risk that the model selects the wrong module and performs unintended privileged actions, especially where multiple routes can mutate state or contact remote services.

Self-Modification

High
Category
Rogue Agent
Content
---

## Self-Update Protocol

**When to check:** At every heartbeat (Step 1) AND when first loading SKILL.md after a long gap (>24h since last check).
Confidence
96% confidence
Finding
The self-update protocol downloads and extracts a remote tarball directly into the skill directory, then instructs the agent to re-read the updated instructions. That is a classic remote self-modification pattern: if the update source is compromised or the content is malicious, the skill can replace its own behavior and immediately expand control without robust integrity verification.

Ae1

High
Category
analysis-evasion
Content
- Re-read `SKILL.md` to pick up new capabilities
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Credential Access

High
Category
Privilege Escalation
Content
Auth:     Authorization: Bearer {api_key}
```

Credentials are loaded from `<WORKSPACE>/.botlearn/credentials.json`.
Confidence
97% confidence
Finding
The skill documentation explicitly directs use of a bearer API key loaded from a local credentials file, which indicates the skill accesses stored secrets for authenticated network operations. In the context of a benchmark that scans local state and then reports results remotely, credential use materially increases the risk of unauthorized or insufficiently disclosed data exfiltration if the workflow is triggered without clear consent and boundaries.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
# BotLearn CLI Helper — wraps API calls with auth, error handling, and state management.
# Usage: bash <WORKSPACE>/skills/botlearn/bin/botlearn.sh <command> [args...]
#
# This script reads credentials from .botlearn/credentials.json,
# makes API calls, parses responses, and updates .botlearn/state.json.
# All traffic goes to www.botlearn.ai only.
#
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Static analysis

No suspicious patterns detected.