3 điểm bởi GN⁺ 2024-01-15 | 1 bình luận | Chia sẻ qua WhatsApp
  • AsmBB là một engine diễn đàn web nhanh và nhẹ do JohnFound tạo ra, cho phép vận hành diễn đàn ngay cả trên máy chủ nhỏ nhờ cấu trúc dựa trên hợp ngữ và SQLite
  • Hỗ trợ cả 32-bit và 64-bit trên máy chủ x86 Linux, có thể chạy trên VPS hoặc shared hosting hỗ trợ FastCGI mà không cần thư viện cài sẵn riêng
  • Về bảo mật, dự án nhấn mạnh thiết kế nội bộ và ít phụ thuộc, tiếp nối bằng cơ sở dữ liệu mã hóa SQLeet ở v2.7 và hỗ trợ SQLite3MultipleCiphers ở v3.0
  • Tính năng được mở rộng với theme, tùy biến template, MiniMag·BBCode, tệp đính kèm, thread truy cập hạn chế, chat thời gian thực, Atom/RSS, thông báo SSE, UI đa ngôn ngữ, nhúng YouTube và xếp hạng thread
  • v3.0 có thay đổi không tương thích ở cấu trúc cơ sở dữ liệu và template, nên khi nâng cấp từ v2.9.1 cần giải mã, sao lưu, thay đổi schema, thay thế binary và templates/

Cấu trúc và môi trường chạy của AsmBB

  • AsmBB là một engine diễn đàn web, và diễn đàn AsmBB.org cũng chạy trên AsmBB
  • Toàn bộ được viết bằng hợp ngữ và sử dụng SQLite làm backend cơ sở dữ liệu
  • Dự án nhấn mạnh khả năng xử lý nhiều lượt truy cập không độ trễ ngay cả trong môi trường hosting yếu
  • Yêu cầu chạy khá thấp
    • Cần máy chủ x86 Linux
    • Hỗ trợ cả 32-bit và 64-bit
    • Không cần thư viện được cài sẵn đặc biệt
    • Có thể chạy trên cả VPS nhỏ nhất hoặc rẻ nhất
    • Cũng có thể chạy trên shared hosting nếu hỗ trợ FastCGI
    • Cần web server hỗ trợ giao diện FastCGI
  • Các web server đã được thử nghiệm là Nginx, Apache, Lighttpd, Hiawatha, RWASA

Bảo mật và cơ sở dữ liệu mã hóa

  • AsmBB hướng tới một ứng dụng web có tính bảo mật cao dựa trên thiết kế nội bộ và ít phụ thuộc
  • Để tăng cường bảo mật, hỗ trợ tùy chọn cơ sở dữ liệu mã hóa
  • Thay đổi chính của v2.7 là hỗ trợ cơ sở dữ liệu diễn đàn được mã hóa
    • Sử dụng plugin SQLite SQLeet
    • Theo đặc tả, hỗ trợ dẫn xuất khóa PBKDF2-HMAC-SHA256, salt 16 byte, 12345 vòng lặp
    • Sử dụng mã hóa dòng ChaCha20 và khóa dùng một lần
    • Sử dụng thẻ xác thực Poly1305
  • Có thể bật/tắt mã hóa trong tab Encryption mới ở panel cài đặt quản trị
  • Khóa mã hóa không được lưu trên đĩa mà chỉ được lưu tạm trong RAM
    • Mục tiêu là cấu hình có thể ngăn lộ cơ sở dữ liệu diễn đàn, thuộc tính tài khoản và dữ liệu cá nhân ngay cả khi web server, backup server hoặc phương tiện sao lưu bị xâm nhập nghiêm trọng
  • Hạn chế đã biết là mỗi khi engine khởi động lại, cần nhập lại khóa mã hóa qua giao diện web
    • Khi máy chủ vô tình khởi động lại, việc truy cập diễn đàn có thể bị chặn trong một thời gian
    • AsmBB giải thích rằng vì đây là ứng dụng ổn định và chạy lâu dài, tình huống này chỉ xảy ra ở mức vài tháng hoặc vài năm một lần
  • Khi dùng cơ sở dữ liệu mã hóa, bắt buộc phải sử dụng SSL/TLS

Tùy biến và đường dẫn cài đặt

Các thay đổi gần đây của diễn đàn

  • Diễn đàn hiện đã thêm các theme Glass, Neumor, Poly, Brutal, Joly, Tailwind, Snes
  • Chức năng chèn URL của nút MiniMag dùng văn bản đã chọn làm anchor text
  • Email xác minh được gửi theo thiết lập ngôn ngữ mặc định
  • Có các sửa đổi liên quan đến MiniMag
  • Đã triển khai tính năng page để dùng cho thông tin liên hệ, TOS, v.v.
  • API đã được triển khai

Các thay đổi chính của v3.0 và lưu ý khi nâng cấp

  • v3.0 bổ sung nhiều tính năng mới
    • Có thể dán trực tiếp hình ảnh để thêm làm tệp đính kèm
    • Hỗ trợ nhúng video YouTube
    • Giới thiệu trình biên tập bài viết/thread hợp nhất nhằm đơn giản hóa mã và template
    • Thêm xếp hạng thread
  • Skin Modern bị loại khỏi dự án vì chất lượng thấp
  • v3.0 bao gồm các thay đổi không tương thích với phiên bản trước
    • Thay đổi cấu trúc cơ sở dữ liệu
    • Thay đổi cấu trúc template
  • Do dự án SQLeet ngừng phát triển, đã thêm hỗ trợ extension mã hóa SQLite3MultipleCiphers
    • Gói binary release được biên dịch kèm extension này
  • Các lỗi và lỗ hổng đã phát hiện được sửa
  • Khi cập nhật cơ sở dữ liệu từ v2.9.1 lên v3.0, thứ tự thao tác rất quan trọng
    • Cần giải mã trước khi sửa cơ sở dữ liệu hiện có
    • Thư viện SQLite3MultipleCiphers mới được sử dụng ở chế độ không tương thích với thư viện SQLeet cũ
    • Có thể giải mã cơ sở dữ liệu trước khi di chuyển sang v3.0, sau đó mã hóa lại bằng thư viện mới
    • Cần sao lưu để phòng trường hợp có vấn đề
    • Cần chạy SQL thay đổi schema được cung cấp trong console SQLite
    • Sau khi thay đổi schema cơ sở dữ liệu, cần dừng engine và thay thế các tệp binary engine, ld-musl-i386.so, libsqlite3.so
    • Trong lúc engine dừng, cần thay toàn bộ thư mục templates/ bằng bản mới
    • Sau khi khởi động lại engine, cần kiểm tra diễn đàn đã cập nhật có vấn đề gì không
    • Nếu mọi thứ bình thường, có thể mã hóa lại cơ sở dữ liệu trong trang cài đặt AsmBB

Luồng phát hành v2.x

  • v2.9: Urban Sunrise và cải thiện trải nghiệm biên tập

    • Thêm theme responsive mới Urban Sunrise
    • Nhằm cải thiện giao diện diễn đàn
    • Trợ giúp định dạng được tích hợp trong trình biên tập bài viết
    • Hỗ trợ Unicode Emoji theo cách native trong trình biên tập bài viết và chat thời gian thực
    • Hỗ trợ tô sáng cú pháp mã nguồn thông qua thư viện JS
    • Chat thời gian thực có thể nhận bài viết nhiều dòng, bao gồm cả mã nguồn
    • Các lỗi đã được báo cáo trong engine AsmBB và thư viện FreshLib đã được sửa
  • v2.8: Sửa lỗi và tính năng phòng vệ

    • Nhiều lỗi đã được sửa, trong đó có một số lỗi nghiêm trọng
    • Thêm theme mới Modern
    • Triển khai bảo vệ DDOS cho những trường hợp hiếm khi AsmBB không xử lý kịp tốc độ request
    • Thêm bộ phân tích URL cho parser MiniMag và BBCode để ngăn tấn công XSS qua liên kết người dùng
  • v2.6: UI tiếng Đức và mở rộng SSE

    • Đây là phiên bản chính thức đầu tiên bao gồm bản dịch UI tiếng Đức
    • Các bản dịch khác cũng được cải thiện nhờ sự hỗ trợ của cộng đồng
    • Có thể đăng ký theo dõi toàn bộ diễn đàn, tag cụ thể hoặc theme cụ thể bằng feed Atom/RSS
    • Phần xử lý Server-Sent Events (SSE) được viết lại từ đầu
    • SSE không chỉ dùng cho chat thời gian thực mà còn có thể dùng cho thông báo nhiều sự kiện diễn đàn khác như bài viết mới và hoạt động người dùng
    • Xử lý tất cả client trong một thread duy nhất, cho phép phục vụ đồng thời nhiều lượt truy cập với tải máy chủ thấp
    • Các phiên bản mới nhất của SQLite và thư viện MUSL được đưa vào gói binary
  • v2.5: UI đa ngôn ngữ và BBCode

    • Quốc tế hóa giao diện người dùng được giới thiệu
    • Người dùng có thể chọn ngôn ngữ UI của diễn đàn
    • Các ngôn ngữ được cung cấp là English, Bulgarian, Russian, French
    • Parser BBCode được thêm làm ngôn ngữ markup thứ hai, hiểu cả MiniMag và BBCode
    • BBCode hữu ích khi tạo script di chuyển từ các engine diễn đàn khác
    • Có thể gửi email bằng chương trình bên ngoài như sendmail
  • v2.4: Đính kèm, truy cập hạn chế, hiệu năng chat

    • Có thể đính kèm tệp vào bài viết, và quyền đính kèm được quản lý theo từng người dùng
    • Limited access threads cho phép chủ sở hữu thread chỉ định danh sách người dùng có thể truy cập
    • Có thể chỉnh sửa quyền người dùng trong trang quản trị
    • Có thể thiết lập riêng quyền của người dùng ẩn danh, cho phép tạo diễn đàn đóng chỉ người dùng đã đăng ký mới đọc được
    • Dịch vụ chat thời gian thực được refactor để xử lý mọi kết nối trong một thread duy nhất
    • Sau khi tối ưu engine render template, schema cơ sở dữ liệu và request SQL, nhanh hơn khoảng 20% so với phiên bản trước
  • v2.3: Bảo trì và khả năng tiếp cận

    • Đây là bản phát hành bảo trì sửa 2 lỗi nghiêm trọng
    • Vì khả năng tiếp cận, ảnh nền được thay bằng thẻ <img> có văn bản alt
    • Có thể sử dụng diễn đàn ngay cả khi hình ảnh bị tắt
    • Mã JS cho chat được dọn dẹp và nhanh hơn một chút
  • v2.2 và v2.1: Đăng nhập, khôi phục, điều hướng

    • Bao gồm đăng nhập duy trì, đặt lại mật khẩu, danh sách người dùng và cải thiện chat
    • Đăng nhập duy trì mặc định bị tắt
    • Đặt lại mật khẩu yêu cầu email hợp lệ và có thể truy cập từ liên kết trong form đăng nhập
    • v2.2 thêm điều hướng Categories dựa trên hệ thống tag
    • Thêm chức năng lưu giữ và khôi phục lịch sử chỉnh sửa/xóa bài viết
  • v2.0: Hiệu năng và bảo mật mã

    • Trình render template render.asm được thay bằng render2.asm
    • Cách triển khai mới dùng thuật toán mang phong cách hợp ngữ hơn, nhanh hơn và dùng ít bộ nhớ hơn
    • So sánh chuỗi nối tiếp trong phân tích URL được thay bằng bảng băm
    • Tốc độ AsmBB tăng khoảng gấp đôi
    • Các lỗ hổng được phát hiện bằng công cụ kiểm thử, gồm OWASP ZAP và Tinfoil security, đã được sửa
    • Các rò rỉ tài nguyên và bộ nhớ phát hiện trong quá trình fuzzing mạnh và kiểm thử tải gần mức DDOS đã được sửa
    • Đã triển khai công cụ gỡ lỗi thu thập việc cấp phát/giải phóng tài nguyên và bộ nhớ rồi báo cáo qua trang web

1 bình luận

 
GN⁺ 2024-01-15
Ý kiến trên Hacker News
  • Cái này thực sự rất ngầu, nhưng câu sau nghe khá đáng nghi:
    “AsmBB là một ứng dụng web rất an toàn nhờ thiết kế nội bộ và việc giảm bớt phụ thuộc.”
    Việc dùng các dependency đã được kiểm chứng cũng có giá trị rất lớn, và kể cả Chuck Norris mà viết phần mềm phức tạp bằng assembly thì cũng khó tránh khỏi tạo ra bug
    Đặc biệt càng đúng với những dự án như thế này, nơi phải xử lý rất nhiều chuỗi ký tự

    • Vừa nhìn tiêu đề là tôi cũng nghĩ ngay như vậy
      Trước đây khi phiên bản mới nhất của dự án này từng xuất hiện nguyên trạng trong một bài CTF, tôi cũng có cảm giác y hệt, và trong lúc thi đã tìm ra ít nhất 8 lỗ hổng
      https://ctftime.org/task/24399
    • Câu đó cũng làm tôi hơi khó chịu. Bình thường kiểu khẳng định như vậy trông giống một tín hiệu cảnh báo, nhưng có lẽ tác giả gốc không phải người bản ngữ tiếng Anh nên có thể đã không nhận ra là cần làm mềm cách diễn đạt hơn một chút
      Ví dụ nếu viết kiểu “AsmBB ưu tiên bảo mật trong thiết kế và ít phụ thuộc hơn” thì có lẽ sẽ ổn hơn
  • Tôi thích nó, và việc theo assembly đến cùng cũng rất ấn tượng. Giảm phụ thuộc đúng là sẽ làm giảm bề mặt tấn công, nhưng chỉ như vậy thì chưa thể nói là “an toàn”
    Xét theo xác suất thì có thể làm giảm khả năng bị khai thác, nhưng assembly cũng làm tăng rủi ro vì hoàn toàn không có an toàn bộ nhớ hay các bảo đảm khác
    Tôi không dám khẳng định bên nào lớn hơn, nhưng dù sao thì các ứng dụng viết bằng assembly vẫn rất hấp dẫn. Thêm nữa, nếu transpile sang aarch64 thì còn có thể cắm Pi-Zero hoặc Pi-W vào adapter treo tường để chạy
    Mặt khác tôi cũng đã thỉnh thoảng tìm hiểu về các diễn đàn phân tán. Sau khi Usenet bị lép vế thì các diễn đàn kiểu này trở thành chủ đạo, nhưng nếu muốn làm giải pháp thay thế thì theo tôi nó cần có cả khả năng phân tán/nhân bản của Usenet lẫn trải nghiệm người dùng kiểu phpBB
    Làm cho nó phân tán và đạt được tính nhất quán cuối cùng là một bài toán hệ thống phân tán rất hay, kiểu có thể vui như giải đố. Nếu ai từng làm thứ gì tương tự thì tôi rất muốn xem

    • Tôi cho rằng tổ hợp assembly + Linux kernel ABI có thể an toàn hơn stack C/C++ truyền thống. Lý do là nó ít tiếp xúc với hành vi không xác định hơn nhiều
      Tràn và hụt số học có dấu sẽ hoạt động đúng như dự đoán, và bộ nhớ cấp phát bằng mmap + MAP_ANONYMOUS sẽ được khởi tạo về 0 đúng như mong đợi
      Truy cập vùng địa chỉ chưa được ánh xạ, kể cả địa chỉ 0, sẽ tạo ra SIGSEGV như dự đoán
      Assembler đưa ra ít giả định hơn và ít “khôn lỏi” hơn trình biên dịch C rất nhiều, nên thay vì âm thầm phá vỡ kỳ vọng thì nó có khả năng vỡ ngay tại chỗ khi gặp lỗi cao hơn
  • Dựa theo footer thì thời gian xử lý nhanh một cách phi lý. Nhưng việc tài liệu được truyền tới tận Đan Mạch lại mất 500~1000ms
    Trong trường hợp này có vẻ CDN sẽ hữu ích hơn là code hiệu năng cao, nhưng dù sao đây vẫn là một công trình ấn tượng

    • Ở quần đảo Azores giữa Đại Tây Dương mà cũng tải trong chưa đến 500ms
    • Với tư cách người từng dẫn dắt việc cải thiện thời gian phản hồi ở các công ty công nghệ lớn, thì 1 giây là khá đau
      Dĩ nhiên thời gian truyền tải sẽ chiếm phần lớn, nhưng nếu như vậy mà vẫn được xem là “tốt” thì có vẻ hơi khó chấp nhận
  • Tôi tò mò không biết họ kết nối tới cơ sở dữ liệu bằng assembly kiểu gì. Có kiểu thư viện assembly nào cho việc đó không?
    Về mặt lý thuyết thì tôi hiểu, nhưng công sức để tự viết những thứ “đơn giản” như vậy chắc hẳn là cực kỳ lớn

    • Ít phức tạp hơn bạn nghĩ. Chỉ cần gọi các hàm trong thư viện SQLite C theo đúng quy ước gọi C là được
      Mã liên quan ở đây: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
    • C thì cuối cùng bình thường cũng được biên dịch thành assembly trước
      Lập trình bằng assembly về cơ bản là tự làm công việc mà compiler thường làm, và bạn có thể gọi cùng những hàm thư viện mà mã C có thể gọi
      Chỉ là bạn phải tuân theo quy ước gọi hàm của kiến trúc đó nên khá phiền và tẻ nhạt, chứ không phải chuyện gần như bất khả thi
      x64 dùng thanh ghi trước rồi mới đẩy sang stack khi dùng hết, nên việc gọi hàm trở nên phiền hơn. x32 chỉ dùng stack nên dễ hơn nhiều, nhưng quy ước của x64 giữ giá trị trong thanh ghi để tạo ra mã nhanh hơn
    • Nếu cơ sở dữ liệu là SQLite như đã ghi, thì có vẻ họ chỉ đơn giản là liên kết với thư viện SQLite
  • Không phải viết hoàn toàn bằng assembly, phía sau vẫn có SQLite. Giống nhiều ứng dụng khác, nút thắt cổ chai có lẽ là I/O hơn là CPU

    • Người ta thường giả định ngôn ngữ là nút thắt, trong khi thực tế nhiều khi I/O hoặc thiết kế cơ sở dữ liệu mới là chỗ nghẽn
      Tất nhiên, khi nghĩ tới những đoạn mã PHP tôi từng thấy thì tôi cũng hiểu vì sao lại có cảm giác đó. Nhưng đó là vấn đề cách sử dụng hơn là của bản thân ngôn ngữ
    • RAM cũng là một yếu tố. Tôi từng viết vài chương trình bằng C trên Arduino, và stack cùng quy ước gọi C hoàn toàn là lãng phí, trong khi có những đoạn rất hợp để viết bằng assembly. Ví dụ có trường hợp hoàn toàn không dùng hàm đệ quy
      Vấn đề là tính di động. Tôi thích AVR-8, nhưng khi yêu cầu lớn dần thì AVR-8 hầu như không còn đường đi nào ngoài việc làm soft core trên FPGA
      Nếu dùng C thì có thể chuyển sang vi điều khiển ARM, cá nhân tôi thấy kém vui hơn nhưng hiệu năng lại tốt hơn
      Vấn đề của AsmBB cũng là nó bị buộc chặt vào một kiến trúc cụ thể
    • Liệu ngay cả trong chế độ WAL với PRAGMA synchronous để là NORMAL cũng vậy sao? Tôi hoàn toàn không phải chuyên gia SQLite, chỉ đang tìm hiểu để dùng cho dự án thôi
  • Có đoạn nói rằng “ngoài ra còn hỗ trợ ký tự Unicode Emoji theo cách thật sự native”, nhưng tôi muốn được giải thích kỹ hơn ở đây
    Tôi không rõ “thật sự native” nghĩa là gì, và cũng không rõ nó khác gì với cách làm “hơi native”

    • Có vẻ trong mã assembly của AsmBB hoàn toàn không có phần xử lý emoji, nên trông như chỉ cho đi qua gần như nguyên trạng
      Tuy vậy, phần chat thời gian thực có tô nổi emoji trong mã JS là một phần của template:
      function formatEmoji(text) {
      var emojiRegEx = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;
      return text.replace(emojiRegEx, '$1');
      }
      Có lẽ ý định là bắt U+00A9, U+00AE, U+2000..3300, U+1F000..1FBFF, nhưng bản thân phạm vi đó đã quá rộng, và regex này cũng không phải một cách triển khai đầy đủ
      Nếu muốn một lời giải đúng đắn hơn thì có thể dùng emoji-regex [1] hoặc mẫu mới hơn là /\p{RGI_Emoji}/v [2]
      [1] https://unpkg.com/browse/emoji-regex/index.js
      [2] https://caniuse.com/mdn-javascript_builtins_regexp_unicodese...
    • Chỉ là suy đoán, nhưng có thể ý là một số trang như Twitter dùng bộ emoji riêng, còn ở đây thì không làm vậy mà để hệ điều hành tự render emoji mặc định
  • Có nút tắt thông báo thời gian thực ở phần header
    Nói thêm thì việc hiển thị danh sách người dùng diễn đàn cho người chưa đăng nhập có vẻ không hay lắm. Đây có phải là mục có thể cấu hình không?

    • Trên di động tôi không tìm thấy nút tắt thông báo thời gian thực
    • Diễn đàn xưa giờ vốn vẫn như vậy, và có lẽ cũng cấu hình được
  • Ý tưởng và cách triển khai thực sự rất tốt. Tuy vậy, thông báo thời gian thực nhanh chóng trở nên quá nhiều, nên có lẽ cần giới hạn tốc độ dưới một hình thức nào đó

    • Những thứ như @User123 has entered the thread có lẽ rất hợp với các diễn đàn nhỏ nơi mọi người đều biết nhau
      phpBB/vBulletin cũng từng hiển thị danh sách “Người dùng đang xem chủ đề này: ...” vì lý do đó, và cũng từng có plugin phổ biến hiển thị @Foo@Bar đang viết trả lời trong chủ đề này
      Đặc biệt trong các cuộc tranh luận căng thẳng, nó tạo cảm giác không gian sống động hơn, và việc biết đối phương đang viết bài dài tiếp theo để phản biện bài của tôi theo từng đoạn trích dẫn cũng có cái hay riêng
      Nhưng việc nhận thông báo mỗi khi khách chưa đăng ký bấm vào chủ đề thì có vẻ chẳng hữu ích cho ai cả
    • Có thể tắt thông báo thời gian thực bằng cách nhấn vào biểu tượng chuông
  • Cũng có thể làm thứ tương tự bằng C và từ bỏ thư viện chuẩn. Có thể khiến nó không có phụ thuộc nào ngoài system call
    Ngoài khía cạnh rèn luyện trí óc ra thì tôi không thấy có lý do thật mạnh mẽ nào để nhất thiết phải làm bằng assembly

  • Trong tiêu đề còn thiếu cả việc đó là loại assembly nào, thậm chí chạy trên hệ điều hành nào
    Gộp “x86 asm” và “on linux” lại cũng không dài hơn “assembly language”