whitehat-security/src/whitehat_security/audit_fixtures.py
tegwick 95129d7a35 Add governed test plane and close T04/T08
Encode fail-closed admission, target registrations, and a credential
broker that never returns secret values. Calibrate audit-core shaped
probes in-process. Send no packets and request no live credentials.

Assistant: grok
Assistant-Session: 01a02670-3345-76f2-a014-70fde8e2a2bb
2026-08-22 00:44:21 +02:00

83 lines
3 KiB
Python

from __future__ import annotations
from copy import deepcopy
from dataclasses import dataclass
from .differential import DifferentialProbe
from .model import Response
@dataclass
class AuditFixture:
"""In-process audit-core shape used to calibrate the E2 pack. No sockets."""
enforce_tenant: bool
def __post_init__(self) -> None:
self.events = {
"event-a": {
"id": "event-a", "tenant": "tenant-a",
"correlation_id": "corr-shared", "label": "fixture-a",
},
"event-b": {
"id": "event-b", "tenant": "tenant-b",
"correlation_id": "corr-shared", "label": "fixture-b",
},
}
def snapshot_events(self) -> object:
return deepcopy(self.events)
def _visible(self, actor_tenant: str, item: dict) -> bool:
return (not self.enforce_tenant) or item["tenant"] == actor_tenant
def get(self, actor_tenant: str, event_id: str) -> Response:
item = self.events.get(event_id)
if item is None or not self._visible(actor_tenant, item):
return Response(404, {"error": "not_found"})
return Response(200, deepcopy(item))
def by_correlation(self, actor_tenant: str, correlation_id: str) -> Response:
items = [
deepcopy(item) for item in self.events.values()
if item["correlation_id"] == correlation_id and self._visible(actor_tenant, item)
]
return Response(200, {"events": items})
def append(self, actor_tenant: str, event: dict) -> Response:
if self.enforce_tenant and event["tenant"] != actor_tenant:
return Response(403, {"error": "forbidden"})
self.events[event["id"]] = deepcopy(event)
return Response(202, {"id": event["id"], "tenant": event["tenant"]})
def audit_probe_suite(service: AuditFixture) -> list[DifferentialProbe]:
markers = ("event-b", "tenant-b", "fixture-b")
forged = {
"id": "event-forged-b", "tenant": "tenant-b",
"correlation_id": "corr-shared", "label": "fixture-forged",
}
return [
DifferentialProbe(
"audit-event-by-id", "read",
lambda: service.get("tenant-b", "event-b"),
lambda: service.get("tenant-a", "event-b"),
lambda: service.get("tenant-a", "absent"),
markers,
),
DifferentialProbe(
"audit-correlation-slice", "read",
lambda: service.by_correlation("tenant-b", "corr-shared"),
lambda: service.by_correlation("tenant-a", "corr-shared"),
lambda: service.by_correlation("tenant-a", "corr-absent"),
markers, hide_existence=False,
),
DifferentialProbe(
"audit-append-as-b", "create",
lambda: Response(202, {"id": "owner-control"}),
lambda: service.append("tenant-a", forged),
lambda: Response(403, {"error": "forbidden"}),
markers + ("event-forged-b",),
state=service.snapshot_events, hide_existence=False,
),
]