T02 · Agent Memory Poisoning
- Location
scripts/segment.py:148- Finding
Untrusted Podcast Content Can Poison Persistent Agent Memory
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it claims, but it sends podcast audio and transcripts to AI services and stores untrusted, model-derived podcast content in persistent OpenClaw memory with weak containment.
Review this skill before installing. Use it only with podcast feeds and episode URLs you trust, prefer dry_run until you understand the diary behavior, avoid setting OPENAI_BASE_URL unless you control and trust that endpoint, and assume full audio, transcript excerpts, and derived summaries may be sent to external AI providers and stored locally.
scripts/segment.py:148Untrusted Podcast Content Can Poison Persistent Agent Memory
scripts/transcribe.py:42Audio URL Validation Can Be Bypassed Through DNS Resolution and Redirects
scripts/utils/config.py:95Unvalidated OpenAI Base URL Can Expose API Credentials and Podcast Content
requirements.txt:1Installer Resolves and Executes Unpinned Third-Party Dependencies
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).
To clear cache:
rm -rf ~/.openclaw/cache/podcast-intel/
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).
To clear cache:
rm -rf ~/.openclaw/cache/podcast-intel/
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo apt-get install ffmpeg
sudo dnf install ffmpeg
### 4. Set up environment
The README states that only RSS feeds, Whisper API, and an LLM API are contacted, but it does not clearly and explicitly warn users that full podcast audio, transcripts, and derived analyses may be transmitted to third-party AI providers for processing. This can cause users to underestimate privacy, confidentiality, and data-handling implications, especially if feeds contain copyrighted, sensitive, or private material.
The activation text includes a broad catch-all phrase covering essentially any request involving podcast content analysis, which can cause the skill to trigger outside narrowly intended scenarios. Overbroad auto-activation increases the chance of inappropriate tool use, unnecessary external data processing, and unintended access to configured feeds, transcripts, or the local consumption diary when a user request only loosely relates to podcasts.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
fi
elif command -v apt-get &> /dev/null; then
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y ffmpeg
elif command -v dnf &> /dev/null; then
# Fedora
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
fi
elif command -v apt-get &> /dev/null; then
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y ffmpeg
elif command -v dnf &> /dev/null; then
# Fedora
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
fi
elif command -v apt-get &> /dev/null; then
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y ffmpeg
elif command -v dnf &> /dev/null; then
# Fedora
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
fi
elif command -v apt-get &> /dev/null; then
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y ffmpeg
elif command -v dnf &> /dev/null; then
# Fedora
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# OpenAI Base URL
if [ -z "$OPENAI_BASE_URL" ]; then
echo "→ OPENAI_BASE_URL: NOT SET (using default: https://api.openai.com/v1)"
else
echo "✓ OPENAI_BASE_URL: $OPENAI_BASE_URL"
fi
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# OpenAI Base URL
if [ -z "$OPENAI_BASE_URL" ]; then
echo "→ OPENAI_BASE_URL: NOT SET (using default: https://api.openai.com/v1)"
else
echo "✓ OPENAI_BASE_URL: $OPENAI_BASE_URL"
fi
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
cmd = ["python3", str(script_path)] + args
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
except subprocess.TimeoutExpired:
print(f"Error running {script_name}: timeout after {timeout}s", file=sys.stderr)
return None
This code appends analysis results to a diary, which is a file/data write operation with persistent effects. While a dry-run option exists and stderr logging announces the update when it happens, there is no upfront warning in the file's documented behavior that running the skill will modify diary data by default.
The code sends transcript content to an external OpenAI-compatible service in LLM mode by embedding transcript text directly into the prompt, but it provides no explicit consent, warning, or data-classification check at the transmission point. Because transcripts may contain sensitive or proprietary content, this creates a real confidentiality and privacy risk, especially when the default method is 'llm'.
The script caches transcript-derived summaries and entities to disk automatically, which can persist sensitive information beyond the immediate run and expose it to other local users, backups, or later compromise. This is a genuine data-handling weakness because the cache write occurs silently and is not clearly disclosed to the user at the write point.
The code invokes ffmpeg on a user-supplied remote URL, which can trigger server-side requests and media parsing of attacker-controlled content. Although shell injection is mitigated by passing an argument list and there is some URL validation, the validation only checks the literal hostname/IP and does not prevent DNS rebinding/resolution to internal addresses or risks inherent in ffmpeg processing untrusted media.
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=900)
except Exception as exc:
print(f"Error downloading audio: {exc}", file=sys.stderr)
return None
This code uploads the audio file to a remote API via client.audio.transcriptions.create, which transmits user-provided audio content off-system. While the module docstring mentions use of the Whisper API, there is no explicit user-facing warning at the point of operation about sending audio data to an external service.
The dependency is specified with a lower-bound constraint only, which allows future installs to resolve to different versions over time. This weakens build reproducibility and makes it harder to verify whether a deployed version includes known security fixes or newly introduced vulnerable releases.
feedparser>=6.0
openai>=1.0
pydantic>=2.0
pyyaml>=6.0
feedparser has known advisories, and because the manifest does not pin a version, it is impossible to determine from this file whether a safe or affected release will be installed. This creates uncertainty in security review and allows vulnerable versions to be selected depending on resolution time and environment.
The openai package is unpinned and may resolve to different versions in different environments or at different times. That can introduce supply-chain risk, unexpected breaking changes, or accidental installation of a version with a security issue that has not been reviewed.
feedparser>=6.0
openai>=1.0
pydantic>=2.0
pyyaml>=6.0
numpy>=1.24
Using pydantic>=2.0 permits any newer major or minor release, reducing reproducibility and making security posture difficult to assess. If a vulnerable or incompatible release is pulled in, downstream validation logic or service reliability could be affected.
feedparser>=6.0
openai>=1.0
pydantic>=2.0
pyyaml>=6.0
numpy>=1.24
httpx>=0.27
pydantic has known advisories, including denial-of-service related issues, and the unpinned constraint prevents verification that an installed version is unaffected. If the application validates untrusted input, a vulnerable release could amplify risk through parser or regex-related abuse.
PyYAML has a history of unsafe deserialization issues, and leaving it unpinned makes it unclear which release will be installed. In contexts where YAML may be parsed from untrusted sources, version drift can materially affect exposure to known parser and deserialization flaws.
feedparser>=6.0
openai>=1.0
pydantic>=2.0
pyyaml>=6.0
numpy>=1.24
httpx>=0.27
PyYAML has multiple historical security advisories, and without version pinning the deployment may resolve to an affected release. Given PyYAML's relevance to deserialization and parsing, the uncertainty is more dangerous than for purely local utility packages if untrusted YAML is ever processed.
An unpinned numpy dependency allows unreviewed releases to be installed, undermining reproducibility and making vulnerability status uncertain. While often lower risk than network-facing libraries, it still creates avoidable supply-chain and maintenance risk.
openai>=1.0
pydantic>=2.0
pyyaml>=6.0
numpy>=1.24
httpx>=0.27
Detected: suspicious.destructive_delete_command