AnyCable: Pusher REST API Does Not Verify Request Body MD5 Enabling Signed-Request Replay with Arbitrary Body
CVE-2026-63405 (GitHub advisory GHSA-5p54-whvp-x327) is a medium-severity vulnerability with a CVSS 3.1 base score of 5.9, classed as Insufficient Verification of Data Authenticity (CWE-345), in github.com/anycable/anycable (Go). Affected versions: <= 1.6.14. It is fixed in 1.6.15.
Published 18 Sept 2026Updated 18 Sept 2026
- CVE ID
- CVE-2026-63405
- GHSA ID
- GHSA-5p54-whvp-x327
- EPSS
- 0.17%higher than 6% of CVEs
- Weakness (CWE)
- CWE-345Insufficient Verification of Data Authenticity
- KEV status
- Not in KEV
- Published
- 18 Sept 2026
- Updated
- 18 Sept 2026
- Ecosystem
- Go
- Assigned by (CNA)
- GitHub_M
Summary
Source: OSV (GitHub advisory)
The Pusher-compatible REST API includes body_md5 in the HMAC signature string but never computes or verifies the MD5 of the received HTTP body, allowing anyone who observes a signed request to replay it with an entirely different body.
Details
In pusher/http.go, the Handler function extracts body_md5 from the URL query string (line 169) and includes it verbatim in stringToSign (line 175). It then verifies HMAC(stringToSign, secret) == auth_signature. After verification succeeds, handleEvents reads and parses r.Body (lines 201-212) without ever computing md5(body) and comparing it against the body_md5 that was signed. The Pusher protocol specification explicitly requires the server to verify this digest to prevent body-substitution attacks. There is also no auth_timestamp staleness check, so replays are valid indefinitely.
PoC
- Capture a legitimate signed POST to
/apps/<app_id>/events?auth_key=K&auth_timestamp=T&auth_version=1.0&body_md5=LEGIT_MD5&auth_signature=SIGcarrying body{"name":"safe-event","channel":"ch","data":"..."}(e.g., from TLS-terminating load-balancer logs). - Send a new request with the same query string parameters but a different body:
{"name":"injected-event","channel":"admin","data":"malicious-payload"} - The server accepts the request (HMAC over
stringToSignmatches the original) and broadcasts the injected event to all subscribers ofadmin.
Impact
An attacker who can read any single signed Pusher API request (from logs, a shared proxy, or a network tap) can broadcast arbitrary events to any channel indefinitely, potentially forging server-side events, corrupting application state, or delivering phishing messages to WebSocket clients.
Fix
After reading r.Body, compute hex(md5(body)) and compare it to the body_md5 query parameter using a constant-time comparison before proceeding. Additionally, reject requests whose auth_timestamp is more than 600 seconds from the current time.
Technical details
Source: GitHub Advisory Database
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:NMedium5.9Base score from GitHub Advisory Database
- Attack Vector AV
- Network
- Attack Complexity AC
- High
- Privileges Required PR
- None
- User Interaction UI
- None
- Scope S
- Unchanged
- Confidentiality C
- None
- Integrity I
- High
- Availability A
- None
CISA SSVC decision points
- Exploitation
- poc
- Proof-of-concept code is public
- Automatable
- no
- Needs manual steps per target
- Technical impact
- partial
- Limited control of the affected system
CISA Coordinator assessment (SSVC 2.0.3) via CVE.org.
Affected packages
Source: OSV (GitHub advisory)
- github.com/anycable/anycableGo
pkg:golang/github.com/anycable/anycable- Affected versions
- <= 1.6.14
- Fixed in
- 1.6.15
| Package | Affected versions | Fixed in |
|---|---|---|
github.com/anycable/anycable Go pkg:golang/github.com/anycable/anycable |
|
|
Fix
Source: OSV (GitHub advisory)
Fix available
Upgrade to 1.6.15 or later.
Patch commits
- pusher: fix handling body_md5, check auth_timestamp in REST API
+91 −18 across 3 files
- CHANGELOG.md+4 −0
- pusher/http.go+46 −18
- pusher/http_test.go+41 −0
Release commits
The commits each fixed release tag points at. They usually bump the version rather than contain the fix itself.
Vulnerability intelligence
Root cause analysis
Vulnerable functions
References
Advisories 4
Package 1
Other links 1
Credits
- de3erve-hunterreporter
Questions about CVE-2026-63405
- What is the GHSA ID for CVE-2026-63405?
- GitHub tracks CVE-2026-63405 as GHSA-5p54-whvp-x327.
- What is the CVSS score of CVE-2026-63405?
- CVE-2026-63405 has a CVSS 3.1 base score of 5.9 (Medium), vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N.
- Which versions are affected by CVE-2026-63405?
- github.com/anycable/anycable (Go): <= 1.6.14.
- How do I fix CVE-2026-63405?
- Upgrade to 1.6.15 or later. The fix is in commit d2cbade.
- What is the Package URL (PURL) for CVE-2026-63405?
- The affected package's PURL is pkg:golang/github.com/anycable/anycable.
- Is CVE-2026-63405 exploited in the wild?
- CISA's Known Exploited Vulnerabilities catalog doesn't list CVE-2026-63405. That means no confirmed exploitation has been catalogued, not that it is safe to leave unpatched. CISA's SSVC assessment rates exploitation as "poc". EPSS estimates a 0.17% chance of exploitation in the next 30 days, higher than 6% of CVEs.
Data sources
Upstream records
- OSV (GitHub advisory)LoadedRaw JSON
- GitHub Advisory DatabaseLoadedRaw JSON
- OSV (CVE record)LoadedRaw JSON
- CVE.orgLoaded
- CISA KEV catalogLoaded
Fetched 5 days ago (8 Oct 2026, 22:44 UTC). Records refresh automatically after 24 hours.
Where each part of this page came from
- Title and description
- OSV (GitHub advisory)
- Severity score
- GitHub Advisory Database
- Weakness (CWE)
- GitHub Advisory Database
- Affected packages
- OSV (GitHub advisory)
- Fix
- OSV (GitHub advisory)
- References
- Computed by CVEminer
- SSVC
- CVE.org
- KEV status
- CISA KEV catalog
- EPSS
- GitHub Advisory Database
OSV and GitHub Advisory Database content is licensed CC BY 4.0. Values marked as computed or derived were calculated by CVEminer from the upstream data.