[緊急解説] MariaDB Connector/Node.jsの深刻な脆弱性 (GHSA-48qf-xh34-q73r)
はじめに
日本のフロントエンドエンジニアの皆さん、こんにちは!Node.jsをバックエンドやAPIゲートウェイとして利用しているプロジェクトも多いのではないでしょうか。今回は、データベース接続ライブラリである「MariaDB Connector/Node.js」で発見された、GHSA-48qf-xh34-q73r (CVE-2026-107383) という深刻な脆弱性について解説します。一見バックエンド寄りの話に思えますが、フロントエンドから送信されるデータが脆弱性をトリガーする可能性があるため、ぜひご一読ください。
脆弱性の概要と深刻度
この脆弱性は、MariaDB Connector/Node.jsがGeoJSON形式のPolygonまたはMultiPolygonパラメータをバイナリプロトコルでエンコードする際に発生します。不正な形式のGeoJSONデータ(特に`length`プロパティを持つが実際は配列ではない「リング」構造)が渡された場合、メモリバッファの一部が未初期化のままデータベースに書き込まれてしまう問題です。
深刻度は「High」とされており、攻撃者はこの脆弱性を悪用して、未初期化のNode.jsプロセスメモリ(他のユーザーのセッション情報、データベース認証情報、TLSキーマテリアルなど)をデータベース経由で読み取ることが可能になります。
技術的詳細:なぜ未初期化メモリが漏洩するのか?
MariaDB Connector/Node.jsでは、GeoJSONデータをデータベースに保存する際、`Buffer.allocUnsafe()`というメソッドでメモリバッファを確保しています。このメソッドは、高速なメモリ確保のために**初期化されていない**メモリ領域を確保するという特性があります。
脆弱性のあるバージョンでは、GeoJSONのPolygonやMultiPolygonの「リング」(座標の配列)を処理する際、リングの`length`プロパティに基づいて出力バッファのサイズを決定し、その後、実際にそのリングが配列である場合にのみデータを書き込んでいました。
問題は、リングが**配列ではないが数値の`length`プロパティを持つオブジェクト**(例: `{"length": 4000}`のような文字列やオブジェクト)であった場合に発生しました。この場合、コネクタは`length`プロパティに基づいて大きなバッファ領域を確保しますが、実際にデータを書き込むループでは「これは配列ではない」と判断し、何も書き込みません。
結果として、`Buffer.allocUnsafe()`で確保されたバッファの一部が未初期化のまま残り、その中にNode.jsプロセスの他の部分で使用されていた古いデータ(機密情報を含む可能性のあるヒープメモリ)が混入し、そのままデータベースに書き込まれてしまうのです。
ちなみに、`LineString`のケースでは、不正なポイントを検出するとすぐに処理を中止するため、この問題は発生しませんでした。
影響範囲とフロントエンドへの関連
この脆弱性は、`execute()`または`batch()`メソッドに、攻撃者が操作したGeoJSONオブジェクトをパラメータとして渡した場合に発生します。データベースに書き込まれた未初期化メモリは、その行を読み取れる者であれば誰でもアクセス可能になり、さらにデータベースのバックアップやレプリカにも永続化されます。
漏洩する可能性のある情報には、以下のようなものが含まれます。
・他のユーザーのリクエスト/レスポンスボディ
・セッション情報、認証トークン、Cookie
・データベース接続の認証情報
・TLS(SSL/TLS)のキーマテリアル
この問題はサイレントに発生し、データ挿入自体は成功してしまうため、気づきにくいのが特徴です。また、`query()`メソッドはテキストエンコーダを使用するため、この脆弱性の影響を受けません。
フロントエンドエンジニアとしては、地図や位置情報機能などでGeoJSONデータをユーザーから受け取り、それをバックエンドAPI経由でデータベースに保存するようなシナリオで特に注意が必要です。ユーザーからの入力が直接、あるいは間接的にMariaDB Connector/Node.jsの`execute()`や`batch()`に渡される可能性があるため、入力値の検証が非常に重要になります。
脆弱性への対応策と回避策
最も推奨される解決策は、MariaDB Connector/Node.jsを修正済みのバージョンにアップデートすることです。修正版では、`Polygon`および`MultiPolygon`エンコーダーが、メモリを確保する前に不正な形式のリングを拒否するように変更されました。これにより、未初期化メモリが書き込まれる可能性がなくなっています。
すぐにアップデートできない場合は、以下の回避策を検討してください。
1. **GeoJSON入力の厳格なバリデーション**: フロントエンドまたはバックエンドで、GeoJSONの座標が「適切にネストされた数値の配列」であることを厳格に検証してから、MariaDB Connector/Node.jsに渡してください。特に、オブジェクトが`{"length": N}`のような形で渡されないか確認することが重要です。
2. **`query()`メソッドの利用**: もし可能であれば、脆弱性の影響を受けない`query()`メソッドを使用してGeoJSONデータを文字列として処理することを検討してください。ただし、これは性能面でバイナリプロトコルに劣る可能性があります。
まとめ
MariaDB Connector/Node.jsにおけるGeoJSON処理の脆弱性は、バックエンドのNode.jsプロセスから機密情報が漏洩する可能性がある深刻な問題です。フロントエンドエンジニアも、ユーザーからの入力データがバックエンドでどのように処理されるかを理解し、API設計や入力値検証の段階でセキュリティを意識することが非常に重要です。
常に利用しているライブラリやフレームワークのセキュリティ情報をチェックし、速やかにアップデートを行う習慣をつけましょう。安全なアプリケーション開発のために、この情報が役立つことを願っています。