
UDF를 통한 MariaDB v11.1 RCE용 수정된 PoC로, SQL 쿼리를 통해 명령 출력을 인라인으로 반환합니다. Windows용 상세한 코드 비교 및 컴파일 지침이 포함되어 있습니다.
MariaDB v11.1 RCE via UDF — 수정된 PoC (기반: Ant1sec-ops/CVE-2024-27766)
| 영향받는 버전 | 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 재단은 이 CVE가 권한 경계를 넘지 않는다는 이유로 이의를 제기합니다. 익스플로잇에는 관리자 수준의 DB 접근 권한 또는 이에 준하는 권한이 필요합니다.
원본 PoC는 longlong 반환 타입을 사용하므로 do_system()은 명령이 성공했는지 여부만 반환합니다. SQL에서 직접 출력을 볼 수 없습니다.
이 버전은 반환 타입을 char *로 변경하여 stdout을 쿼리 결과로 다시 파이프합니다. 대역 외 채널이 필요 없습니다. SELECT do_system('whoami')를 실행하기만 하면 출력이 인라인으로 반환됩니다.
한 가지 주목할 점: UDF에서 char *를 반환하려면 MariaDB가 버퍼 크기를 미리 알아야 합니다. do_system_init에서 initid->max_length = 65536을 설정하여 메인 함수에서 할당된 출력 버퍼와 일치시킵니다.
반환 타입이 변경되었으므로 함수 등록 시 원본의 RETURNS INTEGER가 아닌 RETURNS STRING을 사용해야 합니다.
CREATE FUNCTION do_system RETURNS STRING SONAME 'do_system.dll';
_popen / _pclose 사용)FILE 권한과 플러그인 디렉토리 쓰기 권한이 있는 DB 사용자교육 및 연구 목적으로만 사용하십시오. 소유하지 않거나 테스트할 명시적 권한이 없는 시스템에 사용하지 마십시오.
| 원본 | 이 PoC |
|---|
| 반환 타입 | longlong | char * |
| 실행 방식 | system() | _popen() + fgets() 루프 |
| SQL 결과 | 종료 코드 | 명령 stdout |
| 메모리 | 없음 | 힙 할당, deinit에서 해제 |