| 1234567891011121314151617181920212223242526272829303132333435363738 |
- # SPDX-License-Identifier: AGPL-3.0-only
- # Reproduction + regression test for issue #1411:
- # SSRF via /video proxy with default HMAC key and missing host validation.
- import std/[unittest, uri]
- import ".."/src/utils
- suite "issue #1411 SSRF via /video proxy":
- setup:
- # The default key shipped in nitter.example.conf / config.nim.
- setHmacKey("secretkey")
- test "HMAC for arbitrary SSRF URLs is forgeable with the default key":
- # These signatures were independently computed (Python hmac-sha256, uppercase
- # hex, first 13 chars) and observed live in the issue report.
- check getHmac("http://172.17.0.1:19999/secret_data.m3u8") == "BBD19ACC6C012"
- check getHmac("http://172.17.0.1:19999/secret_data.mp4") == "0780F00DDF3E7"
- test "isTwitterUrl rejects SSRF targets (the guard /video is missing)":
- # Internal / metadata hosts an attacker would target.
- check isTwitterUrl(parseUri("http://172.17.0.1:19999/secret_data.m3u8")) == false
- check isTwitterUrl(parseUri("http://169.254.169.254/latest/meta-data/x.m3u8")) == false
- check isTwitterUrl(parseUri("http://localhost/x.mp4")) == false
- check isTwitterUrl(parseUri("http://[::1]/x.mp4")) == false
- test "isTwitterUrl rejects userinfo / look-alike host bypass attempts":
- check isTwitterUrl(parseUri("http://video.twimg.com@169.254.169.254/x.mp4")) == false
- check isTwitterUrl(parseUri("http://video.twimg.com.evil.com/x.mp4")) == false
- check isTwitterUrl(parseUri("http://evilvideo.twimg.com.attacker/x.mp4")) == false
- test "isTwitterUrl rejects non-http schemes even on a Twitter host":
- check isTwitterUrl(parseUri("gopher://video.twimg.com/x.mp4")) == false
- check isTwitterUrl(parseUri("file:///etc/passwd")) == false
- check isTwitterUrl(parseUri("ftp://video.twimg.com/x.mp4")) == false
- test "isTwitterUrl still allows legitimate Twitter video hosts":
- check isTwitterUrl(parseUri("https://video.twimg.com/ext_tw_video/1/pu/pl/x.m3u8")) == true
- check isTwitterUrl(parseUri("https://video.twimg.com/amplify_video/1/vid/x.mp4")) == true
- check isTwitterUrl(parseUri("https://prod-fastly-us-east-1.video.pscp.tv/x.m3u8")) == true
|