ymawky: Linux用 純ARM64アセンブリ Webサーバー
ymawky: Linux用 純ARM64アセンブリ Webサーバー
ymawkyは、ミニマルなシステムプログラミングにおける高性能な実験的プロジェクトです
ymawkyは、システムコールのみに依存することでC標準ライブラリ(libcなし)を使用せずに動作するように設計された、完全にARM64アセンブリで記述されたWebサーバーです。元々はmacOS向けに開発されましたが、現在はLinux向けにポートされ、静的コンテンツとCommon Gateway Interface (CGI) スクリプトを介した動的コンテンツの両方を処理する、接続ごとのforkモデルのサーバーとして動作します。
コア技術アーキテクチャ
システムコールのみの実行
nymawkyは高レベルライブラリを完全にバイパスし、ARM64アセンブリを介してLinuxカーネルと直接対話します。このアプローチにより、libcのオーバーヘッドを排除し、Webサーバーがネットワークソケットやファイルシステムとどのように対話するかを直接的に把握することができます。
接続処理
サーバーは、接続ごとにプロセスを生成するfork-per-connectionモデルを採用しています。PIDの枯渇を防ぐため、サーバーはMAX_PROCS制限(デフォルトは256)を実装しており、制限に達した場合は503 Service Unavailableレスポンスを返します。
リクエスト処理とHTTPサポート
nymawkyは、HTTP/1.0およびHTTP/1.1の主要なサブセットを実装しています。これには以下が含まれます:
- サポートされているメソッド: GET, PUT, DELETE, OPTIONS, HEAD, および POST (CGI経由)。
- Rangeリクエスト:
Range: bytes=(サフィックスおよびオープンエンドの範囲を含む)を完全にサポートしており、ビデオのシーク(scrubbing)などの機能を実現します。 - アトミックなアップロード:
PUTリクエストは一時ファイル(www/.ymawky_tmp_<pid>)に書き込まれ、正常に完了したときのみ名前が変更されます。これにより、並行アップロードによってファイルが破損することを防ぎます。 - MIME検出: Webアセット、画像、フォント、ドキュメント、ビデオ、オーディオ、アーカイブをカバーする包括的なファイル拡張子のリストに基づき、
Content-Typeを自動的に割り当てます。
CGIによる動的コンテンツ
CGI実装
nymawkyは、設定可能なディレクトリ(デフォルトはcgi-bin/)にあるCGIスクリプトを通じて動的コンテンツをサポートします。サーバーは、QUERY_STRING環境変数を設定し、スクリプトの出力とStatus:ヘッダーをクライアントに転送することで、これらのスクリプトを実行します。
CGIの制限とセキュリティ
CGIサポートは現在実験的です。サーバーはPATH_INFOをサポートしておらず、すべてのパスをリテラルなファイルパスとして扱います。CGIスクリプトは独立した実行ファイルであるため、入力の解析やエラーハンドリングはスクリプト自身が責任を持つ必要があります。著者は、CGIスクリプトには他のリクエストに対して適用される厳格なタイムアウト設定が欠けてており、プロセスをハングさせる可能性があると述べています。
セキュリティと安全対策
手書きのアセンブリプロジェクトであるにもかかわらず、ymawkyは一般的なWeb脆弱性を軽減するためにいくつかの組み込みの保護機能を備えています:
- パス・トラバーサル防止: サーバーは、ドキュメントルートの外へ移動しようとする
..シーケンスをブロックします。ただし、ファイル名の中に複数のピリオドが含まれることは許可されます(例:ohwell...txtは許可されます)。 - DoS対策: Slowloris型の攻撃を防ぐため、サーバーは読み取り間の
RECV_TIMEOUT(10秒)と、ヘッダー受信の合計時間であるHEADER_REQ_TIMEOUT_SECS(10秒)を強制します。 - ファイルシステム制約: サーバーは
PATH_MAX(4096バイト)を超えるパスを拒否し、最初の16バイト以内にパスが含まれていないリクエストを拒否します。また、O_NOFOLLOW_ANYを使用して、シンボリックリンクを含むパスを拒否します。 - アップロード制約:
PUTリクエストはMAX_BODY_SIZE(デフォルトは1GiB)および最小バイト/秒の閾値(PUT_MIN_BPS)によって制限され、過剰に遅いアップロードによってリソースを占有することを防ぎます。
設定とデデプロイ
設定は、アセンブリ実行時にconfig.Sを介して行われます。主な設定可能なパラメータは以下の通りです:
- DOCROOT: 静的ファイル用のディレクトリ(デフォルトは
www/)。 - CGI_DIR: 実行可能なCGIスクリプト用のディレクトリ(デフォルトは
cgi-bin/)。 - ERR_DIR: ディレクトリ(デフォルトは
err/)。 - Timeouts: 接続の維持を制御するための
RECV_TIMEOUTおよびPUT_GRACE_SECSの調整可能な設定。
ビルド要件
ymawkyをコンパイルするには、システムにgccとbinutilsがインストールされている必要があります。プロジェクトは、バイナリをストリップ(stripped)にするためのmakeコマンドと、デバッグシンボル付きのバイナリを作成するためのmake debugコマンドを提供しています。