{"id":"c1406","filename":"c1406_recovery_token_bypass_kriticno_dif_uhvatio.dok.json","weise3_id":"c8c2034b25819c7c1f91339b3e7f56d42dd747df96855150ef156de64b8618e9","tip":"sigurnosni_nalaz_kritican","naziv":"KRITIČNO: recovery_token NIJE enforced (EU) → persist-fix-sam = otmica identiteta. Dif uhvatio prije deploya.","kreator":"genesis","datum":"2026-06-15","snippet":"","status":"","prev_weise3":"","bunker_l":"#78b052","full":{"cid":"c1406","tip":"sigurnosni_nalaz_kritican","format":"DOKARH-2026 v2.0","naziv":"KRITIČNO: recovery_token NIJE enforced (EU) → persist-fix-sam = otmica identiteta. Dif uhvatio prije deploya.","datum":"2026-06-15","server":"EU","weise3_id":"c8c2034b25819c7c1f91339b3e7f56d42dd747df96855150ef156de64b8618e9","povod":"Ivan trazio DIF persist-fixa za /vrati PRIJE deploya (max-oprez karika: recovery pise BEZ dokaza posjeda starog kljuca). Dif-citanje + empirijski test otkrili kriticnu rupu.","nalaz_kriticni":{"rupa":"recovery_token NIJE enforced na EU. daj_udio_lokalno preskace token check kad genesis_identitet ne postoji (lin 249 \"node-to-node auth dovoljan\"); pohrani_recovery_meta sprema token_hash u genesis_identitet (ne postoji) → token NIKAD spremljen ni provjeren.","empirijski_dokaz":"/vrati s KRIVIM tokenom (0000..) → stigao do persist-500, NE 403. Token zaobidjen, potvrdjeno.","exploit":"Random napadac koji zna weise3_id (polu-javan) → POST /vrati {garbage token, svoj novi kljuc} → server rekonstruira (EU LocalCuvar direktan, token-bypass) → persist postavi napadacev kljuc → OTMICA identiteta.","sto_stiti_sad":"JEDINO persist-500 (genesis_identitet ne postoji za UPDATE). 500 je slucajna, load-bearing zastita.","da_sam_deployao_fix1":"Persist .dokarh write bez auth-fixa bi AKTIVIRAO remote otmicu za sve korisnike s dosegljivim dionicama (pojacano: EU drzi K=2 za 33)."},"/daj_M2M":"/daj direktno trazi auth polje (M2M node-to-node) → 422 random napadacu. Nije random-exploit put. /vrati JE (javan).","REAL_FIX_zaseban_careful":{"1_auth":"recovery meta (token_hash, salt) → .dokarh (postoji na EU); daj_udio_lokalno MORA verificirati recovery_token iz .dokarh; UKLONITI \"node-to-node auth dovoljan\" bypass kad genesis_identitet ne postoji.","2_persist":"TEK kad auth stoji: .dokarh write novog kljuca — ATOMARAN (temp+os.replace), .bak KORISNIKOVOG .dokarh prije prepisa (ne samo source), stari_pubkey HISTORIJA (kao c1399).","3_koncentracija":"RECOVERY_NODE_NEW → stvarni NEW server (defense-in-depth: i s tokenom, EU drzi K → EU DB kompromis = offline rekonstrukcija).","redoslijed":"auth-fix PRVI (ili zajedno s persist). NIKAD persist sam."},"NE_DEPLOYANO":"Fix 1 (persist sam) NIJE deployan. Dif-zahtjev ga zaustavio.","karika4":"🔴 KRITICNO: recovery slomljen (500) + auth zaobidjen (token ne-enforced, remote otmica latentna) + koncentracija ziva. Daleko od zelene. 500 je load-bearing.","veza":"c1405 (roundtrip dijagnoza) · c1404 (karta) · c1399 (rotacija persist obrazac)","zakon":"ZAKON NAD ZAKONIMA (DIF prije deploya uhvatio minu; empirijski potvrdjeno) · ZAKON 29 (sigurnost default) · ZAKON 46 (sustav tvrdi suvereni autoriziran recovery, mjereno NIJE) · recovery NEPOVRATAN","citacija":"Recovery pise bez dokaza posjeda starog kljuca — pa cime je autoriziran? Mjereno: nicim. 500 je slucajno jedina brava.","krunica_hash":"c8c2034b25819c7c1f91339b3e7f56d42dd747df96855150ef156de64b8618e9"}}