Back to skill

Security audit

Ezer Multi-Agent Report Auditor

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a legitimate Ezer audit API wrapper, but it needs review because it can send an optional bearer token and audit request data to any environment-configured URL, including plain HTTP.

Install only if you control the Ezer API endpoint configuration. Use HTTPS for any non-local endpoint, keep EZER_API_BASE_URL fixed to the intended Ezer server, avoid sharing broad or long-lived bearer tokens, and treat the token as exposed if it has been used with an untrusted or plaintext endpoint.

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

Error
Location
scripts/invoke_ezer_api.py:14
Finding

Bearer Token Can Be Transmitted to an Arbitrary or Unencrypted Endpoint

Content
View full analysis
Dict[str, str]: headers = {"Content-Type": "application/json"} token = os.environ.get("EZER_BEARER_TOKEN", "").strip() if token: headers["Authorization"] = f"Bearer {token}" return headers def request_json(method: str, url: str, payload: Dict[str, Any] | None = None) -> Tuple[int, Dict[str, Any]]: data = None if payload is not None: data = json.dumps(payload, ensure_ascii=False).encode("utf-8") req = urllib.request.Request(url=url, method=method, data=data, headers=make_headers()) ``` ```python base_url = os.environ.get("EZER_API_BASE_URL", "").strip().rstrip("/") if not base_url: print("Missing required env: EZER_API_BASE_URL", file=sys.stderr) return 2 ``` ```python create_url = f"{base_url}/api/tasks" status, created = request_json("POST", create_url, create_payload) if status != 202: print(json.dumps({"error": "create_task_failed", "status": status, "response": created}, ensure_ascii=False), file=sys.stderr) return 1 task_id = created.get("task_id") if not task_id: print(json.dumps({"error": "missing_task_id", "response": created}, ensure_ascii=False), file=sys.stderr) return 1 result_url = f"{base_url}/api/tasks/{task_id}/result" deadline = time.time() + args.timeout_sec while True: status, result = request_json("GET", result_url) ``` The project documentation explicitly permits an unencrypted endpoint: ```markdown - `EZER_API_BASE_URL` example: `http://127.0.0.1:8008` - `EZER_BEARER_TOKEN` optional if API auth is disabled ``` ### Technical Analysis `EZER_API_BASE_URL` is read directly from the environment and used as the destination fo ...[truncated 2636 chars]
Remediation
View remediation
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 (3)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares runtime capabilities that imply environment-variable access and outbound network use, but it does not define an explicit tool scope such as permissions or allowed-tools. That creates an authorization gap: the skill can reach an API endpoint and potentially use bearer-token authentication without clearly constraining or documenting what external access is permitted.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The markdown examples specify lang as zh-CN and the run command hard-codes --lang zh-CN, which can imply the skill expects or defaults to a specific language/locale. The file does not state that users may choose another locale or that the Chinese locale is required for a justified region-specific purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code sends user-supplied fields such as code, period, year, and lang to a remote API via a POST request, but the file provides no explicit warning comment, docstring, or user-facing notice that data will be transmitted off-process. Although the script logs errors, those messages do not disclose the network transmission behavior before it occurs.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.