T03 · Remote Payload Retrieval and Execution
- Location
realtime_asr.py:186- Finding
Unpinned Third-Party Model Code Is Trusted and Executed
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to provide the advertised transcription workflow, but it records and stores sensitive audio-derived text while relying on broad permissions and unpinned executable dependencies/model code.
Review before installing. Only use this skill where recording microphone or system audio is appropriate and consented to, avoid sensitive meetings or private media, and expect transcripts plus summaries to be saved locally. Prefer a dedicated virtual environment, pinned dependency versions, and a pinned or verified model that does not require trust_remote_code before running it.
realtime_asr.py:186Unpinned Third-Party Model Code Is Trusted and Executed
realtime_asr.py:21Unpinned Python Dependencies Are Installed into the Active Environment
summary_prompt.py:30Audio Transcript Content Can Inject Instructions into the Summarization Prompt
archiver.py:52Unescaped LLM and Transcript Content Can Inject YAML and Markdown
skill.yaml:35Stop Command Trusts an Unvalidated Mutable PID File
The skill records microphone or system audio and archives transcripts, but the description does not provide a clear privacy warning or consent expectations. This increases the risk of users enabling capture without understanding that sensitive speech or system audio may be transcribed, summarized, and stored on disk.
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).
Press Ctrl+C in the terminal, or:
kill $(cat .tmp/asr.pid 2>/dev/null) 2>/dev/null; rm -f .tmp/asr.pid
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).
check_deps: "python3 realtime_asr.py --check-deps"
start_blackhole: "python3 realtime_asr.py --source blackhole --output .tmp/transcript.txt --state .tmp/asr.pid"
start_mic: "python3 realtime_asr.py --source mic --output .tmp/transcript.txt --state .tmp/asr.pid"
stop: "kill $(cat .tmp/asr.pid 2>/dev/null) 2>/dev/null; rm -f .tmp/asr.pid"
read_transcript: "cat .tmp/transcript.txt 2>/dev/null || echo 'No transcript available'"
paths:
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
check_deps: "python3 realtime_asr.py --check-deps"
start_blackhole: "python3 realtime_asr.py --source blackhole --output .tmp/transcript.txt --state .tmp/asr.pid"
start_mic: "python3 realtime_asr.py --source mic --output .tmp/transcript.txt --state .tmp/asr.pid"
stop: "kill $(cat .tmp/asr.pid 2>/dev/null) 2>/dev/null; rm -f .tmp/asr.pid"
read_transcript: "cat .tmp/transcript.txt 2>/dev/null || echo 'No transcript available'"
paths:
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
check_deps: "python3 realtime_asr.py --check-deps"
start_blackhole: "python3 realtime_asr.py --source blackhole --output .tmp/transcript.txt --state .tmp/asr.pid"
start_mic: "python3 realtime_asr.py --source mic --output .tmp/transcript.txt --state .tmp/asr.pid"
stop: "kill $(cat .tmp/asr.pid 2>/dev/null) 2>/dev/null; rm -f .tmp/asr.pid"
read_transcript: "cat .tmp/transcript.txt 2>/dev/null || echo 'No transcript available'"
paths:
The README promotes real-time capture, transcription, summarization, and archival of microphone or system audio, but it does not prominently warn users that sensitive conversations, media, notifications, or third-party audio may be recorded and stored on disk. In this context, the omission can lead to unintended collection and retention of personal or confidential data, especially because the skill supports system-wide audio capture and automatic archiving.
The trigger list in metadata includes a bare stop phrase ("停止" / "stop") without requiring that this skill already be active or that the command be scoped to transcription. In an agent environment, generic stop words are common in unrelated conversations and can unintentionally terminate recording or invoke follow-on logic, making accidental activation plausible.
The workflow directs the operator to read the full transcript, send it to an LLM for summarization, and archive the complete transcript alongside the summary. This creates a natural-language data leakage path because potentially sensitive spoken content is intentionally propagated to additional processing and persistent storage without minimization.
The trigger table explicitly maps a generic "停止" / "stop" utterance to stopping the process, summary generation, and archival. Because the action chain includes handling sensitive transcript data after stopping, an ambiguous phrase can cause unintended workflow execution and privacy-impacting data processing.
This tool captures microphone or system audio and writes transcripts to disk, but the usage/help text does not provide a clear privacy warning about recording sensitive conversations, meetings, credentials spoken aloud, or copyrighted media. In this context, the skill's core purpose is surveillance-adjacent data capture, so lack of explicit notice and consent guidance makes the privacy risk more significant.
Dynamic import() can load arbitrary modules at runtime, bypassing static analysis and potentially importing malicious code.
missing = []
for pkg in REQUIRED_DEPS:
try:
__import__(pkg.replace('-', '_'))
except ImportError:
missing.append(pkg)
return missing
A transcription utility does not need to self-install Python packages during normal operation, so this capability is broader than its core purpose. Runtime dependency installation introduces unnecessary supply-chain exposure and can lead to execution of package-provided code if the environment or package source is compromised.
Several printed messages and CLI outputs are hard-coded in Chinese, while the file otherwise uses English descriptions and does not indicate that the skill is intended only for Chinese-speaking users. This creates a language-policy issue because the skill imposes a locale on users without opt-in or justification.
The script can invoke pip at runtime to install packages, which expands its capabilities beyond transcription into code acquisition and execution from package repositories. Even though the package list is hard-coded and subprocess.run is used safely without shell=True, installing and importing packages on demand increases supply-chain risk and can execute untrusted package install-time code.
print(f" [{i}/{total}] 安装 {pkg}... {desc}")
print(f" ⏳ pip3 install {pkg} ", end="", flush=True)
try:
result = subprocess.run(
[sys.executable, '-m', 'pip', 'install', '--quiet', pkg],
capture_output=True, text=True, timeout=300
)
Executing a subprocess to perform pip installation grants the skill the ability to modify its runtime environment and fetch executable content, which is an elevated action unrelated to live audio transcription. In context, this is not overtly malicious, but it materially increases the attack surface through package supply-chain abuse.
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.
while not self.stop_event.is_set():
try:
chunk = self.audio_queue.get(timeout=0.2)
except queue.Empty:
continue
The skill explicitly records audio, summarizes the resulting transcript, and archives it as Markdown, but the manifest does not provide a strong, explicit warning about retention and sensitive data handling. Because the skill can capture microphone or system audio, silent archival materially increases the risk of storing confidential conversations without informed user consent.
The trigger phrase "停止" is extremely broad and can easily appear in ordinary conversation, causing unintended activation of stop behavior. In a transcription skill, accidental stopping can interrupt capture and trigger downstream summarization and archival of sensitive content without a clearly deliberate invocation.
The English trigger phrase "transcribe" is too generic to distinguish from normal user requests about transcription. This can cause the skill to activate unexpectedly and begin recording or handling transcript data when the user may have only been asking a question, increasing privacy and consent risks.
The README defines activation phrases in both Chinese and English, but it does not explain whether the skill expects one language, supports both equally, or how language selection is determined. This can create a locale-policy ambiguity because language behavior is prescribed without explicit user choice or opt-in.
The generated Markdown content hard-codes Chinese headings ("摘要" and "完整转录") for every archive file. This imposes a specific language choice on users without any visible option, opt-in, or documented reason that the skill is region-specific.