MySQL Community Server 26.7.0 - 높음 - INSTALL COMPONENT 정규화된 스킴 - plugin_dir 건너뛰기
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · mysql-install-component-scheme
분석 문서: https://abraxaslabs.tech/research/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 (컴포넌트 dlopen이 mysqld로 실행; 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 stem은 .so를 생략해야 합니다.
cd lab
./run.sh
Image mysql:26.7.0. Published 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