OSV 1.4.0 · github-reviewed · 修改于 2026-06-09 19:56
发布时间
2026-05-19 01:20
GitHub 审查时间
2026-05-19 01:20
NVD 发布时间
2026-06-06 02:17
源文件
advisories/github-reviewed/2026/05/GHSA-p7c4-8x34-8j8f/GHSA-p7c4-8x34-8j8f.json
Missing authentication on WebRTC ingest endpoint allows unauthenticated stream injection in TinyIce
Go (or "Other" — TinyIce is shipped as a Go binary, not a Go module published to a registry)github.com/DatanoiseTV/tinyice>= 0.8.95, <= 2.4.1
(Introduced 2026-02-21 in commit e2b60d6 — "debug: add Go Live connection tracing and backend data flow logging" — when handleWebRTCSourceOffer was registered at /webrtc/source-offer without an authentication check. Every tagged release from v0.8.95 through v2.4.1 ships the vulnerable handler.)
>= 2.5.0
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:LTinyIce's WebRTC source-ingest HTTP endpoint, POST /webrtc/source-offer?mount=<mount>, accepted any inbound WebRTC SDP offer with no authentication check. The handler routed the offer to WebRTCManager.HandleSourceOffer, which then accepted whatever audio/video tracks the peer published and broadcast them on the named mount as if they were the legitimate source.
The other ingest paths (POST /<mount> over HTTP/1 with the icecast SOURCE / PUT verb, RTMP, SRT) all require the per-mount source password, falling back to default_source_password from the config. The WebRTC ingest path didn't.
A network attacker who can reach the TinyIce HTTP port can:
This is a high-integrity-impact issue: an attacker can replace a radio's broadcast with their own audio (silence, noise, malicious content, branded competitor content, etc.). Listeners hear what the attacker sends, not what the legitimate publisher intended.
The legitimate publisher can re-establish their session — TinyIce's source-takeover handshake gives the new offer priority once it arrives, with a 3-second drain of the previous pump goroutine — but the attacker can in principle re-connect immediately after, producing a sustained broadcast hijack until the operator manually intervenes (block at firewall, rotate source passwords once the patch is applied, restart the service).
There is no direct confidentiality impact through this endpoint: the attacker doesn't gain access to listener data or other mounts' content.
If users cannot upgrade immediately:
POST /webrtc/source-offer at the reverse proxy in front of TinyIce. The endpoint has no production use case for clients outside the operator's own administration — disabling it loses no functionality unless the consuming application specifically use the browser-based "go-live" feature.To check whether an application's deployment is exposed, run from outside the network:
curl -i -X POST 'https://your-tinyice-host/webrtc/source-offer?mount=/anymount' \
-H 'Content-Type: application/json' \
-d '{"type":"offer","sdp":"v=0\r\n"}'
400 Bad Request with a JSON body containing an SDP-parsing error from pion/webrtc, a consuming application is vulnerable — the server tried to negotiate the (malformed) offer without asking for credentials.401 Unauthorized (Basic auth challenge), the consuming application has been patched.Authenticated log lines on a patched server will look like:
WARN Authentication failed for user 'webrtc-source' from 1.2.3.4: invalid source password
Upstream commit: 8067d6b "fix(api): require source password on /webrtc/source-offer + CSRF/access on /go-live-chunk".
The handler now:
?password= query parameter.default_source_password fallback) using bcrypt.disabled_mounts.The same release also tightens an adjacent endpoint, POST /admin/golive/chunk, which previously required session authentication but did not verify the session user's per-mount access nor check the CSRF token.
e2b60d6).8067d6b, released as v2.5.0.