Parte IV — Chioma, suolo e cura

11 · Prendersi cura dell'albero

Il baobab vecchio ha una cavità nel tronco, e anche la cavità fa parte dell'albero. Questo modulo elenca le cavità trovate dalla revisione di ottobre 2026 — quelle chiuse e quelle che restano come lavoro della comunità.

Corretti nella 3.3

#ProblemaDoveCome è stato chiusoTest
1Inbox ActivityPub sempre montata, senza firma, con upsert sull'uuid scelto da chi invia: chiunque poteva sovrascrivere il saber di un OXALÁ, della mucua o della galassia, e il commit si propagava con il syncapi/v3/activitypub.py, federacao/ingestao.pyrotta solo con BBX_FED_AP=on; HTTP Signature di una mucua conosciuta (Digest + Date); l'ingestione non tocca i saberes locali, non accetta identità né uuid malformatitest_federacao_inbox_segura.py
2Token EdDSA di un'altra mucua: qualunque mucua conosciuta emetteva un token con il sub di un OXALÁ locale e mucua = locale, e otteneva l'amministrazione dell'istanza; una copia falsificata del saber della mucua locale permetteva di emettere token "locali"services/auth.pyemittente locale solo con la chiave su disco; una mucua esterna risponde solo delle proprie mocambolas; mucua e username ricalcolati; IdP esterno sempre USERtest_token_federado_recalcula_papel.py
3Download di allegati, miniature e copertina di raccolta senza controllo di lettura: acl, privato, bozza e galassia riservata uscivano verso gli anonimiservices/saber_service.py, api/v3/saberes.py, colecoes.pycontent_path, thumbnail_path, colecao_mosaico_path ricevono actor e passano per can(READ)test_vazamentos_de_leitura.py
4XSS: [x](javascript:…) nel markdown e URL dei campi del saber diventavano link eseguibilifront lib/util/markdown.ts e paginehrefSeguro—
5SVG servito inline dall'API sulla stessa origine del sito eseguiva scriptapi/v3/saberes.pyCSP sandbox + nosniff—
6Nessun limite ai tentativi di password (/auth/login, /auth/token, /xmpp/extauth)services/auth.pyfreno per account (10 errori in 15 min)test_freio_login.py
7git clone <url> con url proveniente dall'API: --upload-pack=… avrebbe eseguito un comandoinfra/sync/*.py-- e rifiuto delle url che iniziano con -—
8extauth di XMPP raggiungibile da internetnginxallow 127.0.0.1—

Cavità che restano (da decidere con la comunità)

  1. Il password_hash viaggia nel git. Ogni galassia clonata porta gli hash di tutti gli account. PBKDF2 con 200 mila iterazioni rallenta, ma non impedisce un attacco offline. Strada: portare la password fuori dal saber.bbx (come le chiavi private) o passare ad Argon2/scrypt, più costosi.
  2. Token di 7 giorni con il ruolo timbrato. Declassare qualcuno vale solo dal login successivo. I gruppi sono già risolti a ogni richiesta — il ruolo può seguire la stessa strada, oppure il token può durare meno con rinnovo.
  3. Token nella query string (?access_token=) per <img>/<video>: resta nel log di nginx e nella cronologia. Strada: token breve solo per i media, o cookie HttpOnly letto dall'API.
  4. Token nel localStorage + cookie senza HttpOnly. Qualsiasi XSS ruba la sessione. hrefSeguro chiude il caso noto; una CSP sul front chiuderebbe l'intera classe.
  5. BBX_CADASTRO_ABERTO=on di default nel pacchetto: su una mucua esposta a internet, chiunque crea un account e carica file fino a 4 GB, che si sincronizzano verso la rete.
  6. L'API ascolta su 0.0.0.0:8000 (necessario per la rete locale e per Tor), con /docs aperto. Valutare BBX_DOCS=off in produzione.
  7. Federazione AP incompleta: le consegne ora escono firmate, ma non c'è un registro dei follower (seguidores_inbox), e la pubkey di una mucua può arrivare da qualunque galassia installata. Prima di attivare BBX_FED_AP, definire di quali galassie fidarsi.
  8. SaberService di 4000 righe. Dividerlo per argomento (lettura, scrittura, raccolte, eventi, struttura) facilita la revisione di sicurezza.
  9. Front con ~55 errori di tipo (npm run check).
  10. permissions.pode_administrar_instancia restituisce True quando non riesce a leggere l'identità locale ("comportamento vecchio"). In produzione non succede, ma fallire chiuso sarebbe più sicuro.

Esercizi di fine corso

  1. Cavità 2: fai ricalcolare il ruolo in deps._moc_from_token a ogni richiesta (come i gruppi), con una cache breve. Scrivi prima il test.
  2. Cavità 6: aggiungi BBX_DOCS=off in api/v3/app.py e nel backend.env del pacchetto.
  3. Cavità 4: scrivi una Content-Security-Policy per SvelteKit (kit.csp in svelte.config.js) e scopri cosa si rompe.
  4. Nuova nature: crea la nature cantiga (testo, interprete, territorio, audio) solo tramite l'API, senza toccare il codice. Cosa è mancato?
  5. Una vera rotta sneakernet: con due macchine e una chiavetta USB, monta una richiesta che attraversi tre mucua.

Glossario

TermineNel codiceVuol dire
sabercore/saber.pyqualunque cosa custodita; l'unità
naturenatures/il tipo di un saber
mucuainfra/mucua_local.pyun'istanza (il frutto del baobab)
galassia (galáxia)SaberRepositoryun archivio = un repository git
mocambolanature mocambolauna persona
territorio (território)nature territorioil suolo di una mucua
Sankofainfra/sankofa.pyla facciata di git/annex (tornare indietro a prendere)
linkservices/links.pyun remote git di una galassia
rotta (rota)nature rotapercorso fisico di sneakernet
richiesta (pedido)nature pedido"voglio una copia di questo file"
lente / applicazioneapplications/un modo di guardare i saberes
OXALÁ, PAJÉ, USERconstants.ROLE_*ruoli (galassia, mucua, sé stessi)
gestore locale (gestor local)mucua_local.gestores_locaisco-amministratore invitato da questa macchina
provenienza (procedência)data.enriquecimentocosa ha fatto la macchina con un allegato
faro (farol)infra/farol_lan.pyl'annuncio sulla rete locale

Chiusura

Un baobab non è di chi l'ha piantato: è di chi si siede sotto di lui. Anche il codice. Leggetelo insieme, non siate d'accordo con i commenti, scrivete test per le storie della vostra comunità.

vedi questo capitolo come sapere