
vsftpd 3.0.5 - 높음 - 원격 - 권한 잔여 - cmds_denied가 RFC 별칭(XRMD)을 놓침
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
분석 문서: https://abraxaslabs.tech/research/vsftpd-cmds-denied-alias
분류: 권한 잔여 도달 범위: 원격
vsftpd 3.0.5 - Chris Evans
나는 GitHub 미러도, 배포판 포크도 아닌 공식 tarball을 고정했다. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied는 process_post_login(postlogin.c:140-184)에서 대문자로 변환된 토큰의 정확한 일치입니다. 그런 다음 디스패치가 RFC 775 별칭을 동일한 핸들러에 OR로 연결합니다: RMD||XRMD(:263-264), 그리고 CWD||XCWD, MKD||XMKD, PASV||P@SW, 별도로 EPSV / STOU / APPE도 있습니다. RMD를 거부 목록에 올린 운영자(흔한 DELE,RMD 레시피)라도 여전히 XRMD로 rmdir를 허용합니다.
이 잔여는 운영자가 닫혔다고 생각한 거부 목록 아래에서 인증된 FTP 무결성입니다. 인증 없는 접근도, root도, chroot 탈출도, RCE도 아닙니다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여 (cmds_denied 정확한 토큰) |
| 도달 범위 | 원격 (인증된 FTP) |
| CWE | CWE-863 |
| CVSS | 높음: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 제품 | vsftpd (Chris Evans) |
| 영향 받음 | vsftpd 3.0.5 공식 tarball |
| 인증 | FTP USER/PASS (랩: 익명 ftp) |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18720 전용 |
누가: 운영자가 cmds_denied를 설정한 데몬에서 인증된 FTP 사용자(익명 또는 로컬). 기본값은 설정되지 않음. man 페이지에 명시된 가상 사용자 레시피는 게스트 uid를 공유하므로 Unix DAC가 이들을 분리할 수 없습니다. 세션은 이미 일반적인 chroot 내부에서 매핑된 uid입니다. cmds_denied는 해당 동사를 제거하기로 되어 있던 추가 제어였습니다.
| 메서드 + 싱크 | 권한 |
|---|---|
cmds_denied=RMD 후 XRMD labdir | handle_rmd -> 세션 uid가 Unix-rmdir할 수 있는 디렉터리에 대한 str_rmdir. 랩: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (디렉터리 사라짐). 두 번째 MKD labctrl은 여전히 RMD에서 550. |
| 메서드 + 싱크 | 권한 |
|---|---|
cmds_denied=MKD 후 XMKD dir | handle_mkd -> 세션 uid로 mkdir |
cmds_denied=CWD 후 XCWD path | handle_cwd -> chdir. 그런 다음 download_enable이면 RETR |
cmds_denied=STOR 후 STOU / APPE | handle_upload_common 생성 / 추가. write_enable 필요 |
cmds_denied=PASV 후 EPSV / P@SW | handle_pasv가 거부 목록이 막으려던 데이터 리스너를 엽니다 |
랩에서는 RMD 후 XRMD만 입증했습니다. 다른 별칭은 동일한 str_equal 게이트와 디스패치의 동일한 OR를 공유합니다. 나는 그것들을 실행해 보지 않았습니다.
일급 잔여로서는 없음. cmds_denied는 숨김이 아닙니다. XRMD는 이름을 나열하지 않습니다.
기준에 포함되지 않음. 디렉터리 제거는 무결성 타격입니다. 이후 해당 이름에 대한 CWD / RETR은 부작용으로 550이 됩니다.
cmds_denied (로그인 전에는 무시됨; USER/PASS/QUIT는 로그인 전 테이블에 유지됨)allow_writeable_chroot 기본값 꺼짐; 랩은 /incoming 아래에만 쓰므로 거부가 여전히 유효함)cmds_allowed fail-closed: XRMD를 포함한 목록에 없는 명령은 550으로 유지됨write_enable=NO는 여전히 쓰기 계열(STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)을 차단함SITE vs site 대소문자 우회 (ftpcmdio.c str_upper)cmds_denied=CHMOD는 절대 일치하지 않음; chmod_enable=NO 또는 cmds_denied=SITE로 chmod를 차단할 것공식 3.0.5에서 hide/deny/cmds_denied를 탐색했다. 게이트는 쉼표 토큰을 한 번 순회하며 대문자로 변환된 명령과 str_equal로 비교하는 방식이다. handle_rmd 내부에는 두 번째 검사가 없다. RFC 775는 여전히 XRMD를 RMD로 제공한다. 흔한 조언은 cmds_denied=DELE,RMD이다. 그 문자열은 XRMD를 절대 명시하지 않는다.
잘못된 방향: SITE vs site를 우회로 간주하는 것. 명령은 대문자로 변환된다. cmds_allowed도 같은 방식으로 간주하는 것: 그 목록은 fail-closed이므로 목록에 없는 별칭은 거부된 상태로 유지된다.
cd lab
./run.sh
루프백 127.0.0.1:18720. Compose 프로젝트 vsftpd-cmds-denied-alias. lab/에 있는 공식 3.0.5 tarball (위의 SHA-256). cmds_denied=RMD, write_enable=YES, 익명, /incoming 아래에만 쓰기 허용. Witness VSFTPD-CMDS-DENIED-ALIAS-WITNESS. 마지막 줄:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
최신 동사를 거부할 때 RFC 별칭도 함께 거부하거나, cmds_denied에서 별칭(XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE)을 일치시키세요. cmds_allowed(허용 목록)를 선호하세요.
벤더 접수는 [email protected] (vsftpd)입니다. 무보수입니다. 어떤 vsftpd 미러에도 공개 GitHub 이슈를 열지 마세요.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]