other
- Location
SKILL.md:307- Finding
Webhook Signing Secret Transmitted to an External HMAC Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly a disclosed Webhook Relay guide, but it includes under-warned instructions that can expose private services persistently and send a real webhook signing secret to an external HMAC endpoint.
Review carefully before installing. Use the skill only with non-sensitive demo endpoints unless you understand Webhook Relay's exposure model, avoid sending real webhook signing secrets to /v1/hmac, compute signatures locally instead, do not put real tunnel passwords directly on the command line, and avoid installing the relay as a background service unless you also know how to stop and remove it.
SKILL.md:307Webhook Signing Secret Transmitted to an External HMAC Service
SKILL.md:135Relay Agent Installed as a Persistent Operating-System Service
SKILL.md:212Tunnel Password Supplied Through Command-Line Arguments
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).
Bin endpoint reference: `POST /v1/bins` (create), `GET /v1/bins/{id}` (read +
requests), `PUT /v1/bins/{id}` (configure response), `DELETE /v1/bins/{id}`,
`(any) /v1/webhooks/{id}` (receiver), `GET /v1/events?stream={id}` (SSE),
`POST /v1/hmac`. Bodies are capped at 500 KB; the service is rate limited (429
when flooded).
The tunnel section instructs users to expose local or internal services via a public hostname but does not prominently warn that this makes those services internet-reachable. In a security-sensitive skill, omission of an explicit warning can lead users to unintentionally publish development or private services without authentication, IP restrictions, or hardening.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
echo "$B/v1/webhooks/$BIN"
# 3. Send a test request
curl -s -X POST "$B/v1/webhooks/$BIN" -H 'Content-Type: application/json' -d '{"hello":"world"}'
# 4. Read back every captured request as JSON
curl -s "$B/v1/bins/$BIN" | jq '.requests'
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
and probabilistic failures (test a sender's retry logic):
curl -s -X PUT "$B/v1/bins/$BIN" -H 'Content-Type: application/json' -d '{
"id": "'"$BIN"'",
"response": {
"status": 201,
The HMAC verification example sends both the webhook body and the secret to a third-party /v1/hmac service for computation. Even though presented as a convenience feature, transmitting shared secrets off-system expands trust boundaries and can expose credentials or sensitive payload data to the external service, logs, or intermediaries.
RAW=$(curl -s "$B/v1/bins/$BIN" | jq -r '.requests | sort_by(.receivedAt) | last | .body')
# Pipe base64 through `tr -d '\n'` — GNU base64 wraps at 76 cols and would
# embed newlines in the body, producing a wrong signature.
SIG=$(curl -s -X POST "$B/v1/hmac" -H 'Content-Type: application/json' -d "$(jq -nc \
--arg s "$WEBHOOK_SECRET" --arg b "$(printf %s "$RAW" | base64 | tr -d '\n')" \
'{algorithm:"sha256", secret:$s, body:$b}')" | jq -r .signature)
echo "expected: sha256=$SIG"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
- **Forwarding (internal):** start a throwaway server (`python3 -m http.server
8080`), run `relay forward -b my-app http://localhost:8080`, then
`curl -X POST https://my.webhookrelay.com/v1/webhooks/<id> -d '{"hi":1}'` and
watch the agent log + local server receive it.
- **Tunnel:** open the printed `https://<host>` in a browser; requests appear in
the agent's terminal. Connection errors usually mean the local service is down
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
- **Tunnel:** open the printed `https://<host>` in a browser; requests appear in
the agent's terminal. Connection errors usually mean the local service is down
or `--rewrite-host-header` doesn't match what the app expects.
- **Bin:** `BIN=$(curl -s -X POST $B/v1/bins | jq -r .id); curl -s -X POST
"$B/v1/webhooks/$BIN" -d '{"smoke":1}'; curl -s "$B/v1/bins/$BIN" | jq
'.requests | length'` should be `>= 1`.