CNCK0NSULTAI-Truthuni0naiHackatonipIII ↗k0nsult.dev ↗ dla botówDomeny osobne, spięte siecią CNC + kernelem.
K0NSULT // ai-truth/ipIII
k0nsult.cloud / ai-truth / ipIII / evidence / chain-of-custody

Chain-of-Custody Viewer — jak czytać łańcuch dowodowy evidence-package

Kto zebrał dowód, kiedy, jaki hash, jaka akcja, czy była akceptacja — to cztery/pięć pól, które muszą się zgadzać dla każdego evidence w paczce board-pack. Ta strona pokazuje format chain_of_custody (JSONB w tabeli ip3_evidence), jak go czytać krok po kroku i jak łączy się z niezależnym hash-chain audytu (F2). Przykład poniżej jest w całości syntetyczny — dane demonstracyjne, nie realny incydent.

Po co ta strona. Chain-of-custody to podstawa wiarygodności dowodu przed regulatorem, audytorem lub zespołem prawnym: bez niego evidence-package to tylko plik z hashem, bez śladu kto i kiedy go zebrał i czy przeszedł akceptację. Ten viewer tłumaczy format pole-po-polu i pokazuje, gdzie kończy się dzisiejszy MVP, a gdzie zaczyna ROADMAP (podpis kwalifikowany, WORM storage).
Chain-of-custody = JSONB tablica zdarzeń, nie osobny system.

Każdy rekord w ip3_evidence ma kolumnę chain_of_custody JSONB — tablicę obiektów {by, at, action, request_id} dopisywanych przy każdej istotnej operacji na dowodzie (zebranie, zmiana statusu, dołączenie do paczki). To jest dzisiejszy, dowodliwy mechanizm (kod + endpoint + test), NIE deklaracja niezmienności prawnej.

PRZEPŁYW: evidence collected (coc[0])status change (coc[1..n])evidence-package buildaudit hash-chain (F2, równolegle)board pack z manifestem

Format: pole po polu

PoleTypZnaczenieStatus
bystringIdentyfikator aktora (req.principal.sub) — kto wykonał akcję na dowodzie.LIVE
atISO-8601 timestampMoment zapisu zdarzenia (serwer, UTC).LIVE
actionstringNazwa akcji, np. collected, status_change, attached_to_package.LIVE
request_idstringKorelacja z logiem żądania HTTP — pozwala odtworzyć kontekst wywołania.LIVE
approvalobiekt (kto/kiedy zatwierdził)Formalna akceptacja zmiany statusu przez drugą osobę (four-eyes).ROADMAP
podpis polaPAdES/HMAC per-wpisKryptograficzne podpisanie każdego wpisu CoC osobno (dziś podpisywana jest cała paczka, nie pojedynczy wpis).ROADMAP

Uczciwie: approval jako osobne, wymuszone pole four-eyes nie jest dziś egzekwowane w schemacie — status-change może dopisać każdy z rolą operator/admin. To oznaczamy jako ROADMAP, nie jako lukę ukrytą.

Przykład syntetyczny — trace 3 kroków (SYMULACJA)

Poniższe dane są w całości zmyślone na potrzeby ilustracji formatu. Incydent, hashe i identyfikatory nie odnoszą się do żadnego realnego zdarzenia.

{
  "evidence_id": "K0-EVD-SYN-0007",
  "incident_public_id": "K0-INC-SYN-0042",
  "evidence_type": "scanner_report",
  "hash_sha256": "7a1c…f30e (SYMULACJA)",
  "status": "COLLECTED → TRIAGED → PACKAGED",
  "chain_of_custody": [
    { "by": "analyst@synthetic",  "at": "2026-07-05T08:12:03Z", "action": "collected",           "request_id": "req_syn_0001" },
    { "by": "reviewer@synthetic", "at": "2026-07-05T09:40:11Z", "action": "status_change:triaged","request_id": "req_syn_0002" },
    { "by": "auditor@synthetic",  "at": "2026-07-05T14:02:55Z", "action": "attached_to_package",  "request_id": "req_syn_0003" }
  ]
}
1. analyst@synthetic — collected
2026-07-05 08:12:03 UTC · request_id req_syn_0001

Dowód (raport skanera) wgrany do systemu, policzony sha256, pierwszy wpis CoC dopisany automatycznie przy insercie.

2. reviewer@synthetic — status_change: triaged
2026-07-05 09:40:11 UTC · request_id req_syn_0002

Zmiana statusu z COLLECTED na TRIAGED; drugi wpis dopisany do tej samej tablicy JSONB (append, nie nadpisanie).

3. auditor@synthetic — attached_to_package
2026-07-05 14:02:55 UTC · request_id req_syn_0003

Evidence dołączony do evidence-package/board-pack; manifest paczki referencuje evidence_id + pełną tablicę CoC.

Jak to czytać: reguła sprawdzenia

Krok 1 — kompletność. Tablica chain_of_custody nie może być pusta dla dowodu w statusie innym niż nowo utworzony. Reguła close-with-evidence sprawdza cocOk (długość > 0) przed zamknięciem incydentu.
Krok 2 — chronologia. Pola at powinny rosnąć monotonicznie; skok wstecz lub duplikat znacznika czasu to sygnał do ręcznej weryfikacji, nie automatyczne odrzucenie (dziś brak automatycznej walidacji kolejności — ROADMAP).
Krok 3 — korelacja z audytem. Każdy request_id z CoC da się odnaleźć w niezależnym logu audytowym (ip3_audit_events / hash-chain F2) — dwa źródła powinny się zgadzać.
Krok 4 — integralność paczki. Manifest evidence-package zawiera package_sha256 całości; przy ?sign=true (F2) dochodzi HMAC-SHA256 podpisu paczki, weryfikowalny przez POST /reports/verify-signature.

Powiązanie z hash-chain audytu (F2)

Chain-of-custody per-dowód (opisany wyżej) i hash-chain audytu to dwa różne, uzupełniające się mechanizmy — nie mylić:

Chain-of-custody (ta strona)

Zakres: pojedynczy dowód w ip3_evidence.

Format: JSONB tablica zdarzeń {by, at, action, request_id}.

Status: LIVE — działa od pierwszej fali evidence-package.

Hash-chain audytu (F2)

Zakres: cały strumień zdarzeń audytowych systemu (nie tylko evidence).

Format: każdy wpis audytowy linkowany SHA-256 do poprzedniego (prev_hashhash); modyfikacja jednego ogniwa jest wykrywalna przez GET /api/ip3/v1/audit/chain/verify.

Status: shadow LIVE na prod za flagą IP3_AUDIT_CHAIN — pisze równolegle do audytu bazowego, dziś nie zastępuje go.

Podpis paczki (F2)

Zakres: evidence-package/board-pack jako całość, nie pojedynczy wpis CoC.

evidence-package?sign=true → HMAC-SHA256 kluczem serwera, weryfikacja POST /reports/verify-signature.

Status: LIVE. Uczciwie: HMAC integrity ≠ kwalifikowany podpis eIDAS/PAdES/TSA — to ROADMAP.

Innymi słowy: CoC odpowiada na pytanie „kto dotykał tego dowodu i kiedy", hash-chain audytu odpowiada na pytanie „czy cały log zdarzeń jest nienaruszony", a podpis paczki odpowiada na pytanie „czy ta konkretna paczka board-pack jest tym samym plikiem, który wygenerowano". Trzy różne dowody, jeden cel: żeby przed sądem lub regulatorem nie trzeba było wierzyć nam na słowo.

Skrót statusu

4
Pola CoC LIVE
by · at · action · request_id
1
Mechanizm shadow
hash-chain audytu (F2, flaga)
2
ROADMAP
approval four-eyes · podpis PAdES/TSA per-wpis
0
Realnych incydentów w przykładzie
wszystkie dane = SYMULACJA

Czego ta strona NIE oznacza

To nie jest dedykowany osobny system CoC. Chain-of-custody to kolumna JSONB w istniejącej tabeli ip3_evidence, dopisywana przez te same endpointy co reszta cyklu evidence (import → incydent → evidence-package → retest → close). Nie ma osobnej bazy danych CoC ani osobnego API — to jedna spójna warstwa.
Tamper-evident ≠ nieusuwalny. Hash-chain audytu (F2) wykrywa cichą modyfikację wpisu — to nie jest to samo co WORM storage (write-once-read-many), które pozostaje ROADMAP. Zgodnie z doktryną claim ≤ proof: mówimy „wykrywalne", nie „niemożliwe do naruszenia".

Powiązane: weryfikacja hashy i podpisu paczki → /verify · chain-of-custody działań agenta AI (osobny mechanizm, prev_hash na poziomie agenta) → /agent-coc · pełny przepływ finding → board pack → /pentest-report-board-pack · ćwiczenie purple-team na własnym serwisie → /pentest-self · rejestr ograniczeń → /known-limitations.