
MySQL Community Server 26.7.0 - High - INSTALL COMPONENT 修飾スキーム - plugin_dir スキップ
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
クラス: RCE 到達範囲: リモート
MySQL Community Server mysqld 26.7.0 (06a5c1c) - Oracle
デフォルトの file:// INSTALL COMPONENT は mysql_server_path_filter でラップされ、plugin_dir 配下に強制される。フィルタされていない libminchassis ローダーは dynamic_loader_scheme_file.mysql_minimal_chassis として登録されたままである。URN スキーム file.mysql_minimal_chassis はその実装を取得し、mysqld の UID で絶対パスを dlopen する。INSTALL PLUGIN / CREATE FUNCTION SONAME は依然として / を拒否する。mysql.component への INSERT が必要 (PR:H)。
ラボでは、ストックの component_query_attributes.so を /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so にコピーする。カスタムコンポーネントは使用しない。
| フィールド | 値 |
|---|---|
| ID | CVE 未割当 |
| クラス | RCE (mysqld としてのコンポーネント dlopen、PR:H、ラボではストックの .so をロード) |
| 到達範囲 | リモート (認証済み SQL、INSTALL COMPONENT / PR:H) |
| CWE | CWE-427 |
| CVSS | High: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| 製品 | MySQL Community Server mysqld |
| 影響を受けるバージョン | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| 認証 | INSTALL COMPONENT (mysql.component への INSERT) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。未使用のストックコンポーネントを plugin_dir の外にコピー。 |
INSTALL COMPONENT 権限を保持する。コンポーネントの .so を plugin_dir の外に配置する (secure_file_priv 配下での FILE DUMPFILE、またはローカル書き込み)。INSTALL COMPONENT 'file.mysql_minimal_chassis:///abs/name' (.so サフィックスなし。ローダーが付加する)。mysqld の UID で dlopen される。同じ URN は mysql.component に永続化され、再起動時に再ロードされる。
file:///abs/name は拒否される (3529)。INSTALL PLUGIN ... SONAME '/abs/...' は拒否される (1124)。修飾されたスキームが残り物である。
同じ 26.7.0 の調査。set_default("dynamic_loader_scheme_file.mysql_server_path_filter") が文書化された境界である。フィルタされていない実装は、ラッパーがそれを呼び出せるように登録されたままである。get_scheme_service_from_urn は :// より前のバイト列をスキームとして取得する。
my_service<SERVICE_TYPE(dynamic_loader_scheme)> service(
(my_string("dynamic_loader_scheme_") + scheme).c_str(),
&imp_mysql_minimal_chassis_registry);
file.mysql_minimal_chassis は実在するスキームである。component.test は決してそれを試さない。
回り道: 3 スラッシュの URN (scheme:///tmp/...) はロードされた。4 スラッシュは不要だった。URN のステムは .so を省略しなければならない。
cd lab
./run.sh
イメージ mysql:26.7.0。公開 127.0.0.1:18650。plugin_dir=/usr/lib64/mysql/plugin。ストックの component_query_attributes.so を /tmp/MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS.so にコピーする。
SUCCESS mysql-install-component-scheme file-slash-denied=yes qualified-load=yes component-urn=yes dump=26.7.0 image=mysql:26.7.0 MYSQL-INSTALL-COMPONENT-SCHEME-WITNESS
SQL URN から dynamic_loader_scheme_file.mysql_minimal_chassis を取得しないこと。file のみをパスフィルタ実装にマップすること。実装を名指しするスキームを拒否すること。すべてのファイルローダーで check_valid_path を維持すること。
06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8)components/libminchassis/dynamic_loader.cc get_scheme_service_from_urnsql/server_component/dynamic_loader_path_filter.cc