other
Warning
- Location
- scripts/hivemind.py:361
- Finding
- Undisclosed Transmission of the Installed Skill Inventory<![CDATA[ ## Vulnerability Details **File Location**: `scripts/hivemind.py:361-369`, `scripts/hivemind.py:741-762`, and `SKILL.md:151-158, 202` **Vulnerability Type**: Capability inventory disclosure and inaccurate privacy documentation **Risk Level**: Medium The `suggest` command enumerates installed OpenClaw skills from the local filesystem and sends the complete list to the configured Supabase backend. Although this data is necessary for the current server-side matching design, the privacy documentation does not include installed skills in its list of transmitted data and states that no filesystem scanning occurs. ### Vulnerable Code ```python def list_installed_skills() -> list[str]: """List skills installed in the current workspace.""" skills_dir = os.path.expanduser("~/.openclaw/workspace/skills") if not os.path.isdir(skills_dir): return [] return [ d for d in os.listdir(skills_dir) if os.path.isfile(os.path.join(skills_dir, d, "SKILL.md")) and not d.startswith("_") ] ``` The resulting inventory is transmitted by the `suggest` command: ```python async def cmd_suggest(ctx: AppContext, args: argparse.Namespace) -> None: my_skills = list_installed_skills() if not my_skills: print("No skills detected. Install some skills first!") return print(f"Your skills: {', '.join(my_skills)}") print() if getattr(args, "dry_run", False): print("[dry-run] Would query the hivemind backend for plays matching these skills.") print("[dry-run] No data submitted. Agent hash:", ctx.agent_hash) print("[dry-run] Backend:", ctx.supabase_url) return async with httpx.AsyncClient(timeout=20.0) as client: result = await api_post_rpc( client, ctx, "suggest_plays", { "agent_skills": my_skills, "match_count": args.limit, }, ) ``` The conflicting privacy ...[truncated 2543 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Explicitly list installed skill names under the `SKILL.md` “What data is sent” section. 2. Replace “No file system scanning” with a precise statement that the Skill enumerates names of installed Skill directories but does not read their contents beyond checking for `SKILL.md`. 3. Request explicit confirmation before the first inventory submission and display the exact list and destination. 4. Add an option allowing users to select which skill names may be submitted. 5. Consider performing matching locally after downloading a public play index, eliminating the need to disclose the full inventory. 6. If server-side matching is retained, investigate privacy-preserving representations and avoid persisting raw inventory data in backend logs. 7. Document retention, access controls, and deletion policies for submitted capability information. ]]>
