other
- Location
scripts/search_client.py:133- Finding
Bundled Client Exposes Undeclared Network and Data-Processing Capabilities
- Content
View full analysis
Vulnerability Details
File Location:
scripts/search_client.py:133-174, 258-269, 303-342; declared scope inSKILL.md:3, 27-31
Vulnerability Type: Excessive capability scope and undisclosed data transmission
Risk Level: MediumThe Skill declares scholarly paper and academic-source search as its purpose. However, its canonical client also exposes general web search, Tavily search, arbitrary URL extraction, Perplexity/Sonar queries, multi-source retrieval, and AI synthesis.
python def cmd_tavily(args: argparse.Namespace) -> None: api_key = get_api_key() body: dict[str, Any] = { "query": args.query, "max_results": args.count, "search_depth": args.depth, } if args.topic: body["topic"] = args.topic if args.time_range: body["time_range"] = args.time_range if args.include_answer: body["include_answer"] = True data = aisa_post(api_key, "/tavily/search", body) print_results(data, "Tavily Search") def cmd_extract(args: argparse.Namespace) -> None: api_key = get_api_key() urls = [u.strip() for u in args.urls.split(",")] data = aisa_post(api_key, "/tavily/extract", {"urls": urls}) if "results" in data and isinstance(data["results"], list): for r in data["results"]: print(f"\n{'='*60}") print(f" URL: {r.get('url', 'Unknown')}") print(f"{'='*60}") content = r.get("raw_content", "") print(content[:3000] if content else "(no content)") else: print(json.dumps(data, indent=2)) def cmd_sonar(args: argparse.Namespace) -> None: api_key = get_api_key() endpoint_map = { "sonar": "/sonar", "sonar-pro": "/sonar-pro", "sonar-reasoning-pro": "/sonar-reasoning-pro", "sonar-deep-research": "/sonar-deep-research", } endpoint = endpoint_map.get(args.model, "/sonar ...[truncated 2807 chars]- Remediation
View remediation
Remediation Suggestions
- Restrict this Skill’s parser and runtime to the
scholarcommand and/scholar/search/scholarendpoint. - Move web search, URL extraction, Sonar, Tavily, and multi-source synthesis into separately declared Skills that users must select explicitly.
- Update
SKILL.mdif broader capabilities are intentionally retained, listing every data type transmitted and all relevant remote-processing operations. - Require explicit confirmation before processing user-supplied URLs or resubmitting provider responses for synthesis.
- Minimize synthesis payloads by sending only the fields needed to generate the summary rather than complete provider responses.
- Apply command-level authorization or allowlists so an agent loading a scholarly-search Skill cannot silently access unrelated paid endpoints.
- Restrict this Skill’s parser and runtime to the
