T09 · Insecure Skill Coding Practices
- Location
scripts/webhook_server.py:64- Finding
Unauthenticated and Unbounded Network Webhook Receiver
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly aligned with Jellyseerr media requests, but its notification setup installs persistent services and exposes an unauthenticated webhook listener that needs review before use.
Install only if you are comfortable running a persistent Jellyseerr integration on this host. Prefer binding the webhook to localhost or a trusted interface behind HTTPS/authentication, restrict firewall access to the Jellyseerr server, inspect any generated systemd unit before enabling it, avoid the /tmp crontab method, and leave auto_approve disabled unless you intentionally want automatic media approvals.
scripts/webhook_server.py:64Unauthenticated and Unbounded Network Webhook Receiver
scripts/setup_webhook.sh:7Root-Owned systemd Unit Injection Through Unvalidated Setup Inputs
SKILL.md:76Predictable Temporary File Used to Replace the User Crontab
The documented capability extends beyond Jellyseerr request/search operations to running an HTTP receiver, processing inbound events, and preparing outbound notifications using additional configuration data. This broader integration increases data-flow and exposure risks and is insufficiently disclosed by the current description.
The documented capability extends beyond Jellyseerr request/search operations to running an HTTP receiver, processing inbound events, and preparing outbound notifications using additional configuration data. This broader integration increases data-flow and exposure risks and is insufficiently disclosed by the current description.
The documented capability extends beyond Jellyseerr request/search operations to running an HTTP receiver, processing inbound events, and preparing outbound notifications using additional configuration data. This broader integration increases data-flow and exposure risks and is insufficiently disclosed by the current description.
The documented capability extends beyond Jellyseerr request/search operations to running an HTTP receiver, processing inbound events, and preparing outbound notifications using additional configuration data. This broader integration increases data-flow and exposure risks and is insufficiently disclosed by the current description.
The documented capability extends beyond Jellyseerr request/search operations to running an HTTP receiver, processing inbound events, and preparing outbound notifications using additional configuration data. This broader integration increases data-flow and exposure risks and is insufficiently disclosed by the current description.
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).
sudo systemctl stop jellyseerr-webhook
sudo systemctl disable jellyseerr-webhook
sudo rm /etc/systemd/system/jellyseerr-webhook.service
sudo systemctl daemon-reload
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).
#!/bin/bash
# Setup webhook server as a systemd service
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICE_NAME="jellyseerr-webhook"
PORT="${1:-8384}"
# Create systemd service file
sudo tee /etc/systemd/system/${SERVICE_NAME}.service > /dev/null << EOF
[Unit]
Description=Jellyseerr Webhook Receiver
After=network.target
[Service]
Type=simple
User=$USER
WorkingDirectory=$SCRIPT_DIR
ExecStart=/usr/bin/python3 $SCRIPT_DIR/webhook_server.py $PORT
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Reload systemd and enable service
sudo systemctl daemon-reload
sudo systemctl enable ${SERVICE_NAME}
sudo systemctl start ${SERVICE_NAME}
echo "✓ Webhook server installed and started on port $PORT"
echo ""
echo "Next steps:"
echo "1. Get your server's IP address: hostname -I"
echo "2. In Jellyseerr, go to Settings → Notifications �
Code contains obfuscation (base64, hex encoding with execution). This is often used to hide malicious functionality.
echo "4. Set Webhook URL to: http://YOUR_IP:$PORT/"
echo "5. In JSON Payload, paste the following (base64 encoded):"
echo ""
echo 'eyJub3RpZmljYXRpb25fdHlwZSI6Int7bm90aWZpY2F0aW9uX3R5cGV9fSIsInN1YmplY3QiOiJ7e3N1YmplY3R9fSIsIm1lc3NhZ2UiOiJ7e21lc3NhZ2V9fSIsIm1lZGlhX3R5cGUiOiJ7e21lZGlhX3R5cGV9fSIsIm1lZGlhX3RtZGJpZCI6Int7bWVkaWFfdG1kYmlkfX0ifQ=='
echo ""
echo "6. Enable notification type: Media Available"
echo "7. Test the webhook and Save Changes"
The skill advertises executable scripts and host-modifying setup steps but declares no explicit tool scope or permission boundaries. In an agent ecosystem, this creates hidden capabilities: shell, network, environment access, and file writes may be invoked without the skill manifest clearly warning reviewers or policy engines.
The webhook setup tells the user to run an installation script with sudo without clearly describing the privileged changes being made. Running undocumented root-level installation increases the risk of unintended system modification and reduces informed consent.
Instructing users to run a script with sudo introduces root-level execution, which is inherently high trust and can affect the entire host. Without transparent disclosure of script contents and effects, this creates an avoidable security risk.
Quick setup:
scripts/install_service.sh # Run with sudo
Then configure Jellyseerr to send webhooks to http://YOUR_IP:8384/
The polling setup appends a cron job into the user's crontab, creating persistence, but the instructions do not clearly warn that this is a lasting system change. Users may believe they are running a one-time command when they are actually scheduling recurring execution every minute.
The cron instructions establish recurring execution, creating session persistence beyond the immediate user action. Persistence is not inherently malicious, but when introduced without strong disclosure and lifecycle management it can lead to unnoticed background activity and long-term exposure.
For environments where webhooks aren't available, use cron-based polling:
crontab -l > /tmp/cron_backup.txt
echo "* * * * * $(pwd)/scripts/auto_monitor.sh" >> /tmp/cron_backup.txt
crontab /tmp/cron_backup.txt
The example configuration enables auto_approve, which can cause requests to be approved automatically without a human review step. In a media-request workflow this may allow unauthorized or unintended content acquisition if the account or agent is misused.
{ "server_url": "https://jellyseerr.yourdomain.com", "api_key": "your-api-key", "auto_approve": true }
The guide instructs users to configure a webhook endpoint over plain HTTP using the server IP, which exposes webhook payloads to interception or modification by any attacker on the local network path. Even if the payload is not highly sensitive, unauthenticated and unencrypted transport can enable spoofed notifications, event tampering, and disclosure of media-request metadata.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
sudo systemctl status jellyseerr-webhook
No suspicious patterns detected.