- AsmBB es un motor de foros web rápido y ligero creado por JohnFound, que permite ejecutar un foro incluso en servidores pequeños gracias a su arquitectura basada en lenguaje ensamblador y SQLite
- Soporta tanto 32 bits como 64 bits en servidores Linux x86, y puede ejecutarse en VPS o incluso en hosting compartido con soporte FastCGI, sin bibliotecas preinstaladas adicionales
- La seguridad pone énfasis en pocas dependencias y un diseño interno sólido; esto continúa con la base de datos cifrada de SQLeet en la v2.7 y con el soporte para SQLite3MultipleCiphers en la v3.0
- Las funciones se han ampliado con temas, personalización de plantillas, MiniMag·BBCode, archivos adjuntos, hilos de acceso restringido, chat en tiempo real, Atom/RSS, notificaciones SSE, UI multilingüe, incrustación de YouTube y ranking de hilos
- La v3.0 incluye cambios incompatibles en la base de datos y en la estructura de plantillas, por lo que al actualizar desde la v2.9.1 se requiere descifrar, respaldar, cambiar el esquema y reemplazar los binarios y
templates/
Estructura y entorno de ejecución de AsmBB
- AsmBB es un motor de foros web, y el foro AsmBB.org también funciona sobre AsmBB
- Está escrito completamente en lenguaje ensamblador y usa SQLite como backend de base de datos
- Destaca que puede manejar muchos visitantes sin demoras incluso en entornos de hosting modestos
- Los requisitos para ejecutarlo son bajos
- Requiere un servidor Linux x86
- Soporta tanto 32 bits como 64 bits
- No requiere bibliotecas preinstaladas especiales
- Puede funcionar incluso en el VPS más pequeño o barato
- También puede ejecutarse en hosting compartido si soporta FastCGI
- Se necesita un servidor web con soporte para la interfaz FastCGI
- Los servidores web probados son Nginx, Apache, Lighttpd, Hiawatha, RWASA
Seguridad y base de datos cifrada
- AsmBB apunta a ser una aplicación web altamente segura, basándose en su diseño interno y en la baja cantidad de dependencias
- Para una seguridad mayor, ofrece soporte opcional para base de datos cifrada
- El cambio principal de la v2.7 fue el soporte para bases de datos de foros cifradas
- Usa el plugin de SQLite SQLeet
- Según la especificación, soporta derivación de clave PBKDF2-HMAC-SHA256, salt de 16 bytes y 12345 iteraciones
- Usa el cifrado de flujo ChaCha20 y claves de un solo uso
- Usa etiquetas de autenticación Poly1305
- El cifrado puede activarse o desactivarse desde la nueva pestaña Encryption en el panel de configuración del administrador
- La clave de cifrado no se guarda en disco y solo se almacena temporalmente en RAM
- El objetivo es evitar la exposición de la base de datos del foro, atributos de cuentas y datos privados incluso si el servidor web, el servidor de respaldo o el medio de respaldo se ven gravemente comprometidos
- Una limitación conocida es que cada vez que se reinicia el motor, la clave de cifrado debe volver a introducirse desde la interfaz web
- Un reinicio accidental del servidor puede bloquear temporalmente el acceso al foro
- AsmBB explica que, al ser una aplicación estable y de larga ejecución, esta situación ocurre solo una vez cada varios meses o incluso años
- Al usar una base de datos cifrada, es obligatorio usar SSL/TLS
Personalización y rutas de instalación
- AsmBB permite personalizar el foro mediante un sistema de plantillas, sin modificar directamente el código
- El paquete binario puede descargarse desde asmbb.tar.gz, y ese enlace apunta al paquete binario más reciente
- Es posible revisar el progreso, reportar errores y clonar el código fuente en el repositorio fuente de AsmBB
- La documentación para instalarlo en un servidor propio se ofrece en el tutorial de instalación con NGINX y systemd
- Con RWASA es posible instalarlo en menos de 2 minutos, y se ofrecen un video tutorial y un video en YouTube
Cambios recientes en el foro
- En el foro actual se añadieron los temas Glass, Neumor, Poly, Brutal, Joly, Tailwind, Snes
- La inserción de URL del botón MiniMag usa el texto seleccionado como texto del ancla
- La verificación de correo electrónico se envía de acuerdo con la configuración de idioma predeterminada
- Se aplicaron correcciones relacionadas con MiniMag
- Se implementó la función page para usar en contacto, TOS, etc.
- Se implementó la API
Cambios principales de la v3.0 y precauciones al actualizar
- La v3.0 añade varias funciones nuevas
- Se pueden pegar imágenes directamente para agregarlas como archivos adjuntos
- Soporte para incrustar videos de YouTube
- Se introduce un editor unificado de publicaciones/hilos que simplifica el código y las plantillas
- Se añade ranking de hilos
- La skin Modern fue eliminada del proyecto por considerarse de baja calidad
- La v3.0 incluye cambios incompatibles con versiones anteriores
- Cambio en la estructura de la base de datos
- Cambio en la estructura de plantillas
- Debido a la descontinuación del proyecto SQLeet, se añadió soporte para la extensión de cifrado SQLite3MultipleCiphers
- Los paquetes binarios de lanzamiento están compilados con esta extensión
- Se corrigieron bugs y vulnerabilidades descubiertos
- Varios bugs se descubrieron como resultado del evento hxp CTF
- Al actualizar la base de datos de la v2.9.1 a la v3.0, el orden es importante
- Antes de modificar la base de datos existente, primero hay que descifrarla
- La nueva biblioteca SQLite3MultipleCiphers se usa en un modo que no es compatible con la biblioteca SQLeet anterior
- Antes de migrar a la v3.0, se puede descifrar la base de datos y luego volver a cifrarla con la nueva biblioteca
- Es necesario hacer un respaldo por si surge algún problema
- Hay que ejecutar en la consola de SQLite el SQL de cambio de esquema proporcionado
- Después de cambiar el esquema de la base de datos, se debe detener el motor y reemplazar los archivos binarios
engine,ld-musl-i386.so,libsqlite3.so - Mientras el motor esté detenido, se debe reemplazar todo el directorio
templates/por el nuevo - Tras reiniciar el motor, hay que verificar que no haya problemas en el foro actualizado
- Si todo parece estar bien, se puede volver a cifrar la base de datos desde la página de configuración de AsmBB
Flujo de lanzamientos de la serie v2.x
-
v2.9: Urban Sunrise y mejoras en la experiencia de edición
- Se añadió el nuevo tema responsivo Urban Sunrise
- El objetivo es mejorar la apariencia del foro
- El editor de publicaciones incluye ayuda de formato integrada
- El editor de publicaciones y el chat en tiempo real soportan Unicode Emoji de forma nativa
- Soporte para resaltado de sintaxis del código fuente mediante una biblioteca JS
- El chat en tiempo real puede recibir publicaciones de varias líneas, incluyendo código fuente
- Se corrigieron bugs reportados en el motor AsmBB y en la biblioteca FreshLib
-
v2.8: correcciones de bugs y funciones defensivas
- Se corrigieron varios bugs, algunos de ellos críticos
- Se añadió el nuevo tema Modern
- Se implementó protección DDOS para los casos poco comunes en que AsmBB no puede soportar la velocidad de las solicitudes
- Se añadió un analizador de URL para los parsers de MiniMag y BBCode, para prevenir ataques XSS mediante enlaces de usuarios
-
v2.6: UI en alemán y expansión de SSE
- Es la primera versión oficial que incluye traducción de la UI al alemán
- Otras traducciones también mejoraron con ayuda de la comunidad
- Se puede suscribir todo el foro, una etiqueta específica o un tema específico mediante feeds Atom/RSS
- El manejo de eventos enviados por el servidor (SSE) fue reescrito completamente desde cero
- SSE ya no solo sirve para el chat en tiempo real, sino también para notificaciones de varios eventos del foro como nuevas publicaciones y actividad de usuarios
- Maneja todos los clientes en un solo hilo, lo que permite atender simultáneamente a muchos visitantes con baja carga del servidor
- Se incluyen en el paquete binario las versiones más recientes de las bibliotecas SQLite y MUSL
-
v2.5: UI multilingüe y BBCode
- Se introdujo la internacionalización de la interfaz de usuario
- Los usuarios pueden elegir el idioma de la UI del foro
- Los idiomas ofrecidos son English, Bulgarian, Russian, French
- Se añadió un parser de BBCode como segundo lenguaje de marcado, por lo que entiende tanto MiniMag como BBCode
- BBCode es útil al crear scripts de migración desde otros motores de foro
- Puede enviar correos electrónicos mediante programas externos como
sendmail
-
v2.4: adjuntos, acceso restringido y rendimiento del chat
- Se pueden adjuntar archivos a las publicaciones, y el permiso para adjuntar se administra por usuario
- Los Limited access threads permiten que el propietario del hilo defina la lista de usuarios con acceso
- Es posible editar permisos de usuarios desde la página de administración
- Los permisos de usuarios anónimos pueden configurarse por separado, lo que permite crear foros cerrados legibles solo por usuarios registrados
- El servicio de chat en tiempo real fue refactorizado para manejar todas las conexiones en un solo hilo
- Después de optimizar el motor de renderizado de plantillas, el esquema de base de datos y las consultas SQL, es aproximadamente 20% más rápido que la versión anterior
-
v2.3: mantenimiento y accesibilidad
- Es una versión de mantenimiento que corrige 2 bugs graves
- Por accesibilidad, las imágenes de fondo se reemplazaron por etiquetas
<img>con textoalt - El foro puede usarse incluso con las imágenes desactivadas
- El código JS del chat fue ordenado y se volvió ligeramente más rápido
-
v2.2 y v2.1: inicio de sesión, recuperación y navegación
- Incluyen sesión persistente, restablecimiento de contraseña, lista de usuarios y mejoras en el chat
- La sesión persistente está desactivada por defecto
- El restablecimiento de contraseña requiere un correo electrónico válido y se puede acceder desde el enlace del formulario de inicio de sesión
- La v2.2 añadió navegación por Categories basada en un sistema de etiquetas
- Se añadieron funciones para conservar y restaurar el historial de edición/eliminación de publicaciones
-
v2.0: rendimiento y seguridad del código
- El renderizador de plantillas
render.asmfue reemplazado porrender2.asm - La nueva implementación usa algoritmos más propios del estilo ensamblador, por lo que es más rápida y usa menos memoria
- La comparación encadenada de cadenas en el análisis de URL fue reemplazada por una tabla hash
- La velocidad de AsmBB casi se duplicó
- Se corrigieron vulnerabilidades descubiertas por herramientas de prueba, incluyendo OWASP ZAP y Tinfoil security
- Se corrigieron fugas de recursos y memoria descubiertas durante fuzzing intensivo y pruebas de carga tipo cuasi DDOS
- Se implementó una herramienta de depuración que recopila asignación y liberación de recursos y memoria, y las reporta en una página web
- El renderizador de plantillas
1 comentarios
Opiniones de Hacker News
Esto es realmente genial, pero la siguiente frase me parece muy sospechosa:
“AsmBB es una aplicación web muy segura gracias a su diseño interno y a sus dependencias reducidas.”
También hay mucho valor en usar dependencias bien probadas, y aunque fuera Chuck Norris, si escribes software complejo en ensamblador, inevitablemente vas a introducir bugs.
Sobre todo si, como en este proyecto, hay que hacer mucho procesamiento de cadenas.
También sentí lo mismo cuando apareció como un reto de CTF que alojaba tal cual la versión más reciente de este proyecto, y durante la competencia se encontraron al menos 8 vulnerabilidades.
https://ctftime.org/task/24399
Por ejemplo, algo como “AsmBB prioriza la seguridad en su diseño y depende menos de dependencias” habría sido mejor.
Me gusta, y es admirable que hayan apostado por el lenguaje ensamblador. Es cierto que reducir dependencias reduce la superficie de ataque, pero eso por sí solo no permite decir que algo sea “seguro”.
Probabilísticamente reduce la posibilidad de exploits, pero el ensamblador no ofrece ninguna seguridad de memoria ni otras garantías, así que también puede aumentar el riesgo.
No puedo afirmar cuál de los dos factores pesa más, pero aun así las aplicaciones en ensamblador son atractivas. Como extra, si se transpila a aarch64, quizá se podría correr en un Pi-Zero o Pi-W conectado a un adaptador de pared.
Por otro lado, también he estado investigando foros distribuidos de vez en cuando. Después de que Usenet quedara desplazado, estos foros se volvieron dominantes, pero creo que un reemplazo debería combinar las funciones de distribución/replicación de Usenet con una experiencia de usuario tipo phpBB.
Hacer que sea distribuido y tenga consistencia eventual es un gran desafío de sistemas distribuidos, de esos que se disfrutan como un rompecabezas. Si alguien ha creado algo parecido, me encantaría verlo.
Los overflows y underflows de aritmética con signo se comportan como se espera, y la memoria asignada con
mmap + MAP_ANONYMOUSse inicializa en cero como se espera.Si accedes a espacio de direcciones no mapeado, incluida la dirección 0, se produce un
SIGSEGVcomo se espera.El ensamblador hace muchas menos suposiciones que un compilador de C y trata de ser menos “inteligente”, así que es más probable que falle de inmediato ante un error en vez de romper silenciosamente tus expectativas.
Según el footer, el tiempo de procesamiento es ridículamente rápido. Pero el documento tarda entre 500 y 1000 ms en llegar hasta Dinamarca.
En este caso, un CDN parece más útil que código de alto rendimiento, aunque sigue siendo un trabajo impresionante.
Claro que el tiempo de transferencia probablemente representa una gran parte, pero si eso se considera “bueno”, se ve complicado.
Me da curiosidad cómo se conecta a una base de datos desde código ensamblador. ¿Existe algo como una biblioteca de ensamblador?
En teoría lo entiendo, pero el esfuerzo de escribir directamente esas cosas “simples” debe ser enorme.
El código relacionado está aquí: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
Programar en ensamblador básicamente significa hacer tú mismo lo que haría el compilador, y puedes llamar a las mismas funciones de biblioteca que podría llamar el código C.
Solo que hay que seguir la convención de llamadas de esa arquitectura, lo cual es engorroso y tedioso, pero no es ni de cerca imposible.
En x64 las llamadas a funciones se volvieron más molestas porque primero se usan registros y, cuando se agotan, se pasa a la pila. En x32 era mucho más cómodo porque solo se usaba la pila, aunque la convención de x64 permite mantener valores en registros y generar código más rápido.
No está escrito solo en ensamblador: por detrás tiene SQLite. Como en muchas aplicaciones, es probable que el cuello de botella sea más la E/S que la CPU.
Claro, viendo el código PHP que he visto, entiendo por qué se siente así. Pero eso tiene más que ver con cómo se usa que con el lenguaje en sí.
El problema es la portabilidad. Me gusta AVR-8, pero si los requisitos crecen, AVR-8 no tiene mucho a dónde ir salvo quizá como soft core en FPGA.
Con C se puede migrar a microcontroladores ARM y, aunque personalmente me resulta menos divertido, el rendimiento sale mejor.
El problema de AsmBB también es que está atado a una arquitectura específica.
PRAGMA synchronousenNORMAL? No soy experto en SQLite en absoluto; estoy revisándolo para usarlo en un proyecto.Dice que “además, admite caracteres Unicode Emoji de una forma realmente nativa”, pero me gustaría que lo explicaran con más detalle
No me queda claro qué significa “realmente nativa”, ni en qué se diferencia de una forma “algo nativa”
Eso sí, el chat en tiempo real resalta emojis en código JS que forma parte de la plantilla:
function formatEmoji(text) {var emojiRegEx = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;return text.replace(emojiRegEx, '$1');}Probablemente la intención era capturar U+00A9, U+00AE, U+2000..3300 y U+1F000..1FBFF, pero incluso eso es demasiado amplio y la expresión regular tampoco es una conversión fiel
Si quieren una solución correcta, pueden usar
emoji-regex[1] o el patrón más reciente/\p{RGI_Emoji}/v[2][1] https://unpkg.com/browse/emoji-regex/index.js
[2] https://caniuse.com/mdn-javascript_builtins_regexp_unicodese...
En el encabezado hay un botón para desactivar las notificaciones en tiempo real
Dicho sea de paso, no se ve muy bien mostrar la lista de usuarios del foro a quienes no han iniciado sesión. ¿Es algo configurable?
El concepto y la implementación son realmente buenos. Pero las notificaciones en tiempo real se vuelven abrumadoras muy rápido, así que parece que debería haber algún tipo de limitación de velocidad
@User123 has entered the threadhabría funcionado bien en foros pequeños donde todos se conocíanEsa era también la razón por la que phpBB/vBulletin mostraban una lista de “usuarios leyendo este hilo: ...”, y también había plugins populares que mostraban que
@Fooy@Barestaban escribiendo una respuesta en ese hiloEn especial durante discusiones intensas, hacía que el espacio se sintiera más vivo, y hasta era agradable saber que la otra persona estaba escribiendo el siguiente texto largo refutando tu mensaje cita por cita
Pero recibir una notificación cada vez que un invitado no registrado hace clic en un hilo no parece útil para nadie
También se podría hacer algo parecido en C y prescindir de la biblioteca estándar. Se podría lograr que no tuviera dependencias aparte de las llamadas al sistema
Más allá de ser un ejercicio intelectual, no veo una razón fuerte para hacerlo necesariamente en ensamblador
En el título falta qué ensamblador es, e incluso en qué sistema operativo corre
“x86 asm” y “on linux” juntos no son más largos que “assembly language”