
MariaDB v11.1 のUDFを介したRCE用の修正版PoCで、SQLクエリを通じてコマンド出力をインラインで返します。Windows向けの詳細なコード比較とコンパイル手順を含みます。
| 影響を受けるバージョン | MariaDB v11.1 |
| 修正バージョン | 10.5.25 / 10.6.18 / 10.11.8 / 11.0.6 / 11.1.5 / 11.2.4 / 11.4.2+ |
| 種別 | ユーザー定義関数(UDF)を介したRCE |
MariaDB v11.1 では、十分なデータベース権限(FILE 権限とプラグインディレクトリへの書き込みアクセス)を持つ攻撃者が、悪意のあるUDFを登録し、それを介して任意のOSコマンドを実行できます。
注記: MariaDB Foundationは、権限境界が越えられていないという理由でこのCVEを異議申し立てしています。悪用には、管理者レベルのDBアクセスまたは同等の権限が必要です。
元のPoCは longlong 戻り値型を使用しているため、do_system() はコマンドが成功したかどうかのみを返し、SQLから直接出力を確認できません。
このバージョンでは戻り値型を char * に変更し、stdoutをクエリ結果として返します。帯域外チャネルは不要で、SELECT do_system('whoami') を実行するだけで出力がインラインで返ってきます。
| オリジナル | 本PoC | |
|---|---|---|
| 戻り値型 | longlong | char * |
| 実行 | system() | _popen() + fgets() ループ |
| SQL結果 | 終了コード | コマンドの標準出力 |
| メモリ | なし | ヒープ割り当て、deinit で解放 |
注意すべき点が1つあります: UDFから char * を返す場合、MariaDBはバッファサイズを事前に把握している必要があります。do_system_init は initid->max_length = 65536 を設定し、主関数で割り当てられる出力バッファに一致させています。
戻り値型が変更されたため、関数登録時には RETURNS STRING を使用する必要があります。元のPoCのように RETURNS INTEGER ではありません。
CREATE FUNCTION do_system RETURNS STRING SONAME 'do_system.dll';
_popen / _pclose を使用)FILE 権限とプラグインディレクトリへの書き込みアクセスを持つDBユーザー教育および研究目的のみに使用してください。所有していないシステム、または明示的なテスト許可がないシステムに対して使用しないでください。