
ProFTPD 1.3.9d - High - Remote - 권한 잔존 / 파일 쓰기 - SFTP copy-file이 대상 WRITE를 건너뜀
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
분류: 권한 잔여 / 파일 쓰기 도달 범위: 원격
ProFTPD 1.3.9d (f59f248) - proftpd.org
contrib mod_sftp는 SFTPEngine이 켜져 있으면(SFTP_FXP_EXT_DEFAULT) copy-file을 광고한다. fxp_handle_ext_copy_file은 pr_fsio_stat(dst)가 성공한 경우에만 dest WRITE와 AllowOverwrite를 실행한다. 아직 존재하지 않는 dest는 이 검사를 건너뛴다. 그런 다음 pr_fs_copy_file2가 세션 UID로 파일을 생성하며, <Limit WRITE> DenyAll 하에서도 마찬가지다.
FTP STOR와 SFTP OPEN-write는 여전히 xfer_pre_stor를 거치며, 이는 생성 전에 항상 WRITE를 dir_check한다. 공개된 Issue 2095는 그 반대 사례다: SITE COPY가 소스 READ를 건너뛰었다. 이번 잔여 문제는 새 이름에 대한 dest WRITE다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여 / 파일 쓰기 |
| 도달 범위 | 원격 (인증된 SFTP) |
| 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 |
| 제품 | ProFTPD |
| 영향받음 | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| 인증 | 인증된 SFTP (SFTPEngine on) |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
태그 v1.3.9d를 고정하고 fxp_handle_ext_copy_file을 읽었다. 이 함수는 가짜 SITE COPY의 PRE_CMD를 디스패치한다. mod_copy는 copy_copy를 CMD로 등록하며 PRE_CMD가 아니므로, FTP의 dest WRITE 검사는 이 경로에서 실행되지 않는다. 소스 READ는 항상 dir_check된다. dest WRITE는 dest가 이미 존재하지 않는 한 그렇지 않다. 랩은 127.0.0.1:18710의 루프백 SFTP다.
| 방법 | 싱크 | 권한 |
|---|---|---|
SFTP EXTENDED copy-file로 읽기 가능한 src를 아직 존재하지 않는 dest 이름으로 복사, <Limit WRITE> DenyAll이 있는 <Directory> 하에서 | pr_fs_copy_file2 | 무결성 (랩 입증): 해당 파일을 세션 UID로 생성. 정찰 (랩 입증): dest READ가 허용되면 dest의 SFTP READ가 소스 바이트를 반환. |
| 동일한 dest가 이미 존재 | dir_check WRITE + AllowOverwrite | 차단됨 (랩 입증): copy-file 덮어쓰기는 권한 거부를 반환. |
| 동일한 dest에 대한 SFTP OPEN / STOR / SCP 업로드 | xfer_pre_stor | 차단됨 (랩 입증): OPEN write/create는 SSH_FX_PERMISSION_DENIED (상태 3). |
| 인증되지 않은 copy-file | SFTP 인증 | 차단됨. 셸 없음. Unix DAC는 여전히 적용됨. |
랩 입증 vs 추론: dest 생성, witness의 dest READ, OPEN-write 거부, 기존 dest 덮어쓰기 거부는 랩 입증이다. 미인증과 Unix DAC는 인증/chroot 모델에서 추론한 것이다.
요구 사항: contrib mod_sftp 로드됨, SFTPEngine on. 일반적인 배포판 SFTP vhost. SFTPExtensions -copyFile은 확장을 끈다.
cd lab
./run.sh
루프백 127.0.0.1:18710은 컨테이너 2222에 매핑된다. Compose 프로젝트 proftpd-sftp-copy-file-write. 이미지 태그 proftpd-sftp-copy-file-write:1.3.9d. Witness PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS. 마지막 줄:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
pr_fs_copy_file2 전에 dest가 아직 존재하지 않더라도 dest WRITE를 dir_check하라. 또는 확장을 비활성화하라: SFTPExtensions -copyFile.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_sftp/fxp.c의 fxp_handle_ext_copy_fileSFTP_FXP_EXT_DEFAULT는 copy-file을 포함한다