T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/local_wespeaker_service.py:38- Finding
Unauthenticated WeSpeaker Service Permits Path Traversal and State-Changing Requests
- Content
View full analysis
Path: return self.profiles_dir / f"{profile_name}.npy" def meta_path(self, profile_name: str) -> Path: return self.profiles_dir / f"{profile_name}.json" def save_embeddings(self, profile_name: str, embeddings: np.ndarray) -> None: path = self.embedding_path(profile_name) np.save(path, embeddings.astype(np.float32)) meta = { "profile_name": profile_name, "sample_count": int(embeddings.shape[0]), "updated_at": __import__("time").strftime("%Y-%m-%dT%H:%M:%S%z"), } write_json(self.meta_path(profile_name), meta) def clear_profile(self, profile_name: str) -> None: for path in [self.embedding_path(profile_name), self.meta_path(profile_name)]: if path.exists(): path.unlink() ``` ```python class Handler(BaseHTTPRequestHandler): runtime: WeSpeakerRuntime = None shutdown_event: threading.Event = None def _read_json(self) -> dict: length = int(self.headers.get("Content-Length", "0") or "0") if length <= 0: return {} body = self.rfile.read(length).decode("utf-8") return json.loads(body or "{}") def do_POST(self): try: payload = self._read_json() if self.path == "/enroll": ...[truncated 4204 chars]- Remediation
View remediation
