アセンブリ言語で書かれた軽量Webフォーラムエンジン AsmBB
(asmbb.org)- AsmBBはJohnFoundが開発した高速で軽量なWebフォーラムエンジンで、アセンブリ言語とSQLiteベースの構成により、小規模なサーバーでもフォーラムを運用できる
- x86 Linuxサーバーで32ビットと64ビットの両方をサポートし、事前インストールされた追加ライブラリなしで、VPSやFastCGI対応の共有ホスティングでも動作可能
- セキュリティ面では依存関係の少なさと内部設計を重視しており、v2.7のSQLeet暗号化データベース対応から、v3.0のSQLite3MultipleCiphers対応へと発展している
- テーマ、テンプレートのカスタマイズ、MiniMag・BBCode、添付ファイル、限定アクセススレッド、リアルタイムチャット、Atom/RSS、SSE通知、多言語UI、YouTube埋め込み、スレッドランキングまで機能が拡張されている
- v3.0ではデータベースとテンプレート構造に互換性のない変更があり、v2.9.1から更新する際は、復号、バックアップ、スキーマ変更、バイナリと
templates/の置き換えが必要
AsmBBの構造と実行環境
- AsmBBはWebフォーラムエンジンであり、AsmBB.orgフォーラム自体もAsmBB上で動作している
- 全体がアセンブリ言語で書かれており、データベースバックエンドとしてSQLiteを使用している
- 貧弱なホスティング環境でも、多くの訪問者を遅延なく処理できることを特徴としている
- 実行要件は比較的低い
- x86 Linuxサーバーが必要
- 32ビットと64ビットの両方をサポート
- 特別な事前インストール済みライブラリは不要
- 最小構成または低価格のVPSでも動作可能
- FastCGIをサポートしていれば共有ホスティングでも利用可能
- FastCGIインターフェースをサポートするWebサーバーが必要
- 動作確認済みのWebサーバーはNginx, Apache, Lighttpd, Hiawatha, RWASA
セキュリティと暗号化データベース
- AsmBBは内部設計と少ない依存関係を基盤に、高いセキュリティを備えたWebアプリケーションを目指している
- より高いセキュリティのために、暗号化データベースをオプションでサポートしている
- v2.7の主な変更点は、暗号化されたフォーラムデータベースのサポート
- SQLiteプラグイン SQLeet を使用
- 仕様上、PBKDF2-HMAC-SHA256による鍵導出、16バイトのsalt、12345回の反復をサポート
- ChaCha20ストリーム暗号とワンタイムキーを使用
- Poly1305認証タグを使用
- 暗号化は管理者設定パネルの新しいEncryptionタブで有効化・無効化できる
- 暗号鍵はディスクに保存されず、RAMにのみ一時保存される
- Webサーバー、バックアップサーバー、バックアップ媒体が深刻に侵害された場合でも、フォーラムデータベース、アカウント属性、個人データの漏えいを防ぐことを目標としている
- 既知の制約として、エンジンが再起動されるたびにWebインターフェースから暗号鍵を再入力する必要がある
- サーバーが偶発的に再起動した場合、しばらくフォーラムにアクセスできなくなる可能性がある
- AsmBBは長期間安定して動作するアプリケーションであり、このような事態は数か月または数年に一度程度だと説明している
- 暗号化データベースを使用する場合はSSL/TLSの利用が必須
カスタマイズと導入経路
- AsmBBはテンプレートシステムにより、コードを直接修正せずにフォーラムをカスタマイズできる
- バイナリパッケージは asmbb.tar.gz から入手でき、このリンクは最新のバイナリパッケージを指している
- 進捗確認、バグ報告、ソースの複製は AsmBB source repository で行える
- 自前サーバーへの導入ドキュメントとして NGINXとsystemdのインストールチュートリアル が提供されている
- RWASAを使えば2分未満で導入でき、動画チュートリアル と YouTube動画 が用意されている
最近のフォーラム変更点
- 現在のフォーラムにはGlass, Neumor, Poly, Brutal, Joly, Tailwind, Snesテーマが追加されている
- MiniMagボタンによるURL挿入では、選択したテキストがアンカーテキストとして使われる
- メール認証はデフォルト言語設定に合わせて送信される
- MiniMag関連の修正が行われた
- 連絡先やTOSなどに使えるpage機能が実装された
- APIが実装された
v3.0の主な変更とアップグレード時の注意点
- v3.0には複数の新機能が追加された
- 画像を直接貼り付けて添付ファイルとして追加可能
- YouTube動画の埋め込みをサポート
- コードとテンプレートを簡素化する統合投稿/スレッドエディタを導入
- スレッドランキングを追加
- 品質が低いとしてModernスキンはプロジェクトから削除された
- v3.0には従来版との互換性のない変更が含まれる
- データベース構造の変更
- テンプレート構造の変更
- SQLeetプロジェクトの終了により、SQLite3MultipleCiphers 暗号化拡張のサポートが追加された
- バイナリリリースパッケージはこの拡張とともにコンパイルされている
- 発見されたバグと脆弱性が修正された
- 複数のバグは hxp CTF event の結果として発見された
- v2.9.1からv3.0へデータベースを更新する際は、手順の順序が重要
- 既存データベースを変更する前に復号が必要
- 新しいSQLite3MultipleCiphersライブラリは、既存のSQLeetライブラリと互換性のないモードで使用される
- v3.0へ移行する前にデータベースを復号し、その後に新ライブラリで再暗号化できる
- 問題発生時に備えてバックアップが必要
- SQLiteコンソールで提供されたスキーマ変更SQLを実行する必要がある
- データベーススキーマ変更後、エンジンを停止し、
engine,ld-musl-i386.so,libsqlite3.soのバイナリファイルを置き換える必要がある - エンジン停止中に
templates/ディレクトリ全体を新しいものに置き換える必要がある - エンジンを再起動した後、更新後のフォーラムに問題がないか確認する必要がある
- すべて正常に見えれば、AsmBB設定ページでデータベースを再暗号化できる
v2.x リリースの流れ
-
v2.9: Urban Sunriseと編集体験の改善
- 新しいレスポンシブテーマUrban Sunriseが追加された
- フォーラム外観の改善を目的としている
- 投稿エディタに書式ヘルプが内蔵された
- 投稿エディタとリアルタイムチャットでUnicode Emojiをネイティブサポート
- JSライブラリによるソースコード構文ハイライトをサポート
- リアルタイムチャットはソースコードを含む複数行投稿を受け取れる
- AsmBBエンジンとFreshLibライブラリで報告されていたバグが修正された
-
v2.8: バグ修正と防御機能
- 複数のバグが修正され、一部は重大なバグだった
- 新テーマModernが追加された
- AsmBBがリクエスト速度に耐えられないまれなケースに備え、DDOS保護が実装された
- MiniMagおよびBBCodeパーサー向けのURLアナライザーが追加され、ユーザーリンク経由のXSS攻撃を防止する
-
v2.6: ドイツ語UIとSSE拡張
- ドイツ語UI翻訳を含む最初の公式版
- 他の翻訳もコミュニティの協力で改善された
- Atom/RSSフィードでフォーラム全体、特定タグ、特定テーマを購読できる
- Server-Sent Events (SSE) の処理がゼロから書き直された
- SSEはリアルタイムチャットだけでなく、新規投稿やユーザー活動など、さまざまなフォーラムイベント通知にも使えるようになった
- すべてのクライアントを単一スレッドで処理し、多数の訪問者を低いサーバー負荷で同時にさばく
- SQLiteとMUSLライブラリの最新バージョンがバイナリパッケージに含まれている
-
v2.5: 多言語UIとBBCode
- ユーザーインターフェースの国際化が導入された
- ユーザーはフォーラムUI言語を選択できる
- 提供言語は English, Bulgarian, Russian, French
- 第2のマークアップ言語としてBBCodeパーサーが追加され、MiniMagとBBCodeの両方を理解する
- BBCodeは他のフォーラムエンジンから移行するスクリプトを作る際に役立つ
sendmailのような外部プログラムでメールを送信できる
-
v2.4: 添付、限定アクセス、チャット性能
- 投稿にファイルを添付でき、添付権限はユーザーごとに管理される
- Limited access threadsでは、スレッド所有者がアクセス可能なユーザー一覧を指定できる
- 管理ページでユーザー権限を編集可能
- 匿名ユーザー権限を別途設定でき、登録ユーザーのみが読めるクローズドフォーラムを作成できる
- リアルタイムチャットサービスは、単一スレッドですべての接続を処理するようにリファクタリングされた
- テンプレートレンダリングエンジン、データベーススキーマ、SQLリクエスト最適化により、前バージョンより約20%高速
-
v2.3: 保守とアクセシビリティ
- 深刻なバグ2件を修正したメンテナンスリリース
- アクセシビリティ向上のため、背景画像を
altテキスト付きの<img>タグに置き換えた - 画像を無効にしていてもフォーラムを利用できる
- チャット用JSコードが整理され、わずかに高速化された
-
v2.2とv2.1: ログイン、復旧、ナビゲーション
- ログイン状態の保持、パスワード再設定、ユーザー一覧、チャット改善を含む
- ログイン状態の保持はデフォルトで無効
- パスワード再設定には有効なメールアドレスが必要で、ログインフォームのリンクからアクセスできる
- v2.2ではタグシステムベースのCategoriesナビゲーションが追加された
- 投稿の編集/削除履歴の保持と復元機能が追加された
-
v2.0: 性能とコードセキュリティ
- テンプレートレンダラー
render.asmはrender2.asmに置き換えられた - 新実装はよりアセンブリらしいアルゴリズムを使い、より高速でメモリ消費も少ない
- URL解析の連鎖文字列比較はハッシュテーブルに置き換えられた
- AsmBBの速度は約2倍になった
- OWASP ZAPやTinfoil securityを含むテストツールで見つかった脆弱性が修正された
- 強力なファジングと準DDOS負荷テストの過程で見つかったリソースおよびメモリリークが修正された
- リソースとメモリの割り当て・解放を収集し、Webページとして報告するデバッグツールが実装された
- テンプレートレンダラー
1件のコメント
Hacker News の意見
これは本当にクールだが、次の文はかなり疑わしい。
「AsmBB は内部設計と依存関係の少なさのおかげで、非常に安全な Web アプリケーションである。」
よく検証された依存関係を使うことにも大きな価値があるし、Chuck Norris でさえ複雑なソフトウェアをアセンブリで書けばバグを作らざるを得ない。
特にこのプロジェクトのように文字列処理を大量に行う必要がある場合はなおさらだ。
以前、このプロジェクトの最新バージョンをそのままホストしたCTF 問題として出題されたときも同じように感じたし、大会中に少なくとも 8 件の脆弱性が見つかった。
https://ctftime.org/task/24399
例えば「AsmBB は設計上セキュリティを重視し、依存関係への依存を抑えている」くらいならよかったと思う。
気に入ったし、アセンブリ言語で押し通した点もすごい。依存関係を減らせば攻撃対象領域が小さくなるのは確かだが、それだけで「安全」とは言えない。
確率的にはエクスプロイト可能性を下げるが、アセンブリ言語にはメモリ安全性やその他の保証がまったくないので、リスクを高める面もある。
どちらが大きいかは断言できないが、それでもアセンブリ言語のアプリケーションは魅力的だ。おまけに aarch64 にトランスパイルすれば、Pi-Zero や Pi-W を壁面アダプタに挿して動かすこともできそうだ。
一方で、分散フォーラムについても折に触れて調べてきた。Usenet が押しのけられてからこうしたフォーラムが主流になったが、代替になるなら Usenet の分散/複製機能と phpBB のようなユーザー体験の両方を備えるべきだと思う。
分散され、結果整合性を持たせるのは優れた分散システムの課題で、パズルのように楽しめる。似たものを作ったことがあるならぜひ見てみたい。
符号付き算術のオーバーフローとアンダーフローは期待どおりに動作し、
mmap + MAP_ANONYMOUSで割り当てたメモリは期待どおり 0 で初期化される。アドレス 0 を含め、マップされていないアドレス空間にアクセスすれば、期待どおり
SIGSEGVが発生する。アセンブラは C コンパイラよりずっと少ない仮定しかしないし、賢く振る舞いすぎないので、期待を静かに裏切るよりも、エラーで即座に落ちる可能性のほうが高い。
フッターを見る限り、処理時間はばかげたほど速い。だがドキュメントがデンマークまで転送されるのに 500〜1000ms かかる。
この場合は高性能なコードよりCDNのほうがよさそうだが、それでも印象的な仕事だ。
もちろん転送時間が大きな割合を占めているのだろうが、それが「良い」と見なされるなら少し厳しそうだ。
アセンブリコードでデータベースにはどう接続するのか気になる。アセンブリライブラリのようなものがあるのだろうか。
理屈の上では理解できるが、そういう「簡単な」ものを自分で書くのにかかる労力はものすごく大きそうだ。
関連コードはここにある: https://asm32.info/fossil/asmbb/file?name=source/sqlite3.asm...
アセンブリでプログラミングするというのは、基本的にコンパイラがやることを自分でやるということであり、C コードが呼び出せるのと同じライブラリ関数を呼び出せる。
ただし対象アーキテクチャの呼び出し規約に従う必要があるので面倒で退屈だが、不可能に近いことではない。
x64 はまずレジスタを使い、使い切るとスタックに渡す方式なので、関数呼び出しがより面倒になった。x32 はスタックだけを使うのでずっと楽だったが、x64 の規約は値をレジスタに保持してより高速なコードを作れる。
アセンブリだけで書かれているわけではなく、背後には SQLite がある。多くのアプリケーションと同様、ボトルネックは CPU よりも入出力である可能性が高い。
もちろん、自分が見てきた PHP コードを考えると、なぜそう感じるのかも理解はできる。だがそれは言語自体というより使い方の問題だ。
問題は移植性だ。AVR-8 は好きだが、要件が大きくなると AVR-8 は FPGA ソフトコアくらいしか行き場がない。
C なら ARM マイクロコントローラに移せるし、個人的には面白さは減るが性能はより出る。
AsmBB の問題も、特定のアーキテクチャに縛られている点だ。
PRAGMA synchronousをNORMALにした WAL モードでもそうなのだろうか。SQLite の専門家ではまったくなく、プロジェクトで使おうと思って調べているところだ。「さらに Unicode Emoji 文字を本当にネイティブな方法でサポートしている」とあるが、ここをもっと詳しく説明してほしい
「本当にネイティブ」が何を意味するのかよく分からないし、「少しネイティブ」な方式とどう違うのかも不明確
ただしリアルタイムチャットでは、テンプレートの一部である JS コードで絵文字を強調表示している:
function formatEmoji(text) {var emojiRegEx = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;return text.replace(emojiRegEx, '$1');}おそらく U+00A9、U+00AE、U+2000..3300、U+1F000..1FBFF を拾おうという意図だったのだろうが、それ自体も広すぎるし、正規表現も忠実な変換ではない
正しい解法が気になるなら、
emoji-regex[1] か、より最近の/\p{RGI_Emoji}/vパターン [2] を使えばよい[1] https://unpkg.com/browse/emoji-regex/index.js
[2] https://caniuse.com/mdn-javascript_builtins_regexp_unicodese...
ヘッダーにリアルタイム通知をオフにするボタンがある
付け加えると、ログインしていない人にフォーラム利用者一覧を見せるのはあまり良さそうに見えない。設定可能な項目なのだろうか?
コンセプトと実装は本当に良い。ただしリアルタイム通知がすぐに圧倒的な量になるので、何らかの形でレート制限が必要そうだ
@User123 has entered the threadのようなものは、皆がお互いを知っていた小さなフォーラムではよく合っていたと思うphpBB/vBulletin が「このスレッドを読んでいるユーザー: ...」一覧を表示していたのもそのためで、
@Fooと@Barがこのスレッドに返信を書いているところだと表示する人気プラグインもあった特に激しい議論中には場がより生きている感じを与えたし、相手が自分の投稿を引用単位で反論する次の長文を書いていると分かるのも、それはそれで良かった
だが未登録ゲストがスレッドをクリックするたびに通知を受けるのは、誰にとっても有用には見えない
C でも似たようなものは作れるし、標準ライブラリを捨てることもできる。システムコール以外には依存しないように作れる
知的訓練という点を除けば、あえてアセンブリでやる強い理由はよく分からない
タイトルにはどのアセンブリなのか、さらにはどの OS で動くのかさえ抜けている
「x86 asm」と「on linux」を合わせても「assembly language」より長くはない