Back to skill

Security audit

Webhook Receiver Pro

Security checks for vulnerabilities and agentic risk

Overview

This webhook receiver is mostly coherent, but it stores full webhook data and can dispatch events without requiring authentication first.

Review before installing or using with real webhooks. Require provider signature verification before logging or dispatching events, avoid storing full headers or payloads, redact tokens and personal data, restrict file permissions, and remove the broad 'hook' activation trigger.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:45
Finding

Webhook Events Are Persisted and Dispatched Without Mandatory Authentication

Content
View full analysis
dict: return { "id": self.id, "source": self.source, "timestamp": self.timestamp, "headers": self.headers, "parsed": self.parsed, } ``` ```python def _save_events(self): with open(self.log_file, "w", encoding="utf-8") as f: json.dump({"events": self.events[-500:]}, f, ensure_ascii=False, indent=2) ``` ```python def receive(self, event: WebhookEvent) -> dict: """处理接收到的webhook""" event_dict = event.to_dict() self.events.append(event_dict) self._save_events() result = {"received": True, "id": event.id, "source": event.source} # 查找匹配的handler event_type = event.parsed.get("event", "generic") if event_type in self.handlers: try: handler_result = self.handlers[event_type](event.parsed) result["handler_result"] = handler_result result["processed"] = True except Exception as e: result["error"] = str(e) result["processed"] = False else: result["processed"] = False result["note"] = f"No handler for event type: {event_type}" return result def verify_github_signature(self, payload: str, signature: str, secret: str) -> bool: """验证GitHub webhook签名""" expected = "sha256=" + hmac.new( secret.encode(), payload.encode(), hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature) ``` ### Technical Analysis The `receive()` method accepts a `WebhookEvent`, stores it, and dispatches its parsed payload to a registered handler without requiring authentication or integrity verification. Although `verify_github_signa ...[truncated 2799 chars]
Remediation
View remediation
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (2)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The activation trigger includes the single word "hook," which is a very broad term used in many normal technical and conversational contexts. This can cause unintended skill invocation, making the skill activate when the user did not intend to expose or process webhook-related content, which is especially risky for a skill that receives and stores external event data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill persists webhook headers and parsed payload contents to a local JSON log file, but the description and examples do not warn users that potentially sensitive data is stored. Webhook payloads commonly contain secrets, tokens, user identifiers, payment details, or internal metadata, so silent retention increases the risk of privacy leakage and accidental disclosure.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.