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
| # | Problema | Dove | Come è stato chiuso | Test |
|---|---|---|---|---|
| 1 | Inbox 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 sync | api/v3/activitypub.py, federacao/ingestao.py | rotta 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 malformati | test_federacao_inbox_segura.py |
| 2 | Token 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.py | emittente locale solo con la chiave su disco; una mucua esterna risponde solo delle proprie mocambolas; mucua e username ricalcolati; IdP esterno sempre USER | test_token_federado_recalcula_papel.py |
| 3 | Download di allegati, miniature e copertina di raccolta senza controllo di lettura: acl, privato, bozza e galassia riservata uscivano verso gli anonimi | services/saber_service.py, api/v3/saberes.py, colecoes.py | content_path, thumbnail_path, colecao_mosaico_path ricevono actor e passano per can(READ) | test_vazamentos_de_leitura.py |
| 4 | XSS: [x](javascript:…) nel markdown e URL dei campi del saber diventavano link eseguibili | front lib/util/markdown.ts e pagine | hrefSeguro | — |
| 5 | SVG servito inline dall'API sulla stessa origine del sito eseguiva script | api/v3/saberes.py | CSP sandbox + nosniff | — |
| 6 | Nessun limite ai tentativi di password (/auth/login, /auth/token, /xmpp/extauth) | services/auth.py | freno per account (10 errori in 15 min) | test_freio_login.py |
| 7 | git clone <url> con url proveniente dall'API: --upload-pack=… avrebbe eseguito un comando | infra/sync/*.py | -- e rifiuto delle url che iniziano con - | — |
| 8 | extauth di XMPP raggiungibile da internet | nginx | allow 127.0.0.1 | — |
Cavità che restano (da decidere con la comunità)
- Il
password_hashviaggia 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 dalsaber.bbx(come le chiavi private) o passare ad Argon2/scrypt, più costosi. - 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.
- 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 cookieHttpOnlyletto dall'API. - Token nel
localStorage+ cookie senzaHttpOnly. Qualsiasi XSS ruba la sessione.hrefSegurochiude il caso noto; una CSP sul front chiuderebbe l'intera classe. BBX_CADASTRO_ABERTO=ondi 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.- L'API ascolta su
0.0.0.0:8000(necessario per la rete locale e per Tor), con/docsaperto. ValutareBBX_DOCS=offin produzione. - 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 attivareBBX_FED_AP, definire di quali galassie fidarsi. SaberServicedi 4000 righe. Dividerlo per argomento (lettura, scrittura, raccolte, eventi, struttura) facilita la revisione di sicurezza.- Front con ~55 errori di tipo (
npm run check). permissions.pode_administrar_instanciarestituisceTruequando non riesce a leggere l'identità locale ("comportamento vecchio"). In produzione non succede, ma fallire chiuso sarebbe più sicuro.
Esercizi di fine corso
- Cavità 2: fai ricalcolare il ruolo in
deps._moc_from_tokena ogni richiesta (come i gruppi), con una cache breve. Scrivi prima il test. - Cavità 6: aggiungi
BBX_DOCS=offinapi/v3/app.pye nelbackend.envdel pacchetto. - Cavità 4: scrivi una Content-Security-Policy per SvelteKit (
kit.cspinsvelte.config.js) e scopri cosa si rompe. - Nuova nature: crea la nature
cantiga(testo, interprete, territorio, audio) solo tramite l'API, senza toccare il codice. Cosa è mancato? - Una vera rotta sneakernet: con due macchine e una chiavetta USB, monta una richiesta che attraversi tre mucua.
Glossario
| Termine | Nel codice | Vuol dire |
|---|---|---|
| saber | core/saber.py | qualunque cosa custodita; l'unità |
| nature | natures/ | il tipo di un saber |
| mucua | infra/mucua_local.py | un'istanza (il frutto del baobab) |
| galassia (galáxia) | SaberRepository | un archivio = un repository git |
| mocambola | nature mocambola | una persona |
| territorio (território) | nature territorio | il suolo di una mucua |
| Sankofa | infra/sankofa.py | la facciata di git/annex (tornare indietro a prendere) |
| link | services/links.py | un remote git di una galassia |
| rotta (rota) | nature rota | percorso fisico di sneakernet |
| richiesta (pedido) | nature pedido | "voglio una copia di questo file" |
| lente / applicazione | applications/ | un modo di guardare i saberes |
| OXALÁ, PAJÉ, USER | constants.ROLE_* | ruoli (galassia, mucua, sé stessi) |
| gestore locale (gestor local) | mucua_local.gestores_locais | co-amministratore invitato da questa macchina |
| provenienza (procedência) | data.enriquecimento | cosa ha fatto la macchina con un allegato |
| faro (farol) | infra/farol_lan.py | l'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à.
