T09 · Insecure Skill Coding Practices
- Location
docker-compose.yml:49- Finding
Hardcoded Vexa, Zoom OAuth, Database, and Transcription Credentials
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a real meeting assistant, but it needs Review because it ships reusable-looking credentials, exposes local services broadly, and stores highly sensitive meeting data without strong controls.
Install only after replacing all bundled tokens and secrets, binding services to localhost or an isolated Docker network, confirming participant consent, disabling or reviewing automatic chat replies for sensitive meetings, and setting retention/encryption rules for recordings, screenshots, transcripts, summaries, and Docker volumes. Avoid medical use unless your environment has appropriate privacy and compliance controls.
docker-compose.yml:49Hardcoded Vexa, Zoom OAuth, Database, and Transcription Credentials
docker-compose.yml:45Vexa Management API Exposed Beyond Loopback with Published Authentication Tokens
scripts/meeting_monitor.py:51Plaintext Retention of Meeting Passcodes, Medical Data, Screenshots, Transcripts, and API Tokens
docker-compose.yml:19Unpinned Python Packages and Mutable Container Images Execute Unreviewed Dependency Updates
The README explicitly describes a bot that joins meetings, captures audio and chat, and performs transcription, yet provides no visible warning about participant consent, jurisdictional recording laws, or organizational privacy requirements. In a meeting-assistant context, silent or inadequately disclosed recording is especially dangerous because it can collect sensitive business, medical, or personal conversations from multiple parties at once.
The documentation shows persistent storage of recordings, screenshots, and transcripts in a local session-data directory without any explicit warning about retention, access control, or handling of sensitive content. Because this skill is intended for live meetings, including possible doctor-patient communication, retained artifacts can expose regulated or highly confidential information if operators are unaware of storage behavior or fail to secure it properly.
The declared description presents a full remote-meeting assistant with autonomous meeting participation, live transcription, vision analysis, chat interaction, and platform integration. The supplied code does not implement those behaviors. Instead, it is a helper module for post-hoc or in-loop prompt generation: it loads session artifacts from local storage, packages screenshots/transcripts/metadata, and creates textual prompts for another agent to perform analysis and summarization. Medical support is partially aligned at the prompt/specification level, but the core claimed capabilities—joining meetings, monitoring them as a bot, recording, live STT, direct vision analysis, and meeting chat interaction—are absent from this code chunk. This is a material description-to-behavior mismatch.
The code supports part of the declared monitoring/recording workflow: it captures screenshots, records system audio, and transcribes audio using Whisper. However, the declared description centers on an active remote meeting assistant that can join meetings autonomously across Zoom/Teams/Meet, provide real-time assistance, analyze visuals via Claude, and interact with participants in meeting chat. None of those core assistant/integration features appear in this code chunk. Instead, this is a local recorder/monitor orchestrator with CLI controls and offline or near-offline transcription. The mismatch is material because several headline capabilities in the description are absent, while the implemented behavior is narrower and more passive.
The supplied code only implements offline/local audio transcription workflows using Whisper CLI and ffmpeg. It processes existing audio files, chunk directories, or recent portions of an audio file, and writes text transcripts. There is no code for connecting to Zoom/Teams/Google Meet, joining meetings as a bot, handling meeting chat, recording meetings from conferencing platforms, performing screenshot or vision analysis, or providing interactive real-time assistant behavior. While speech-to-text is part of the declared description, the implemented scope here is much narrower and materially different from the claimed end-to-end remote meeting AI assistant.
The declared description presents a full-featured remote meeting bot with conferencing integrations, transcription, vision analysis, and chat interaction. The supplied code does not implement any meeting-platform integration or assistant behavior. It only exposes an HTTP proxy that forwards requests to a local upstream server and rewrites the multipart 'model' field to a fixed Whisper model. While this could be a supporting component for transcription infrastructure, by itself its primary purpose is substantially narrower and materially different from the declared end-user skill description.
Allowing the agent to send chat into a live meeting creates a direct channel for model-generated content to leave the agent context and reach third parties. In a meeting assistant handling transcripts and medical context, that raises the risk of accidental disclosure, unsafe advice, impersonation of the user, or leakage of internal reasoning into participant-visible chat.
---
name: meeting-assistant
description: "Zoom/Teams/Meet 远程会议AI助手。Use when: user asks to join a meeting, monitor a meeting, record a meeting, assist in a medical consultation, help doctor-patient communication, transcribe meeting audio, analyze meeting screenshots, send chat in meeting, or provide real-time meeting assistance. The agent joins the meeting autonomously as a bot, performs real-time speech-to-text, vision analysis via Claude AI, and participants can communicate with the agent directly via meeting chat."
---
# Meeting Assistant — 远程会议智能助手
The skill is explicitly designed to collect, process, and retain highly sensitive meeting data, including medical consultation content, transcripts, screenshots, and chat records. Persistent storage of this material materially increases exposure to privacy breaches, insider misuse, unauthorized access, and regulatory noncompliance, especially when combined with external AI processing.
The skill prominently describes transcript, screenshot, chat, and summary analysis by Claude but does not clearly warn users that this meeting content is sent to an external AI provider for processing. In the context of medical consultations and private meetings, that omission creates serious privacy, consent, compliance, and third-party disclosure risk.
The documented trigger logic is broad enough to respond to ordinary meeting messages, especially common punctuation, polite Chinese prompts, or generic references to AI. In a live meeting, that can cause the bot to ingest and act on unintended participant content, generate unsolicited responses, and expand collection of sensitive discussion without clear user intent.
Automatic reading, summarizing, and logging of all chat, transcript, and visual meeting content creates a broad surveillance surface and captures bystander data that participants may not expect to be retained. In sensitive meetings, this can convert ephemeral conversation into long-lived records that are easier to leak, misuse, or subpoena.
The documented output structure stores full transcripts, screenshots, bot suggestions, and AI-generated summaries in a persistent directory, creating a concentrated repository of sensitive meeting intelligence. If the host system, container, or shared workspace is compromised, these files would provide rich confidential information to an attacker.
Silently logging participant messages for later analysis creates an exfiltration-adjacent privacy issue because content from uninvolved or non-consenting participants is collected and may be relayed into downstream AI analysis or stored artifacts. In this skill's context, the bot joins external meetings and processes potentially medical or confidential conversations, making passive capture substantially more dangerous.
| Starts with `请` or `请问` | `请问这个怎么处理` | AI response |
| Medical keywords (medical mode) | `剂量` `处方` | AI explanation |
Messages from other participants that don't match triggers are silently logged
for context in the analysis loop.
## Analysis Loop
The documented chat-send capability enables the agent to transmit AI-generated content directly into a live meeting chat, which can leak sensitive meeting context to unintended recipients if triggered incorrectly or used in the wrong meeting. In a real-time assistant that processes transcripts and screenshots, outbound messaging materially raises disclosure risk.
print(f"Bot created: id={bot['id']}, status={bot['status']}")
### Send Chat Message
```python
# IMPORTANT: field name is "text", NOT "message"
requests.post(f"{VEXA}/bots/google_meet/pmn-eatb-cyf/chat",
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
Status lifecycle: requested → joining → awaiting_admission → active → completed | failed
DELETE /bots/google_meet/pmn-eatb-cyf
Response 200: {"message": "Stop request accepted and is being processed."}
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
DELETE /bots/google_meet/pmn-eatb-cyf
Response 200: {"message": "Stop request accepted and is being processed."}
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.
// Request — IMPORTANT: field is "text", NOT "message"
{"text": "Hello from the bot!"}
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
This makes the **bot** share its screen to the meeting. It does NOT capture
what the user is sharing.
#### DELETE /bots/{platform}/{id}/screen — Stop Bot's Screen Share
---
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
| Method | Description |
|---|---|
| `join(url, bot_name=None, language=None)` | Parse URL + POST /bots |
| `leave()` | DELETE /bots/{platform}/{id} |
| `status()` | GET /bots/status |
| `send_chat(message)` | POST /bots/{p}/{id}/chat with `{"text": message}` |
| `read_chat()` | GET /bots/{p}/{id}/chat → list of messages |
The setup guide embeds live secrets directly in documentation, including an admin API key, a current user token, and Zoom client credentials. In a meeting-assistant skill, these credentials could let an attacker control bot actions, mint tokens, access meeting integrations, or impersonate the service, making the exposure materially dangerous rather than merely informational.
This section exposes admin credentials directly in documentation and provides operational instructions for privileged /admin/ endpoints without redaction or safety guidance. Because this skill can autonomously join and monitor meetings, compromise of admin credentials could enable unauthorized control over bots, token issuance, and access to highly sensitive communications workflows.
The troubleshooting guide discloses sensitive admin and user authentication material, including an admin API key (openclaw-meeting-bot) and a concrete user API token in diagnostic examples. In a meeting-assistant skill, these secrets are especially dangerous because they can grant access to meeting control APIs, user management, bot operations, and potentially sensitive meeting data such as transcripts or chat activity.
The diagnostic example includes a concrete API key in a request to a local meeting service endpoint, effectively publishing a bearer-style secret. In the context of a meeting assistant, possession of such a key may allow unauthorized querying of meetings, bot state, transcripts, or other sensitive collaboration data, making the exposure more dangerous than a generic sample token leak.
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).
us
python agent_tool.py chat "What was just prescribed?"
python agent_tool.py transcript
python agent_tool.py screenshot
python agent_tool.py stop
Usage as Python:
from agent_tool import MeetingAssistantTool
tool = MeetingAssistantTool()
result = tool.start_assistant("https://zoom.us/j/123", mode="medical")
Usage with Anthropic tool_use:
from agent_tool import tool_definitions
tools = tool_definitions() # pass to client.messages.create(tools=tools)
"""
import json
import os
import signal
import subprocess
import sys
import time
from datetime import datetime
from pathlib import Path
SKILL_DIR = Path(__file__).resolve().parent.parent
CONFIG_PATH = SKILL_DIR / "config.json"
STATE_FILE = SKILL_DIR / ".assistant_state.json"
DAEMON_LOG = SKILL_DIR / ".assistant_daemon.log"
def _load_config() -> dict:
with open(CONFIG_PATH, encoding="utf-8") as f:
return json.load(f)
def _ok(data: dict) -> dict:
return {"status": "ok", **data}
def _err(message: str
The daemon is launched with a full copy of the parent environment, which may include API keys, cloud credentials, tokens, proxy settings, and other secrets unrelated to this skill. Since the child process joins meetings, performs transcription, and may process untrusted remote content, broad environment inheritance unnecessarily expands the blast radius if the bot process or its dependencies are compromised.
stderr=subprocess.STDOUT,
start_new_session=True,
cwd=str(SKILL_DIR),
env={**os.environ},
)
except Exception as e:
return _err(f"Failed to start assistant: {e}")
Detected: suspicious.exposed_secret_literal