- 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
- O AsmBB permite personalizar o fórum por meio de um sistema de templates sem modificar diretamente o código
- O pacote binário pode ser obtido em asmbb.tar.gz, e esse link aponta para o pacote binário mais recente
- Verificação de progresso, relato de bugs e clonagem do código-fonte podem ser feitos no repositório de código-fonte do AsmBB
- A documentação para instalação em servidor próprio é fornecida no tutorial de instalação com NGINX e systemd
- Com o RWASA, a instalação pode ser feita em menos de 2 minutos, com tutorial em vídeo e vídeo no YouTube
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
- Vários bugs foram descobertos como resultado do evento hxp CTF
- 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 textoalt - 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.asmfoi substituído porrender2.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
- O renderizador de templates
1 comentários
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
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
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
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 esperadoAo acessar um espaço de endereços não mapeado, incluindo o endereço 0, ocorre
SIGSEGVcomo esperadoO 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
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
O código relacionado está aqui: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
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
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
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
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
PRAGMA synchronousdefinido comoNORMAL? Não sou nem de longe especialista em SQLite, estou investigando para usar em um projetoDiz 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”
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...
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?
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
@User123 has entered the threadprovavelmente funcionavam bem em fóruns pequenos, onde todo mundo se conheciaEra 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
@Fooe@Barestavam escrevendo respostas neste tópicoEspecialmente 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
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”