T08 · Insecure Dependencies
- Location
requirements.txt:1- Finding
Unpinned Third-Party Dependencies Create Supply-Chain Exposure
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its YouTube-to-ebook purpose, but it needs Review because it can use stored credentials for external email and scheduled local automation without clear enough scoping.
Install only if you are comfortable giving this skill API keys and, if email is enabled, a Gmail app password. Use an isolated environment, keep .env private, review or disable any launchd scheduling, pin dependencies, and inspect generated newsletters before relying on emailed HTML/EPUB output.
requirements.txt:1Unpinned Third-Party Dependencies Create Supply-Chain Exposure
write_articles.py:20Untrusted YouTube Content Is Embedded Directly into LLM Instructions
send_email.py:81Generated and Externally Controlled Content Is Written to HTML and EPUB Without Sanitization
This article is based on the video "{article['title']}" from the YouTube channel {article['channel']}.
Watch the original video: {article['url']}
""" ``` `send_email.py:235-247`: ```python for article in articles: # Convert markdown article to HTML article_html = markdown.markdown(article['article']) html += f"""Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
# Make the API request to Supadata
# The 'text' format gives us just the plain text (no timestamps)
response = requests.get(
SUPADATA_TRANSCRIPT_URL,
params={
"url": youtube_url,
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp .env.example .env
# Edit .env with your keys
The skill includes Gmail/SMTP credential use, local archival of generated content and metadata, and external delivery, but the headline description does not make those sensitive behaviors prominent. This increases the risk of users exposing credentials or unintentionally transmitting generated material outside the local environment.
The skill includes Gmail/SMTP credential use, local archival of generated content and metadata, and external delivery, but the headline description does not make those sensitive behaviors prominent. This increases the risk of users exposing credentials or unintentionally transmitting generated material outside the local environment.
The skill includes Gmail/SMTP credential use, local archival of generated content and metadata, and external delivery, but the headline description does not make those sensitive behaviors prominent. This increases the risk of users exposing credentials or unintentionally transmitting generated material outside the local environment.
The skill includes Gmail/SMTP credential use, local archival of generated content and metadata, and external delivery, but the headline description does not make those sensitive behaviors prominent. This increases the risk of users exposing credentials or unintentionally transmitting generated material outside the local environment.
The skill includes Gmail/SMTP credential use, local archival of generated content and metadata, and external delivery, but the headline description does not make those sensitive behaviors prominent. This increases the risk of users exposing credentials or unintentionally transmitting generated material outside the local environment.
The skill explicitly relies on a .env file containing API keys and possibly Gmail credentials, indicating access to sensitive secrets. In a skill that also performs file operations, email sending, and external API calls, secret exposure or misuse could lead to account compromise, unauthorized API usage, or data exfiltration.
├── send_email.py # Create EPUB & send ├── main.py # Run full pipeline ├── channels.txt # Your channel list └── .env # API keys
## Known Pitfalls & Solutions
The code targets a LaunchAgents plist in the user's home directory, establishing or controlling persistent execution on macOS. For a skill described as converting YouTube videos to ebook articles, host-level persistence is not necessary and materially raises the security risk if the skill is installed or modified by an untrusted party.
Executing local programs from the dashboard increases the trust boundary of the UI and can chain into broader behavior performed by main.py. In this skill context, that is more dangerous because the advertised purpose understates that pressing a button launches a local automation pipeline that may fetch content, invoke AI tooling, and send email.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from googleapiclient.discovery import build
from dotenv import load_dotenv
# Load your secret API key from the .env file
load_dotenv()
YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from googleapiclient.discovery import build
from dotenv import load_dotenv
# Load your secret API key from the .env file
load_dotenv()
YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from googleapiclient.discovery import build
from dotenv import load_dotenv
# Load your secret API key from the .env file
load_dotenv()
YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from googleapiclient.discovery import build
from dotenv import load_dotenv
# Load your secret API key from the .env file
load_dotenv()
YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
from googleapiclient.discovery import build
from dotenv import load_dotenv
# Load your secret API key from the .env file
load_dotenv()
YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY")
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Run automatically every week:
# Copy the plist to LaunchAgents
cp com.youtube.newsletter.plist ~/Library/LaunchAgents/
# Load it
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Run automatically every week:
# Copy the plist to LaunchAgents
cp com.youtube.newsletter.plist ~/Library/LaunchAgents/
# Load it
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Run automatically every week:
# Copy the plist to LaunchAgents
cp com.youtube.newsletter.plist ~/Library/LaunchAgents/
# Load it
The skill documents behavior that requires network access, filesystem access, shell execution, and environment-secret use, but it does not declare any explicit tool scope or permissions. This creates an unsafe trust boundary because users and reviewers cannot easily tell what capabilities will be exercised, especially given handling of API keys and local automation.
The activation phrase "Set up YouTube to ebook for me" is broad enough that it could be triggered during normal conversation or vague assistant requests. Unintended activation can lead to unnecessary setup actions, requests for credentials, or filesystem changes without clear user intent.
The guidance to install a LaunchAgent plist establishes recurring execution on the user's Mac, which is a persistence mechanism. Even if presented for benign automation, persistence increases risk because the workflow will continue running and accessing files, network resources, and credentials after initial setup.
Solution: Run automation locally on your Mac using launchd:
<!-- ~/Library/LaunchAgents/com.youtube.ebook.plist -->
<plist version="1.0">
<dict>
<key>Label</key>
The LaunchAgent example continues to define a persistent job label for periodic execution, reinforcing that the skill supports session persistence. Persistence is sensitive in the context of credentialed network automation because it can keep transmitting or processing data long after the user forgets it is enabled.
Solution: Run automation locally on your Mac using launchd:
<!-- ~/Library/LaunchAgents/com.youtube.ebook.plist -->
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.youtube.ebook</string>
The closing plist snippet completes a persistent launchd configuration that runs on a schedule. In context, this is not inherently malicious, but it is a real persistence capability that deserves elevated scrutiny because it automates future execution with access to content, secrets, and outbound communication.
7
## Customization
The skill asks users to place Gmail credentials in a .env file for outbound email, but it does not prominently warn about secret handling, local storage risk, or external transmission of generated content. This can cause users to expose sensitive credentials or send data off-device without appreciating the security implications.
The module implements newsletter sending and scheduling management rather than just YouTube-to-ebook/article conversion. This scope expansion increases risk because users may grant trust based on the skill description while the code also manages persistence and outbound automation on the host.
Detected: suspicious.exposed_secret_literal