T06 · System Persistence
- Location
videoarm_local_whisper/setup.py:58- Finding
Automatic Installation of a Persistent macOS LaunchAgent
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a coherent video-analysis tool, but it has review-worthy risks around persistent setup, broad cleanup deletion, shared temporary memory, and uploading audio to configurable endpoints.
Install only if you are comfortable with a video tool that can download remote media, process local videos, write analysis logs, spawn sub-agents, and optionally upload audio to a configured transcription endpoint. Review .env and proxy settings carefully, avoid running the local Whisper auto-start setup unless you want a background service, and use videoarm-clean cautiously because its deletion scope includes shared OpenClaw temp images.
videoarm_local_whisper/setup.py:58Automatic Installation of a Persistent macOS LaunchAgent
SKILL.md:22Predictable Shared Memory File Allows Agent-State Poisoning
videoarm_cli/videoarm_clean.py:48Cleanup Command Deletes Images Not Owned by VideoARM
videoarm_cli/videoarm_audio.py:37Unrestricted Transcription Endpoint Can Receive Private Audio and API Credentials
The code honors HTTPS_PROXY/https_proxy from the environment and may send the Authorization bearer token plus uploaded audio through an attacker-controlled proxy. In a tool that handles potentially sensitive media, this can enable credential capture and interception of transcript content if the runtime environment is untrusted or manipulated.
tracer.log("api_call", model=model, base_url=base_url, proxy=bool(proxy))
with open(tmp, "rb") as audio_file:
resp = requests.post(
f"{base_url}/audio/transcriptions",
headers={"Authorization": f"Bearer {api_key}"},
files={"file": ("audio.wav", audio_file, "audio/wav")},
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
If you prefer faster transcription or better accuracy, set a cloud API in .env:
cp .env.example .env
| Option | Setup | Speed |
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The skill explicitly supports downloading videos from arbitrary URLs via videoarm-download, which introduces network access, untrusted remote content ingestion, and local storage of externally sourced files. In a media-processing skill this is contextually relevant, but it still expands the attack surface through SSRF-like fetches, malicious media payloads against downstream tools, and unexpected data egress through proxy configuration.
The code invokes ffmpeg via subprocess, but the declared permissions reportedly do not include shell/process execution. Even without shell=True, undeclared process execution expands the skill's effective privileges and can violate sandboxing or policy assumptions in the hosting platform.
The code invokes ffmpeg via subprocess, but the declared permissions reportedly do not include shell/process execution. Even without shell=True, undeclared process execution expands the skill's effective privileges and can violate sandboxing or policy assumptions in the hosting platform.
The code invokes ffmpeg via subprocess, but the declared permissions reportedly do not include shell/process execution. Even without shell=True, undeclared process execution expands the skill's effective privileges and can violate sandboxing or policy assumptions in the hosting platform.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def get_config():
"""Get configuration from environment variables.
Loads .env file automatically. Uses VISION_* vars with OPENAI_* fallback.
Supports OpenClaw (default), OpenAI, and Anthropic APIs.
"""
from dotenv import load_dotenv
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def get_config():
"""Get configuration from environment variables.
Loads .env file automatically. Uses VISION_* vars with OPENAI_* fallback.
Supports OpenClaw (default), OpenAI, and Anthropic APIs.
"""
from dotenv import load_dotenv
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def get_config():
"""Get configuration from environment variables.
Loads .env file automatically. Uses VISION_* vars with OPENAI_* fallback.
Supports OpenClaw (default), OpenAI, and Anthropic APIs.
"""
from dotenv import load_dotenv
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def get_config():
"""Get configuration from environment variables.
Loads .env file automatically. Uses VISION_* vars with OPENAI_* fallback.
Supports OpenClaw (default), OpenAI, and Anthropic APIs.
"""
from dotenv import load_dotenv
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Analyze frames using Anthropic."""
from anthropic import Anthropic
# Get API key from environment (set by OpenAWS)
api_key = os.getenv("ANTHROPIC_API_KEY")
if not api_key:
raise RuntimeError("ANTHROPIC_API_KEY not set. Run from OpenAWS session.")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def update_env():
"""Update .env with local whisper config."""
env_path = Path(__file__).parent.parent / ".env"
config = {
"WHISPER_API_KEY": "local",
The script installs and loads a macOS launch agent so the Whisper service starts automatically on login/boot, which is a persistence mechanism. In the context of a transcription helper, persistence is not strictly necessary to answer video questions and therefore creates disproportionate risk if the service, plist, or dependent code is later modified or abused.
The script invokes a shell via os.system() to load a launchd agent, which is an unsafe execution primitive and also activates persistent background execution on the host. Even though plist_dst is locally constructed, shell-based execution increases risk if the path or environment is manipulated, and the more significant danger is the unprompted loading of a persistent service during setup.
import shutil
plist_dst.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(plist_src, plist_dst)
os.system(f"launchctl load {plist_dst}")
print(f"✅ Installed launchd service: {plist_dst}")
This markdown file applies to SQP-2, and it describes behaviors that affect user data and system state: downloading remote videos, processing local videos, extracting frames/transcripts, and later creating a marker file. The document explains functionality but does not include any explicit warning about network access, handling of local media content, or creation of files on disk.
No suspicious patterns detected.