Seroval: JSONデシリアライゼーションにおける、型付き配列の長さのチェック不足によるメモリ枯渇
# 概要
deserializeTypedArray関数は、ソースノードをArrayBufferにキャストしますが、そのチェックを行わず、要素数を制限しません。長さプロパティを持つ単純なオブジェクトを渡すと、配列のような型付き配列のコンストラクタが呼び出され、指定された数の要素が割り当てられます。上記のオフセットガードはこれを防ぐことができません。なぜなら、source.byteLengthが未定義であるため、比較は常に偽となります。
JSONに含まれる長さは整数であるため、非常に小さなデータでも任意の割り当てサイズを指定でき、これによりイベントループが停止する代わりに、単一のリクエストが遅延するだけではなく、同期的に動作し、イベントループを完全に停止させてしまいます。fromCrossJSONも同様の問題があります。
影響は、信頼できないSeroval JSONをデシリアライズするすべてのサービスにおいて、認証されていないCPU/メモリの枯渇を引き起こします。これは、既に修正された配列の長さやネストの深さに関するDoS攻撃と同様の問題です。機密性や完全性への影響はありません。DataViewには同様のチェック不足がありますが、代わりにエラーを発生させます。実行時にArrayBufferのインスタンスチェックを行い、サイズの上限を設けることで、この問題を修正できます。
影響を受けるパッケージ:
- npm (JavaScript) seroval: 影響を受けるバージョンは1.6.2以下、1.6.3で修正済み。