Harden private connector address validation
This commit is contained in:
@@ -65,10 +65,25 @@ class HttpFetchTests(unittest.TestCase):
|
||||
allowed_policy = outbound_http_policy(
|
||||
{"APP_ENV": "production", "GOVOPLAN_CONNECTOR_ALLOW_PRIVATE_NETWORKS": "true"}
|
||||
)
|
||||
self.assertEqual(
|
||||
"https://127.0.0.1/path",
|
||||
validate_outbound_http_url("https://127.0.0.1/path", policy=allowed_policy),
|
||||
with patch(
|
||||
"govoplan_core.security.outbound_http.socket.getaddrinfo",
|
||||
return_value=[(2, 1, 6, "", ("127.0.0.1", 443))],
|
||||
):
|
||||
self.assertEqual(
|
||||
"https://127.0.0.1/path",
|
||||
validate_outbound_http_url("https://127.0.0.1/path", policy=allowed_policy),
|
||||
)
|
||||
|
||||
def test_private_network_policy_still_blocks_non_peer_and_metadata_addresses(self) -> None:
|
||||
policy = outbound_http_policy(
|
||||
{"APP_ENV": "production", "GOVOPLAN_CONNECTOR_ALLOW_PRIVATE_NETWORKS": "true"}
|
||||
)
|
||||
for address in ("0.0.0.0", "169.254.169.254", "224.0.0.1", "::", "fe80::1", "ff02::1"):
|
||||
with self.subTest(address=address), patch(
|
||||
"govoplan_core.security.outbound_http.socket.getaddrinfo",
|
||||
return_value=[(2, 1, 6, "", (address, 443))],
|
||||
), self.assertRaisesRegex(OutboundHttpBlocked, "forbidden special-purpose network"):
|
||||
validate_outbound_http_url("https://connector.example.test/path", policy=policy)
|
||||
|
||||
def test_outbound_policy_rejects_mixed_public_and_private_dns_answers(self) -> None:
|
||||
policy = outbound_http_policy({"APP_ENV": "production"})
|
||||
@@ -131,7 +146,10 @@ class HttpFetchTests(unittest.TestCase):
|
||||
headers={"Authorization": "Bearer secret", "X-Request-ID": "request-1"},
|
||||
)
|
||||
handler = _PolicyRedirectHandler(label="Catalog URL")
|
||||
with patch.dict("os.environ", {"APP_ENV": "test"}):
|
||||
with patch.dict("os.environ", {"APP_ENV": "test"}), patch(
|
||||
"govoplan_core.security.outbound_http.socket.getaddrinfo",
|
||||
return_value=[(2, 1, 6, "", ("127.0.0.1", 443))],
|
||||
):
|
||||
redirected = handler.redirect_request(
|
||||
request,
|
||||
None,
|
||||
|
||||
Reference in New Issue
Block a user