Parte IV — Copa, chão e cuidado

11 · Cuidar da árvore

Baobá velho tem oco no tronco, e o oco também é parte da árvore. Este módulo lista os ocos que a análise de outubro de 2026 encontrou — os que foram fechados e os que ficam como trabalho da comunidade.

Corrigidos na 3.3

#ProblemaOndeComo foi fechadoTeste
1Inbox ActivityPub sempre montada, sem assinatura, com upsert no uuid escolhido por quem envia: qualquer pessoa sobrescrevia o saber de um OXALÁ, da mucua ou da galáxia, e o commit se espalhava no syncapi/v3/activitypub.py, federacao/ingestao.pyrota só com BBX_FED_AP=on; HTTP Signature de mucua conhecida (Digest + Date); ingestão não toca saber local, não aceita identidade nem uuid malformadotest_federacao_inbox_segura.py
2Token EdDSA de outra mucua: qualquer mucua conhecida emitia token com o sub de um OXALÁ local e mucua = local, e ganhava a administração da instância; uma cópia forjada do saber da mucua local permitia emitir tokens "locais"services/auth.pyemissor local só com a chave do disco; mucua de fora só responde pelas próprias mocambolas; mucua e username recalculados; IdP externo sempre USERtest_token_federado_recalcula_papel.py
3Download de anexo, thumbnail e capa de coleção sem checagem de leitura: acl, privado, rascunho e galáxia restrita saíam para anônimoservices/saber_service.py, api/v3/saberes.py, colecoes.pycontent_path, thumbnail_path, colecao_mosaico_path recebem actor e passam por can(READ)test_vazamentos_de_leitura.py
4XSS: [x](javascript:…) no markdown e URLs de campos do saber viravam links executáveisfront lib/util/markdown.ts e páginashrefSeguro—
5SVG servido inline pela API na mesma origem do site executava scriptapi/v3/saberes.pyCSP sandbox + nosniff—
6Sem limite de tentativas de senha (/auth/login, /auth/token, /xmpp/extauth)services/auth.pyfreio por conta (10 erros em 15 min)test_freio_login.py
7git clone <url> com url vinda da API: --upload-pack=… executaria comandoinfra/sync/*.py-- e recusa de url que começa com -—
8extauth do XMPP alcançável pela internetnginxallow 127.0.0.1—

Ocos que ficam (para a comunidade decidir)

  1. password_hash viaja no git. Toda galáxia clonada leva os hashes de todas as contas. PBKDF2 com 200 mil rodadas atrasa, mas não impede ataque offline. Caminho: mover a senha para fora do saber.bbx (como as chaves privadas) ou trocar por Argon2/scrypt mais caro.
  2. Token de 7 dias com o papel carimbado. Rebaixar alguém só vale no próximo login. Os grupos já são resolvidos por requisição — o papel pode seguir o mesmo caminho, ou o token pode durar menos com renovação.
  3. Token na query string (?access_token=) para <img>/<video>: fica no log do nginx e no histórico. Caminho: token curto só para mídia, ou cookie HttpOnly lido pela API.
  4. Token no localStorage + cookie sem HttpOnly. Qualquer XSS rouba a sessão. O hrefSeguro fecha o caso conhecido; uma CSP no front fecharia a classe inteira.
  5. BBX_CADASTRO_ABERTO=on por padrão no pacote: numa mucua exposta na internet, qualquer pessoa cria conta e envia arquivos de até 4 GB, que sincronizam para a rede.
  6. API escuta em 0.0.0.0:8000 (necessário para a rede local e para o Tor), com /docs aberto. Considerar BBX_DOCS=off em produção.
  7. Federação AP incompleta: as entregas agora saem assinadas, mas não há registro de seguidores (seguidores_inbox), e a pubkey de uma mucua pode vir de qualquer galáxia instalada. Antes de ligar BBX_FED_AP, definir de quais galáxias vale a confiança.
  8. SaberService com 4000 linhas. Dividir por assunto (leitura, escrita, coleções, eventos, estrutura) facilita revisão de segurança.
  9. Front com ~55 erros de tipo (npm run check).
  10. permissions.pode_administrar_instancia devolve True quando não consegue ler a identidade local ("comportamento antigo"). Em produção isso não acontece, mas falhar fechado seria mais seguro.

Exercícios de fim de curso

  1. Oco 2: faça o papel ser recalculado em deps._moc_from_token a cada requisição (como os grupos), com cache curto. Escreva o teste antes.
  2. Oco 6: acrescente BBX_DOCS=off em api/v3/app.py e no backend.env do pacote.
  3. Oco 4: escreva uma Content-Security-Policy para o SvelteKit (kit.csp em svelte.config.js) e descubra o que quebra.
  4. Nova nature: crie a nature cantiga (letra, intérprete, território, áudio) só pela API, sem mexer no código. O que faltou?
  5. Rota de sneakernet real: monte, com duas máquinas e um pendrive, um pedido que atravesse três mucuas.

Glossário

TermoNo códigoQuer dizer
sabercore/saber.pyqualquer coisa guardada; a unidade
naturenatures/o tipo de um saber
mucuainfra/mucua_local.pyuma instância (o fruto do baobá)
galáxiaSaberRepositoryum acervo = um repositório git
mocambolanature mocambolauma pessoa
territórionature territorioo chão de uma mucua
Sankofainfra/sankofa.pya fachada do git/annex (voltar e buscar)
linkservices/links.pyum remote git de uma galáxia
rotanature rotacaminho físico de sneakernet
pedidonature pedido"quero uma cópia deste arquivo"
lente / aplicaçãoapplications/um jeito de ver os saberes
OXALÁ, PAJÉ, USERconstants.ROLE_*papéis (galáxia, mucua, si mesmo)
gestor localmucua_local.gestores_locaisco-administrador convidado por esta máquina
procedênciadata.enriquecimentoo que a máquina fez com um anexo
farolinfra/farol_lan.pyo anúncio na rede local

Fechamento

Um baobá não é de quem plantou: é de quem senta embaixo dele. O código também. Leiam juntos, discordem dos comentários, escrevam testes para as histórias da sua comunidade.

vedi questo capitolo come sapere