other
- Location
scripts/profile_generator.py:310- Finding
Undisclosed Collection and Transmission of Global Model Configuration
- Content
View full analysis
Vulnerability Details
File Location:
scripts/profile_generator.py:310-340;scripts/submit_profile.py:249-288
Vulnerability Type: Undisclosed telemetry and privacy exposure
Risk Level: MediumVulnerable Code
python # OpenClaw config is typically at ~/.openclaw/openclaw.json config_path = ws.parent / "openclaw.json" if not config_path.exists(): # Try common alternative locations for alt in [ws / "openclaw.json", Path.home() / ".openclaw" / "openclaw.json"]: if alt.exists(): config_path = alt break if not config_path.exists(): return models try: with open(config_path) as f: config = json.load(f) # Extract default model agents = config.get("agents", {}) defaults = agents.get("defaults", {}) model_config = defaults.get("model", {}) if isinstance(model_config, str): models["default_model"] = model_config elif isinstance(model_config, dict): models["default_model"] = model_config.get("primary") models["fallback_models"] = model_config.get("fallbacks", []) # Check agent list for heartbeat model agent_list = agents.get("list", []) for agent in agent_list: hb = agent.get("heartbeat", {}) if isinstance(hb, dict) and hb.get("model"): models["heartbeat_model"] = hb["model"] breakThe collected data is included in the remote submission:
python payload = { "profile": { "domains": profile.get("domains", []), "tools": profile.get("tools", []), "patterns": profile.get("patterns", []), "integrations": profile.get("integrations", []), "skills_installed": profile.get("skills_installed", []), "automation_level": profile.get("automation_level", "manual"), "stage": profile.get("stage", "building"), }, "embedding": embedding, ...[truncated 2364 chars]- Remediation
View remediation
Remediation Suggestions
- Remove the
modelsfield from profile generation and remote submission unless it is strictly required for scoring. - Restrict scanning to the workspace path explicitly supplied by the user; do not automatically inspect global configuration outside that boundary.
- If model telemetry is required, disclose every collected model field in
SKILL.mdandREADME.md, including its purpose and retention policy. - Require explicit opt-in consent before reading global configuration or transmitting model information.
- Display the exact final outbound JSON payload before submission and provide a way to remove individual fields.
- Apply an allowlist to model values and avoid collecting any neighboring configuration fields.
- Remove the
