MariaDB Connector/Node.jsにおいて、不正なGeoJSONパラメータによって、初期化されていないプロセスメモリが公開される脆弱性があります。

### 概要
バイナリプロトコルでGeoJSONのポリゴンまたはマルチポリゴンパラメータをエンコードする際、このコネクタは、各リングのlengthプロパティに基づいて出力バッファのサイズを決定し、配列として認識されたリングのみを書き込んでいました。しかし、2つのループで処理方法が異なっており、数値のlengthを持つ非配列のリング(例えば、文字列や{"length": 4000}のようなオブジェクト)の場合でも、4 + 16 * length バイト分の領域が予約されますが、何も書き込まれません。このバッファはBuffer.allocUnsafe()によって作成され、書き込み位置がどれだけ進んでいても、完全に返されるため、予約されたものの書き込まれていないすべてのバイトが、初期化されていないNode.jsのヒープ領域となります。

同様の脆弱性がLineStringの場合には、最初の不正なポイントで処理が中断され、nullが返されるため、予約されたバイトが書き込まれない状態に保たれています。

この脆弱性が発生する条件は、GeoJSONの型を定義するvalue.typeに依存しており、{"type": "Polygon", ...}のような構造を持つオブジェクトがエンコーダに到達すると発生します。

### 影響
攻撃者が制御するオブジェクトを、execute()またはbatch()関数にパラメータとして渡すと、初期化されていないプロセスメモリがデータベースに書き込まれます。この書き込まれたデータは、その行を読み取ることができるすべてのユーザーによって読み取ることができ、バックアップやレプリカにも永続化されます。地図や位置情報機能のためにGeoJSONを受け入れるアプリケーションは、特に影響を受けやすいと考えられます。なぜなら、攻撃者は座標を直接制御できるからです。

この脆弱性によって公開されるメモリは、リクエストを行ったユーザーに限定されません。共有のNode.jsプロセスでは、ヒープ領域に他のユーザーのリクエストやレスポンスの本文、セッショントークンやCookie、データベースの認証情報、TLSの鍵などが含まれている可能性があります。この脆弱性は、挿入処理が成功し、カラムが本来よりも多くのバイト数を持つという形で、目立たない形で発生します。

この脆弱性の発生には、デフォルト以外のコネクタオプションや、特定のサーバーの設定は必要ありません。query()関数は影響を受けません。なぜなら、テキストエンコーダはジオメトリを文字列として構築し、Buffer.allocUnsafe()を使用しないからです。

### 修正点
PolygonおよびMultiPolygonエンコーダは、スペースを確保する前に、配列ではないリングを拒否するようになりました。これにより、書き込みループによって割り当てられたバイトが初期化されずに残ることはなくなり、既存のLineStringの動作と一致します。

###
回避策
オブジェクトをパラメータとして渡す前に、GeoJSONの座標が正しくネストされた数値の配列であることを検証するか、アップグレードされるまでquery()を使用してください。

影響を受けるパッケージ:
- npm (JavaScript) mariadb: 影響を受けるバージョンは3.2.5未満、3.2.5で修正済み
- npm (JavaScript) mariadb: 影響を受けるバージョンは3.3.0以上、3.3.4未満、3.3.4で修正済み
- npm (JavaScript) mariadb: 影響を受けるバージョンは3.4.0以上、3.4.7未満、3.4.7で修正済み
- npm (JavaScript) mariadb: 影響を受けるバージョンは3.5.0-rc.0以上、3.5.4未満、3.5.4で修正済み