From f2ee6801e1b314c5df3975313a95b275a8a9e745 Mon Sep 17 00:00:00 2001 From: AgileHub VIGILE Date: Sun, 31 May 2026 11:29:06 +0200 Subject: [PATCH] =?UTF-8?q?docs(handover):=20vault-steward=20chain=20fix?= =?UTF-8?q?=20(race=20+=20cli)=20=E2=80=94=2031/5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Race in audit.log() fixata con transazione + SELECT FOR UPDATE; CLI audit fix LIMIT bug; chain re-anchor entry id 23793. Doc completo in docs/INCOMING_FROM_AGILEHUB_2026_05_31_vault_chain_fix.md. Co-Authored-By: Claude Opus 4.7 --- CLAUDE.md | 17 ++++ ...ROM_AGILEHUB_2026_05_31_vault_chain_fix.md | 80 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 docs/INCOMING_FROM_AGILEHUB_2026_05_31_vault_chain_fix.md diff --git a/CLAUDE.md b/CLAUDE.md index a5650dd..630b15f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,6 +25,23 @@ **Spec completa**: `STANDARD_TIMEZONE_CONVENTIONS.md` (slug `timezone-conventions` v1.0, owner VIGILE). +## πŸ”΅ VAULT-STEWARD chain fix 2026-05-31 (informativo) + +> Aggiunto da VIGILE. Doc completo: `docs/INCOMING_FROM_AGILEHUB_2026_05_31_vault_chain_fix.md`. + +**Cosa Γ¨ cambiato nel vault-steward** (impatta solo chi fa troubleshooting/audit del vault): + +- `vault-cli.js audit [--last=N]` β†’ βœ… **ora funziona** (era rotto con `Incorrect arguments to mysqld_stmt_execute`, bug LIMIT prepared param di mysql2). +- `vault-cli.js verify-chain` β†’ ⚠️ mostra ancora `❌ Chain BROKEN at id=257` β€” Γ¨ **storico** (1645 race break documentati dal 25/4 al 31/5 per race condition cronica in `audit.log()`), **NON tampering, NON attacco**. Fix applicato (transazione + `SELECT FOR UPDATE` per serializzare writer concorrenti). Da `id=23793` in poi la chain HMAC Γ¨ di nuovo affidabile (entry marker `audit_chain_reanchor`). +- Le tue letture credenziali via wrapper vault al boot funzionano **identiche a prima** β€” zero cambiamenti lato API. + +**Stress test post-fix**: 50 letture concorrenti β†’ 0 nuovi race break (1647 β†’ 1647 invariato). + +**File modificati host-side**: `/opt/vault-steward/{audit.js, db.js, vault-cli.js}`, container ricreato con 2 nuovi bind-mount (downtime ~5s, nessun MS in regressione). Backup pre-fix in `/opt/vault-steward/backups-pre-chain-fix-20260531-091547/`. + +--- + + ## πŸ”΄ AGGIORNAMENTI AGILEHUB 2026-05-31 (vincolanti) > Aggiunto da AgileHub-side (VIGILE) su direttiva utente: "se devi segnalare aggiornamenti devi farlo per tutti i dockers dev". Doc completo: `docs/INCOMING_FROM_AGILEHUB_2026_05_31_email_send_fix_and_php_opcache.md`. diff --git a/docs/INCOMING_FROM_AGILEHUB_2026_05_31_vault_chain_fix.md b/docs/INCOMING_FROM_AGILEHUB_2026_05_31_vault_chain_fix.md new file mode 100644 index 0000000..9e9567a --- /dev/null +++ b/docs/INCOMING_FROM_AGILEHUB_2026_05_31_vault_chain_fix.md @@ -0,0 +1,80 @@ +# OUTGOING β†’ TUTTI i container DevEnv β€” Vault audit chain: race fix + CLI fix + storico (2026-05-31) + +> **Da**: AgileHub-side (VIGILE) +> **A**: ogni sessione Claude su tutti i dev container. +> **Trigger**: findings segnalati dalla sessione TRPG-side + direttiva utente "se devi segnalare aggiornamenti, devi farlo per tutti i dockers dev". Doc forense completa: `/opt/vault-steward/CHAIN_REANCHOR_2026_05_31.md` (host). + +--- + +## TL;DR β€” Cosa ti tocca sapere come sessione dev + +| Cosa | Stato dal 31/5 | +|---|---| +| `docker exec vault-steward node cli/vault-cli.js audit [--last=N]` | βœ… **ora funziona** (era rotto con `Incorrect arguments to mysqld_stmt_execute`) | +| `docker exec vault-steward node cli/vault-cli.js verify-chain` | ⚠️ **mostra ancora `❌ Chain BROKEN at id=257`** β€” Γ¨ **storico**, NON panico, NON tampering | +| Nuove entry audit (post `id=23793`) | βœ… chain HMAC affidabile per la prima volta | +| Le tue letture credenziali via vault wrapper (boot MS) | βœ… funzionano identiche a prima (lato API zero cambiamenti) | + +**Bottom line**: nessun impatto sul tuo lavoro quotidiano. Se fai troubleshooting/audit del vault, leggi sotto. + +--- + +## Il bug che Γ¨ stato chiuso + +Dal **2026-04-25 (boot vault) al 2026-05-31** la funzione `audit.log()` aveva una **race condition concorrente fra writer paralleli** (SELECT prev_hash + INSERT senza transazione β†’ due scritture parallele leggevano lo stesso prev_hash e inserivano entrambe con quello, "vecchio di una posizione"). Risultato: **1645 race break su 23.727 entry** (~7% delle scritture corrompeva il linkage HMAC della chain), ~43 break/giorno sotto carico normale. + +**Smoking gun** (row 257): +``` +Row 256: prev_hash=1822f8… row_hash=a7ced0… 15:52:02.263783 +Row 257: prev_hash=1822f8… row_hash=6a594e… 15:52:02.266327 + ^^^^^^^ ^^^^^^^^^^^^^^^ + stesso prev_hash di 256 scritta 2.5 ms dopo +``` +Stesso actor `agile-services-devenv-runtime`, race di 2.5 ms. + +**NON era tampering** (pattern temporale + actor identici = race del codice, non attacco). + +## Il fix (LIVE da 31/5 ~11:23 UTC) + +1. **`audit.log()` riscritta** con transazione + `SELECT ... FOR UPDATE` (serializza writer concorrenti). +2. **`db.js`** esporta `getConnection()` per transazioni. +3. **`vault-cli.js audit`** fix LIMIT (mysql2 `execute()` non binda LIMIT β†’ interpolazione safe con `parseInt + clamp`). +4. **Re-anchor entry**: id **23793** action `audit_chain_reanchor` hash `ea41503cace7828d…` β€” marker della "nuova chain pulita". + +**Validazione**: stress test 50 letture concorrenti dopo il fix β†’ **0 nuovi race break** (1647 β†’ 1647 invariato). Container ricreato con downtime ~5s, nessun MS in regressione. + +## Cosa significa per te quando vedi `verify-chain β†’ BROKEN at id=257` + +**NON Γ¨ un attacco in corso.** È il primo dei 1645 race break storici. Per verifiche forensi affidabili: +- Le entry `id < 23793` esistono come *record valido* (actor/action/target/success leggibili) ma il chain HMAC non Γ¨ verificabile come catena unica continua β€” solo a pezzi fra un break e il successivo. +- Le entry `id β‰₯ 23793` formano una chain HMAC verificabile end-to-end. + +Se vuoi controllare l'integritΓ  della parte recente: +```bash +docker exec vault-steward node -e " +const db = require('/app/db'), audit = require('/app/audit'), fs = require('fs'); +db.init({ host: process.env.VAULT_DB_HOST, port: 3306, database: 'vault_db', + user: 'vault_user', password: fs.readFileSync(process.env.VAULT_DB_PASS_FILE, 'utf8').trim() }) + .then(() => audit.verifyChain()) + .then(r => { console.log(r); return db.close(); }); +" +``` +(o pi ucomodamente `vault-cli.js verify-chain`, ma Γ¨ in TODO un parametro `--from=` per partire dal reanchor.) + +## File modificati lato host (per chi fa rollback/manutenzione) + +- `/opt/vault-steward/audit.js` β€” nuova `log()` transazionale (era nell'image, ora bind-mountato). +- `/opt/vault-steward/db.js` β€” aggiunta `getConnection()` (era nell'image, ora bind-mountato). +- `/opt/vault-steward/vault-cli.js` β€” fix LIMIT (giΓ  bind-mountato). +- Container ricreato con i 2 nuovi `-v` (prima solo `vault-cli.js`+`server.js` erano bind-mounted). +- Backup pre-fix in `/opt/vault-steward/backups-pre-chain-fix-20260531-091547/`. + +## Riferimenti + +- Doc forense completa: `/opt/vault-steward/CHAIN_REANCHOR_2026_05_31.md` (200+ righe). +- VIGILE audit log: `agile-services/docs/VIGILE_AUDIT_LOG.md` entry `[VAULT-CHAIN-FIX]` 31/5 11:25 UTC. +- Standard cross-suite `vault-steward-credential-management` (`hub_standards` id=7): valido + ora con chain HMAC effettivamente reliable. + +--- + +**Fine documento.** Lavorate sicuri.