T09 · Insecure Skill Coding Practices
- Location
scripts/youtube_transcript_fetcher.py:26- Finding
Unrestricted Channel URL Enables Server-Side Requests to Arbitrary Network Destinations
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is mostly a coherent YouTube transcript tool, but its channel input can be used to send network requests to non-YouTube destinations, so it should be reviewed before installation.
Install only if you are comfortable running yt-dlp and Python dependencies with network access. Prefer using explicit YouTube video IDs, YouTube URLs, or trusted channel handles, and avoid untrusted batch config files until the channel URL handling is restricted to YouTube domains and dependencies are pinned.
scripts/youtube_transcript_fetcher.py:26Unrestricted Channel URL Enables Server-Side Requests to Arbitrary Network Destinations
requirements.txt:1Third-Party Python Dependencies Are Not Reproducibly Pinned
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
or:
sudo apt install yt-dlp
The skill requests or implies broad capabilities (file read/write, network, shell) but does not declare an explicit tool scope such as permissions or allowed-tools. This creates an authorization gap where an agent may invoke the skill without clear sandbox expectations, increasing the chance of unintended command execution, network access, or filesystem modification beyond what a transcript-fetching task should require.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
url = f"https://www.youtube.com/@{channel_id}/videos"
try:
result = subprocess.run(
[
"yt-dlp",
"--flat-playlist",
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def get_video_details(video_id: str) -> Optional[Dict]:
"""Get detailed video metadata using yt-dlp"""
try:
result = subprocess.run(
[
"yt-dlp",
"--no-warnings",
This skill explicitly sets locale fields such as hl="en" and gl="US" for multiple client profiles, and later prioritizes specific languages for transcript retrieval. Because the file provides no user opt-in or configurable locale selection, it imposes a language/locale policy in a way that may violate organizational requirements for user choice.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
for attempt in client_attempts:
try:
response = requests.post(
url,
headers={
"User-Agent": attempt["user_agent"],
The dependency is specified with a lower bound only, so builds may resolve to different versions over time. This weakens supply-chain reproducibility and can allow unintentionally pulling a newly introduced vulnerable or breaking release.
requests>=2.31.0
youtube-transcript-api>=0.6.2
The manifest references requests without pinning an exact version, and requests has multiple historical advisories. Because the resolved version is unconstrained above the minimum, it is not possible to verify from this file alone whether deployment will avoid affected versions, creating avoidable supply-chain uncertainty.
The package is not pinned to an exact version, which makes installations non-reproducible and increases supply-chain risk. A future dependency resolution could select a compromised or vulnerable release without any change to this repository.
requests>=2.31.0
youtube-transcript-api>=0.6.2
No suspicious patterns detected.