fix(mcp): enforce exact replay sandbox contract

This commit is contained in:
ogt
2026-07-15 11:07:00 +08:00
parent 387f84132d
commit e2cd70501d
5 changed files with 140 additions and 24 deletions

View File

@@ -157,7 +157,23 @@ class ReplayPolicyTests(unittest.TestCase):
path = self._mutated_policy(
lambda payload: payload["runtime"].__setitem__("user", "0:0")
)
with self.assertRaisesRegex(controller.ReplayError, "runtime_user_invalid"):
with self.assertRaisesRegex(controller.ReplayError, "runtime_isolation_invalid"):
controller.load_policy(path)
def test_runtime_memory_limit_cannot_be_weakened(self) -> None:
path = self._mutated_policy(
lambda payload: payload["runtime"].__setitem__("memory_limit", "2g")
)
with self.assertRaisesRegex(controller.ReplayError, "runtime_isolation_invalid"):
controller.load_policy(path)
def test_runtime_argument_order_is_part_of_allowlist(self) -> None:
def mutate(payload: dict) -> None:
arguments = payload["runtime"]["arguments"]
arguments[2], arguments[4] = arguments[4], arguments[2]
path = self._mutated_policy(mutate)
with self.assertRaisesRegex(controller.ReplayError, "arguments_not_allowlisted"):
controller.load_policy(path)
def test_floating_runtime_reference_is_rejected(self) -> None:
@@ -178,6 +194,13 @@ class ReplayPolicyTests(unittest.TestCase):
with self.assertRaisesRegex(controller.ReplayError, "execution_boundary_invalid"):
controller.load_policy(path)
def test_candidate_identity_cannot_be_retargeted(self) -> None:
path = self._mutated_policy(
lambda payload: payload.__setitem__("candidate_id", "external.other")
)
with self.assertRaisesRegex(controller.ReplayError, "replay_asset_identity_invalid"):
controller.load_policy(path)
def test_dangerous_tool_cannot_leave_denied_partition(self) -> None:
def mutate(payload: dict) -> None:
payload["protocol_contract"]["adapter_denied_tools"].remove(

View File

@@ -154,6 +154,26 @@ class StandalonePolicyTests(unittest.TestCase):
with self.assertRaisesRegex(verifier.VerifierError, "artifact_ref_invalid"):
verifier.load_and_validate_policy(path)
def test_runtime_resource_limits_cannot_be_weakened(self) -> None:
with tempfile.TemporaryDirectory() as temp:
payload = _policy_payload()
payload["runtime"]["pids_limit"] = 512
path = Path(temp) / "policy.json"
_write(path, payload)
with self.assertRaisesRegex(verifier.VerifierError, "runtime_isolation_invalid"):
verifier.load_and_validate_policy(path)
def test_runtime_argument_order_drift_is_rejected(self) -> None:
with tempfile.TemporaryDirectory() as temp:
payload = _policy_payload()
payload["runtime"]["arguments"] = list(
reversed(payload["runtime"]["arguments"])
)
path = Path(temp) / "policy.json"
_write(path, payload)
with self.assertRaisesRegex(verifier.VerifierError, "runtime_isolation_invalid"):
verifier.load_and_validate_policy(path)
class ControllerReceiptTests(unittest.TestCase):
def test_valid_controller_receipt_passes_standalone_validation(self) -> None: