fix(mcp): enforce exact replay sandbox contract
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user