MySQL Community Server 26.7.0 - 높음 - 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로 복사한다. 사용자 정의 컴포넌트는 없다.
| Field | Value |
|---|---|
| ID | 아직 CVE 없음 |
| Class | RCE (컴포넌트가 mysqld로 dlopen; PR:H; 랩은 기본 제공 .so를 로드함) |
| Reach | 원격 (인증된 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 |
| Product | MySQL Community Server mysqld |
| Affected | 26.7.0 (06a5c1c99c377fc41b2eba1ea244e8b220bdc3c8) |
| Auth | INSTALL COMPONENT (mysql.component에 대한 INSERT) |
| License | GNU Affero GPL v3.0 |
| Lab | 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