Spaces:
Sleeping
Sleeping
| """Network guard installed at Python startup inside the sandbox image. | |
| Container network isolation gives us a fresh netns so ``localhost`` is the | |
| container itself, but the link-local cloud-metadata address 169.254.169.254 | |
| is still reachable on cloud hosts. We cannot drop NET_ADMIN-gated iptables | |
| rules (we run with ``--cap-drop=ALL``), so we filter at the Python socket | |
| layer instead. Anything using ``socket.getaddrinfo`` or ``socket.create_connection`` | |
| (which is everything: requests, urllib, httpx, etc.) is covered. | |
| A sufficiently creative payload can bypass this by calling libc ``connect(2)`` | |
| directly through ctypes. Defense in depth, not a boundary. | |
| """ | |
| from __future__ import annotations | |
| import ipaddress | |
| import socket | |
| _BLOCKED_NETS = ( | |
| ipaddress.ip_network("169.254.0.0/16"), # link-local (cloud metadata) | |
| ipaddress.ip_network("fe80::/10"), # IPv6 link-local | |
| ipaddress.ip_network("::ffff:169.254.0.0/112"), # v4-mapped-in-v6 link-local | |
| ) | |
| def _is_blocked(ip_str: str) -> bool: | |
| try: | |
| addr = ipaddress.ip_address(ip_str) | |
| except ValueError: | |
| return False | |
| return any(addr in net for net in _BLOCKED_NETS) | |
| _orig_getaddrinfo = socket.getaddrinfo | |
| _orig_create_connection = socket.create_connection | |
| def _guarded_getaddrinfo(host, *args, **kwargs): | |
| results = _orig_getaddrinfo(host, *args, **kwargs) | |
| for family, _type, _proto, _canon, sockaddr in results: | |
| ip = sockaddr[0] | |
| if _is_blocked(ip): | |
| raise OSError(f"sandbox: blocked connect to metadata/link-local address {ip}") | |
| return results | |
| def _guarded_create_connection(address, *args, **kwargs): | |
| host = address[0] | |
| if _is_blocked(host): | |
| raise OSError(f"sandbox: blocked connect to metadata/link-local address {host}") | |
| return _orig_create_connection(address, *args, **kwargs) | |
| socket.getaddrinfo = _guarded_getaddrinfo | |
| socket.create_connection = _guarded_create_connection | |