T09 · Insecure Skill Coding Practices
- Location
scripts/polymarket-monitor.py:255- Finding
Disabled Notifications Still Transmit Alerts to Configured Webhooks
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a straightforward Polymarket news monitor, but users should understand that webhook alerts can send monitoring data to an external URL they configure.
Install only if you are comfortable with a script that periodically contacts Polymarket endpoints and writes local monitoring state. If you use webhook notifications, choose and protect the webhook URL carefully, assume alert metadata is sent to that third party, and avoid running it with untrusted config files or from sensitive internal networks.
scripts/polymarket-monitor.py:255Disabled Notifications Still Transmit Alerts to Configured Webhooks
scripts/polymarket-monitor.py:262Unrestricted Webhook Destination Permits Blind Server-Side Request Forgery
The skill advertises executable behavior that performs network access and writes local files, but it does not declare any tool scope or permissions metadata. This creates an authorization and transparency gap: users or hosting systems cannot easily constrain what the skill is allowed to do, increasing the risk of unintended outbound requests or file modification when the skill runs.
The documentation states the skill is 'read-only' and uses 'local data only', yet the configuration supports outbound webhook notifications to arbitrary external URLs. This is a misleading security claim that can cause users to underestimate the data-exfiltration and third-party communication risk, especially in automated environments where webhook destinations may be attacker-controlled or misconfigured.
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.
self.alerts = []
def _load_state(self):
"""Load previous state"""
if self.state_file.exists():
with open(self.state_file) as f:
return json.load(f)
The code can send alert contents to an arbitrary configured webhook via an outbound HTTP POST, which transmits collected titles, URLs, timestamps, and keyword classifications off-host. Although the code structure shows this is configurable, there is no explicit user-facing warning, confirmation, or disclosure near the operation indicating that alert data will be sent to a third-party endpoint.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
elif method == "webhook" and self.config["notification"]["webhook"]:
try:
requests.post(
self.config["notification"]["webhook"],
json=alert,
timeout=5
This markdown file describes configurable webhook notifications and provides a Slack webhook example, which implies monitored event data may be sent to an external service. The README does not include a user-facing warning about potential privacy or data-sharing implications of enabling notifications.