何が起きたか
Elo の Ruby 出力では、文字列リテラルや型制約のラベルに含まれる # がエスケープされず、#{...} の式展開やバッククォートを通じて攻撃者の Ruby コードやシェルコマンドが実行されます(重大)。JavaScript 出力では .constructor へのメンバーアクセスが制限されておらず、constructor.constructor をたどって Function を呼び出すことで Node.js やブラウザ上で任意のコードが実行できます(重大)。さらに、プログラムから組み立てた AST の数値・変数名・プロパティ名などが検証されずにそのまま出力されるため、JSON など外部由来の値から AST を作っている場合は JavaScript / Ruby / Python のコード注入や SQL インジェクションが起こります(高)。
やること
@enspirit/elo を 1.0.1 以降に更新してください。更新までは、信頼できない入力を Elo のコードやデータ(bin/elo の -f elo など)として渡したり、外部から受け取った値で AST を組み立てたりしないでください。
出典
GitHub Advisory Database(Ruby 出力の RCE)github.com英語 ↗GitHub Advisory Database(JavaScript 出力のサンドボックス脱出)github.com英語 ↗GitHub Advisory Database(AST 経由のコード注入)github.com英語 ↗上の要約は通り道編集部がまとめたものです。影響範囲と修正版は必ず各出典で確認してください。