diff --git a/src/openharness/sandbox/docker_backend.py b/src/openharness/sandbox/docker_backend.py index 41053c1..956cc62 100644 --- a/src/openharness/sandbox/docker_backend.py +++ b/src/openharness/sandbox/docker_backend.py @@ -95,11 +95,16 @@ class DockerSandboxSession: self._container_name, ] - # Network isolation - if sandbox.network.allowed_domains: - argv.extend(["--network", "bridge"]) - else: - argv.extend(["--network", "none"]) + # Docker backend currently supports only fully disabled networking. + # Domain-level allow/deny policies exist for the srt backend, but Docker + # does not enforce them yet. Fail closed instead of silently widening + # egress to unrestricted bridge networking. + if sandbox.network.allowed_domains or sandbox.network.denied_domains: + logger.warning( + "Docker sandbox does not enforce allowed_domains/denied_domains yet; " + "keeping network disabled" + ) + argv.extend(["--network", "none"]) # Resource limits if docker_cfg.cpu_limit > 0: diff --git a/tests/test_sandbox/test_docker_backend.py b/tests/test_sandbox/test_docker_backend.py index add36b7..33b042d 100644 --- a/tests/test_sandbox/test_docker_backend.py +++ b/tests/test_sandbox/test_docker_backend.py @@ -134,7 +134,7 @@ def test_network_none_by_default(monkeypatch): assert argv[net_idx + 1] == "none" -def test_network_bridge_when_domains_allowed(monkeypatch): +def test_network_none_and_warning_when_domain_policy_is_configured(monkeypatch, caplog): monkeypatch.setattr( "openharness.sandbox.docker_backend.shutil.which", lambda name: "/usr/bin/docker", @@ -143,7 +143,10 @@ def test_network_bridge_when_domains_allowed(monkeypatch): sandbox=SandboxSettings( enabled=True, backend="docker", - network=SandboxNetworkSettings(allowed_domains=["github.com"]), + network=SandboxNetworkSettings( + allowed_domains=["github.com"], + denied_domains=["example.com"], + ), ) ) session = DockerSandboxSession(settings=settings, session_id="abc", cwd=Path("/repo")) @@ -151,7 +154,8 @@ def test_network_bridge_when_domains_allowed(monkeypatch): argv = session._build_run_argv() net_idx = argv.index("--network") - assert argv[net_idx + 1] == "bridge" + assert argv[net_idx + 1] == "none" + assert "does not enforce allowed_domains/denied_domains yet" in caplog.text def test_resource_limits_applied(monkeypatch):