ニュース

「Ruby 3.2.0」が正式リリース ~WebAssembly/WASIをサポート、YJITは試験扱いを卒業

正規表現エンジンはReDoS攻撃への耐性を高める

「Ruby 3.2.0」が正式リリース

 スクリプト言語「Ruby」の最新版「Ruby 3.2.0」が、例年通り12月25日に公開された。WASIベースのWebAssemblyがサポートされたほか、実験的機能の扱いを卒業した「YJIT」、ReDoS攻撃への耐性を高めた正規表現エンジンなどが導入されている。

WASIベースのWebAssembly

 WebAssembly(WASM)はもともとWebブラウザー上で安全かつ高速にプログラムを実行するために導入されたが、Webブラウザーなしで単体動作すれば、つまり一般的なアプリケーションにも利用できれば、活用の幅はより一層広がるだろう。

 そこで開発が進められているのが、WASI(The WebAssembly System Interface)だ。これはWASMがOSと対話できるようにするモジュールで、WebAssemblyが動作する仮想マシンのシステムインターフェイスを標準化している。

 WebAssembly環境で「CRuby」がそのまま実行できるので、Webブラウザー上でオリジナルの「CRuby」の動作を体験するといった活用が可能。WASI上に仮想ファイルシステム(VFS)を構築し、Rubyアプリを1つの.wasmファイルにまとめられるようになっているので、アプリの配布も容易だ。

 現状のWebAssembly/WASIはまだ不足している機能があるため、Rubyによる対応も「初期版」という位置づけだが、今後の普及に期待がかかる。

「YJIT」が製品レディな品質に

 「YJIT」はShopifyが開発した新しいプロセス内JITコンパイラーで、「Ruby3をRuby2の3倍速くする」という目標「Ruby3x3」を達成する上でカギとなった技術だ。「Ruby 3.1.0」で試験的に導入されたが1年以上にわたる実稼働環境でのテストで、非常に安定していることが証明されたため、本バージョンで実験機能を卒業し、正式な機能となった。

実行速度に優れる「YJIT」

 「YJIT 3.2」リリースは3.1よりも高速で、メモリのオーバーヘッドが約1/3になっている。対応プラットフォームはLinux、macOS、BSDおよびその他のUNIXプラットフォームで、x86-64とarm64/aarch64の両方がサポートされる。Apple M1/M2やRaspberry Pi 4などでも利用可能だ。

ReDoS攻撃への耐性を高めた正規表現エンジン

 正規表現(Regexp)には、特定のマッチングで組み合わせが爆発し、DoS攻撃を引き起こせることが知られている(正規表現DoS、ReDoS)。もし外部から与えられた正規表現を十分にチェックせず、そのままプログラムに渡してしまうと、アプリケーションやシステムを無反応状態に追い込める。

 そこで「Ruby 3.2.0」では2つの軽減策が導入された。

 1つ目は、メモ化技術の導入だ。計算結果を保持して再利用することで、たとえば以下のようなマッチングにかかる時間が大幅に軽減される。

# 「Ruby 3.1」では10秒かかるが、「Ruby 3.2」では0.003秒で完了する

/^a*b?a*$/ =~ "a" * 50000 + "x"

 ただし、メモリの消費は増える。これにも対策が施されているので実用上の問題はないはずだが、利用の際は注意したい。

メモ化技術の導入でパフォーマンスを大幅に改善した正規表現エンジン

 もう1つは、Regexpにタイムアウト機能を導入したことだ。たとえば、以下のコードはマッチングに1秒以上かかるとエラーを発生させる。アプリが無反応になるという最悪の事態を避けることが可能だ。

Regexp.timeout = 1.0

/^a*b?a*()\1$/ =~ "a" * 50000 + "x"

 なお、この指定方法はグローバルに影響する。個別の処理にタイムアウトを設定したい場合は、Regexpオブジェクトを生成する際にタイムアウトを指定すればよい。

 そのほかにも、言語機能の強化やパフォーマンスの改善が行われた。メソッドの非推奨化や削除、互換性にかかわる変更も若干含まれているので、アップグレードの際は注意したい。

 「Ruby」は、まつもとゆきひろ(Matz)氏によって1993年に開発が始められたスクリプト言語。オープンソースで開発が続けられており、Webアプリケーションをはじめ、さまざまな用途・プラットフォームで採用されている。バイナリとソースコードは現在、公式のWebサイトから無償でダウンロード可能。Windows環境では「RubyInstaller for Windows」の利用が推奨されている。「Ruby 3.2.0」に対応した「RubyInstaller for Windows」はまだリリースされていないが、間もなく公開されるだろう。