fix: fail closed when an SSRF-guarded host cannot be resolved

validate_url() previously returned None (allow) on socket.gaierror, so a
host that failed to resolve at check time was passed straight to yt-dlp. A
host we cannot resolve is a host we cannot verify as non-internal, and it may
resolve differently when yt-dlp fetches it. Reject it instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Alex Shnitman
2026-07-20 23:45:08 +03:00
parent 3bd2c3e366
commit ebcfe577bc
2 changed files with 7 additions and 4 deletions
+3 -2
View File
@@ -93,9 +93,10 @@ class AddressResolutionTests(unittest.TestCase):
# If any resolved address is internal, reject the whole URL.
self.assertIsNotNone(self._validate_with_addrs("http://mixed/x", "142.250.1.1", "127.0.0.1"))
def test_resolution_failure_defers_to_ytdlp(self):
def test_resolution_failure_is_rejected(self):
# Fail closed: an unresolvable host cannot be verified as non-internal.
with mock.patch("url_guard.socket.getaddrinfo", side_effect=socket.gaierror):
self.assertIsNone(validate_url("http://does-not-resolve.example/x"))
self.assertIsNotNone(validate_url("http://does-not-resolve.example/x"))
if __name__ == "__main__":