3 pontos por GN⁺ 2024-01-15 | 1 comentários | Compartilhar no WhatsApp
  • AsmBB é um mecanismo de fórum web rápido e leve criado por JohnFound, que permite operar fóruns até em servidores pequenos graças a uma arquitetura baseada em linguagem Assembly e SQLite
  • Suporta servidores Linux x86 em 32 e 64 bits, e pode rodar em VPS ou hospedagem compartilhada com suporte a FastCGI sem bibliotecas pré-instaladas adicionais
  • A segurança enfatiza poucas dependências e um design interno robusto, evoluindo para banco de dados criptografado com SQLeet no v2.7 e suporte a SQLite3MultipleCiphers no v3.0
  • Os recursos foram ampliados com temas, personalização de templates, MiniMag·BBCode, anexos, tópicos de acesso restrito, chat em tempo real, Atom/RSS, notificações SSE, interface multilíngue, incorporação de YouTube e ranking de tópicos
  • O v3.0 traz mudanças incompatíveis na estrutura do banco de dados e dos templates, exigindo descriptografia, backup, alteração de esquema e substituição dos binários e de templates/ ao atualizar a partir do v2.9.1

Estrutura e ambiente de execução do AsmBB

  • AsmBB é um mecanismo de fórum web, e o fórum AsmBB.org também roda sobre o AsmBB
  • É escrito inteiramente em linguagem Assembly e usa SQLite como backend de banco de dados
  • Destaca a capacidade de atender muitos visitantes sem latência mesmo em ambientes de hospedagem fracos
  • Os requisitos de execução são baixos
    • Requer servidor Linux x86
    • Suporta 32 e 64 bits
    • Não exige bibliotecas pré-instaladas especiais
    • Pode rodar até no menor ou mais barato VPS
    • Também pode rodar em hospedagem compartilhada se houver suporte a FastCGI
    • Requer um servidor web com suporte à interface FastCGI
  • Os servidores web testados são Nginx, Apache, Lighttpd, Hiawatha, RWASA

Segurança e banco de dados criptografado

  • O AsmBB busca ser uma aplicação web altamente segura com base em design interno e poucas dependências
  • Para maior segurança, oferece suporte opcional a banco de dados criptografado
  • A principal mudança do v2.7 é o suporte a banco de dados de fórum criptografado
    • Usa o plugin SQLite SQLeet
    • Pela especificação, oferece derivação de chave PBKDF2-HMAC-SHA256, salt de 16 bytes e 12345 iterações
    • Usa a cifra de fluxo ChaCha20 e chaves de uso único
    • Usa tag de autenticação Poly1305
  • A criptografia pode ser ativada e desativada na nova aba Encryption do painel de configuração do administrador
  • A chave de criptografia não é armazenada em disco, ficando apenas temporariamente na RAM
    • O objetivo é impedir a exposição do banco de dados do fórum, atributos de conta e dados pessoais mesmo que o servidor web, o servidor de backup e a mídia de backup sejam gravemente comprometidos
  • A limitação conhecida é que, sempre que o mecanismo for reiniciado, a chave de criptografia precisa ser inserida novamente pela interface web
    • Em um reinício acidental do servidor, o acesso ao fórum pode ficar bloqueado por algum tempo
    • O AsmBB explica que, por ser uma aplicação estável e de longa execução, isso tende a ocorrer apenas uma vez a cada meses ou anos
  • Ao usar banco de dados criptografado, o uso de SSL/TLS é obrigatório

Personalização e caminhos de instalação

Mudanças recentes no fórum

  • O fórum atual passou a incluir os temas Glass, Neumor, Poly, Brutal, Joly, Tailwind, Snes
  • A inserção de URL no botão MiniMag usa o texto selecionado como texto-âncora
  • A verificação de e-mail é enviada de acordo com a configuração de idioma padrão
  • Foram aplicadas correções relacionadas ao MiniMag
  • Foi implementado o recurso de page para uso em contato, TOS etc.
  • A API foi implementada

Principais mudanças do v3.0 e cuidados no upgrade

  • O v3.0 adiciona vários novos recursos
    • É possível colar imagens diretamente para adicioná-las como anexos
    • Suporte a incorporação de vídeos do YouTube
    • Introdução de um editor unificado de post/tópico para simplificar código e templates
    • Adição de ranking de tópicos
  • O skin Modern foi removido do projeto por ser considerado de baixa qualidade
  • O v3.0 inclui mudanças incompatíveis com versões anteriores
    • Mudança na estrutura do banco de dados
    • Mudança na estrutura dos templates
  • Com a descontinuação do projeto SQLeet, foi adicionado suporte à extensão de criptografia SQLite3MultipleCiphers
    • Os pacotes binários de release são compilados com essa extensão
  • Bugs e vulnerabilidades encontrados foram corrigidos
  • Ao atualizar o banco de dados da v2.9.1 para a v3.0, a ordem é importante
    • É necessário descriptografar antes de modificar o banco de dados existente
    • A nova biblioteca SQLite3MultipleCiphers é usada em um modo incompatível com a biblioteca SQLeet existente
    • Antes de migrar para o v3.0, o banco pode ser descriptografado e depois recriptografado com a nova biblioteca
    • É necessário fazer backup para o caso de problemas
    • É preciso executar no console SQLite o SQL de alteração de esquema fornecido
    • Após a alteração do esquema, é preciso parar o mecanismo e substituir os binários engine, ld-musl-i386.so, libsqlite3.so
    • Com o mecanismo parado, é preciso substituir todo o diretório templates/ pelo novo
    • Depois de reiniciar o mecanismo, é preciso verificar se não há problemas no fórum atualizado
    • Se tudo parecer normal, o banco de dados pode ser criptografado novamente na página de configuração do AsmBB

Fluxo de releases da série v2.x

  • v2.9: Urban Sunrise e melhorias na experiência de edição

    • Foi adicionado o novo tema responsivo Urban Sunrise
    • O objetivo é melhorar a aparência do fórum
    • O editor de posts passa a ter ajuda de formatação embutida
    • O editor de posts e o chat em tempo real passam a suportar Unicode Emoji nativamente
    • Suporte a destaque de sintaxe de código-fonte por meio de biblioteca JS
    • O chat em tempo real pode receber posts com múltiplas linhas, incluindo código-fonte
    • Bugs reportados no mecanismo AsmBB e na biblioteca FreshLib foram corrigidos
  • v2.8: correções de bugs e recursos de defesa

    • Vários bugs foram corrigidos, alguns deles críticos
    • Foi adicionado o novo tema Modern
    • Foi implementada proteção contra DDOS para os raros casos em que o AsmBB não consegue suportar a taxa de requisições
    • Foi adicionado um analisador de URL para o MiniMag e o parser de BBCode para impedir ataques XSS em links de usuários
  • v2.6: interface em alemão e expansão do SSE

    • É a primeira versão oficial com tradução da interface para alemão
    • Outras traduções também foram melhoradas com ajuda da comunidade
    • É possível assinar o fórum inteiro, uma tag específica ou um tema específico via feeds Atom/RSS
    • O processamento de Server-Sent Events (SSE) foi reescrito do zero
    • O SSE passou a ser usado não só no chat em tempo real, mas também para notificar diversos eventos do fórum, como novos posts e atividade de usuários
    • Todos os clientes são atendidos em uma única thread, permitindo atender muitos visitantes simultaneamente com baixa carga de servidor
    • As versões mais recentes das bibliotecas SQLite e MUSL foram incluídas no pacote binário
  • v2.5: interface multilíngue e BBCode

    • Foi introduzida a internacionalização da interface do usuário
    • Os usuários podem escolher o idioma da interface do fórum
    • Os idiomas fornecidos são English, Bulgarian, Russian, French
    • Foi adicionado um parser de BBCode como segunda linguagem de marcação, entendendo tanto MiniMag quanto BBCode
    • O BBCode ajuda na criação de scripts de migração a partir de outros mecanismos de fórum
    • É possível enviar e-mails por programas externos como sendmail
  • v2.4: anexos, acesso restrito e desempenho do chat

    • É possível anexar arquivos aos posts, e a permissão de anexos é gerenciada por usuário
    • Limited access threads permitem ao dono do tópico definir a lista de usuários que podem acessá-lo
    • É possível editar permissões de usuários na página de administração
    • Como as permissões de usuários anônimos podem ser definidas separadamente, é possível criar um fórum fechado acessível apenas a usuários registrados
    • O serviço de chat em tempo real foi refatorado para processar todas as conexões em uma única thread
    • Após otimizações no mecanismo de renderização de templates, no esquema do banco de dados e nas consultas SQL, ficou cerca de 20% mais rápido que a versão anterior
  • v2.3: manutenção e acessibilidade

    • É uma release de manutenção que corrigiu 2 bugs graves
    • Para acessibilidade, imagens de fundo foram substituídas por tags <img> com texto alt
    • O fórum pode ser usado mesmo com imagens desativadas
    • O código JS do chat foi reorganizado e ficou um pouco mais rápido
  • v2.2 e v2.1: login, recuperação e navegação

    • Incluem login persistente, redefinição de senha, lista de usuários e melhorias no chat
    • O login persistente vem desativado por padrão
    • A redefinição de senha exige um e-mail válido e pode ser acessada pelo link no formulário de login
    • O v2.2 adiciona navegação por Categories baseada em sistema de tags
    • Foram adicionados preservação e restauração do histórico de edição/remoção de posts
  • v2.0: desempenho e segurança de código

    • O renderizador de templates render.asm foi substituído por render2.asm
    • A nova implementação usa algoritmos mais no estilo Assembly, sendo mais rápida e consumindo menos memória
    • A comparação encadeada de strings no parsing de URL foi substituída por tabela hash
    • A velocidade do AsmBB praticamente dobrou
    • Foram corrigidas vulnerabilidades encontradas por ferramentas de teste como OWASP ZAP e Tinfoil security
    • Foram corrigidos vazamentos de recursos e memória encontrados durante fuzzing intenso e testes de carga شبه-DDOS
    • Foi implementada uma ferramenta de depuração que coleta alocação e liberação de recursos e memória e as reporta em uma página web

1 comentários

 
GN⁺ 2024-01-15
Opiniões no Hacker News
  • Isso é realmente muito legal, mas a frase a seguir é bastante duvidosa:
    “O AsmBB é uma aplicação web muito segura graças ao seu design interno e às dependências reduzidas.”
    Também há muito valor em usar dependências bem testadas, e mesmo Chuck Norris inevitavelmente criaria bugs se escrevesse software complexo em assembly.
    Ainda mais em um caso como este projeto, que precisa fazer muito processamento de strings

    • Assim que vi o título, esse foi o primeiro pensamento que me veio à cabeça
      Senti a mesma coisa quando ele apareceu como um desafio de CTF que hospedava exatamente a versão mais recente deste projeto, e pelo menos 8 vulnerabilidades foram encontradas durante a competição
      https://ctftime.org/task/24399
    • Essa frase também me incomodou um pouco. Normalmente uma afirmação assim parece um sinal de alerta, mas o autor original não parece ser falante nativo de inglês, então talvez tenha deixado passar que a formulação precisava ser um pouco suavizada
      Por exemplo, algo como “o AsmBB prioriza segurança no design e depende menos de dependências” teria sido melhor
  • Gostei, e também é impressionante terem levado adiante a ideia de fazer em assembly. Reduzir dependências de fato diminui a superfície de ataque, mas isso por si só não permite dizer que é “seguro”
    Em termos probabilísticos, reduz a chance de exploração, mas assembly não oferece nenhuma segurança de memória nem outras garantias, então também aumenta o risco
    Não dá para afirmar qual lado pesa mais, mas, ainda assim, aplicações em assembly são fascinantes. Como bônus, se for transpilado para aarch64, talvez dê para rodar em um Pi-Zero ou Pi-W ligado a um adaptador de parede
    Por outro lado, também venho pesquisando fóruns distribuídos de vez em quando. Depois que a Usenet perdeu espaço, fóruns assim viraram o padrão, mas acho que uma alternativa deveria combinar os recursos de distribuição/replicação da Usenet com uma experiência de usuário como a do phpBB
    Tornar isso distribuído e com consistência eventual é um excelente desafio de sistemas distribuídos, algo divertido como um quebra-cabeça. Se alguém já fez algo parecido, eu adoraria ver

    • Acho que a combinação assembly + ABI do kernel Linux pode ser mais segura do que a pilha tradicional em C/C++. Ela fica exposta a muito menos comportamento indefinido
      Overflow e underflow em aritmética com sinal se comportam como esperado, e a memória alocada com mmap + MAP_ANONYMOUS é inicializada com zero como esperado
      Ao acessar um espaço de endereços não mapeado, incluindo o endereço 0, ocorre SIGSEGV como esperado
      O assembler faz muito menos suposições e é menos “esperto” que um compilador C, então é mais provável que estoure imediatamente em um erro do que quebrar expectativas silenciosamente
  • Pelo rodapé, o tempo de processamento é absurdamente rápido. Mas o documento leva 500~1000 ms para ser transmitido até a Dinamarca
    Nesse caso, um CDN parece melhor do que código de alta performance, mas ainda assim é um trabalho impressionante

    • Mesmo nos Açores, no meio do Atlântico, carregou em menos de 500 ms
    • Falando como alguém que já liderou melhorias de tempo de resposta em uma grande empresa de tecnologia, 1 segundo dói bastante
      Claro que o tempo de transmissão deve representar uma grande parte disso, mas, se isso for considerado “bom”, parece meio complicado
  • Fico curioso sobre como ele se conecta ao banco de dados a partir de código assembly. Existe algo como uma biblioteca em assembly?
    Em teoria eu entendo, mas parece que o esforço para escrever manualmente essas coisas “simples” seria enorme

    • É menos complexo do que parece. Basta chamar as funções da biblioteca C do SQLite seguindo a convenção de chamada do C
      O código relacionado está aqui: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
    • C também normalmente é compilado primeiro para assembly
      Programar em assembly é basicamente fazer manualmente o que o compilador faria, e você pode chamar as mesmas funções de biblioteca que um código C poderia chamar
      Só que é preciso seguir a convenção de chamada daquela arquitetura, o que é trabalhoso e tedioso, mas não é algo perto de impossível
      No x64, chamadas de função ficaram mais chatas porque ele usa registradores primeiro e, quando eles acabam, passa para a pilha. No x32 era bem mais conveniente porque usava só a pilha, mas a convenção do x64 permite manter valores em registradores e gerar código mais rápido
    • Como o banco de dados é SQLite, parece que ele simplesmente faz link com a biblioteca SQLite
  • Não é escrito só em assembly; por trás há SQLite. Como em muitas aplicações, o gargalo provavelmente é mais E/S do que CPU

    • Muita gente presume que a linguagem é o gargalo, quando na prática o gargalo costuma ser E/S ou o desenho do banco de dados
      Claro, pensando nos códigos PHP que já vi, entendo por que as pessoas sentem isso. Mas isso é mais uma questão de como a linguagem é usada do que da linguagem em si
    • RAM também é um fator. Escrevi alguns programas em C para Arduino, e havia códigos que se encaixariam bem em assembly porque a pilha e a convenção de chamada do C eram um desperdício completo. Por exemplo, casos sem nenhuma função recursiva
      O problema é a portabilidade. Gosto do AVR-8, mas, quando os requisitos crescem, o AVR-8 não tem muito para onde ir além de algo como um soft core em FPGA
      Em C, dá para migrar para um microcontrolador ARM; pessoalmente acho menos divertido, mas o desempenho sai melhor
      O problema do AsmBB também é estar preso a uma arquitetura específica
    • Mesmo em modo WAL com PRAGMA synchronous definido como NORMAL? Não sou nem de longe especialista em SQLite, estou investigando para usar em um projeto
  • Diz que “além disso, oferece suporte a caracteres Unicode Emoji de uma forma realmente nativa”, mas seria bom explicar isso melhor aqui
    Não sei bem o que “realmente nativa” quer dizer, e também não fica claro como isso difere de uma forma “meio nativa”

    • No código Assembly do AsmBB, parece não haver nenhum tratamento de emojis, então aparentemente eles passam quase sem alteração
      Porém, no chat em tempo real, um código JS que faz parte do template destaca emojis:
      function formatEmoji(text) {
      var emojiRegEx = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;
      return text.replace(emojiRegEx, '$1');
      }
      Provavelmente a intenção era capturar U+00A9, U+00AE, U+2000..3300, U+1F000..1FBFF, mas isso por si só já é amplo demais, e a regex também não é uma conversão fiel
      Se quiser a solução correta, dá para usar emoji-regex [1] ou o padrão mais recente /\p{RGI_Emoji}/v [2]
      [1] https://unpkg.com/browse/emoji-regex/index.js
      [2] https://caniuse.com/mdn-javascript_builtins_regexp_unicodese...
    • É especulação, mas alguns sites, como o Twitter, usam seu próprio conjunto de emojis; aqui, talvez queira dizer que não fazem isso e deixam a renderização padrão de emojis do sistema operacional cuidar disso
  • Há um botão no cabeçalho para desligar as notificações em tempo real
    Além disso, mostrar a lista de usuários do fórum para quem não está logado não parece muito bom. É algo configurável?

    • No mobile, não encontrei o botão para desligar as notificações em tempo real
    • Desde antigamente, fóruns eram assim mesmo, e provavelmente também é configurável
  • O conceito e a implementação são muito bons. Mas as notificações em tempo real rapidamente ficam excessivas, então parece que deveria haver algum tipo de limite de taxa

    • Coisas como @User123 has entered the thread provavelmente funcionavam bem em fóruns pequenos, onde todo mundo se conhecia
      Era por isso também que phpBB/vBulletin mostravam uma lista de “usuários lendo este tópico: ...”, e também havia plugins populares que mostravam que @Foo e @Bar estavam escrevendo respostas neste tópico
      Especialmente durante discussões acaloradas, isso dava uma sensação de que o espaço estava mais vivo, e também era até bom saber que a outra pessoa estava escrevendo o próximo textão rebatendo seu post citação por citação
      Mas receber uma notificação toda vez que um visitante não registrado clica no tópico não parece útil para ninguém
    • Ao clicar no ícone de sino, é possível desligar as notificações em tempo real
  • Dá para fazer algo parecido em C e abrir mão da biblioteca padrão. Dá para deixar sem dependências além das chamadas de sistema
    Fora o fato de ser um exercício intelectual, não vejo um motivo forte para fazer isso necessariamente em Assembly

  • O título não diz qual Assembly é, nem mesmo em qual sistema operacional roda
    x86 asm” somado a “on linux” não fica mais longo que “assembly language”