
CVE-2026-42167에 대한 기술 분석 및 개념 증명으로, ProFTPD mod_sql의 치명적인 SQL 인젝션으로 인증 우회, 백도어 사용자 주입, 원격 코드 실행이 가능합니다.
| 속성 | 값 |
|---|
| 유형 | SQL 인젝션 (CWE-89) |
| 심각도 | 높음/치명적 |
| CVSS v3 | 8.1 |
| 구성 요소 | ProFTPD < 1.3.9a의 mod_sql |
| 보고자 | ZeroPath Research |
| 날짜 | 2026년 4월 28일 |
is_escaped_text()의 취약한 검증ProFTPD는 SQL 쿼리에 값을 삽입하기 전에 값이 이미 정화되었는지 확인하기 위해 is_escaped_text() 함수를 사용합니다. 이 함수는 다음 조건을 충족하는 모든 입력을 이미 이스케이프되어 추가 처리가 필요하지 않다고 가정합니다:
'로 시작'로 끝공격자는 다음과 같은 악성 사용자 이름을 보낼 수 있습니다:
USER ' || (SELECT 1) ||'
이것이 다음과 같은 SQL 쿼리에 삽입되면:
INSERT "'%U', '%r', '%m'" activity_log
다음과 같이 실행됩니다:
INSERT "'' || (SELECT 1) || ''" activity_log
|| 연산자가 주입된 명령 주위에 빈 문자열을 연결하므로 페이로드가 임의의 SQL로 실행됩니다.
요구 사항:
%U 또는 %{basename} 변수를 사용하는 SQL 로깅 활성화기법:
COPY (SELECT 1) TO PROGRAM '악성_명령'
postgres 사용자 권한으로 운영 체제 수준 명령을 실행합니다.
요구 사항:
SQLAuthenticate 활성화SQLLog ERR_*(인증 전)에 %U 변수를 사용하는 SQL 로깅기법:
INSERT INTO users (username, password, uid, homedir)
VALUES ('attacker', 'password_hash', 0, '/')
공격자는 uid=0(root) 및 전체 파일 시스템 접근 권한을 가진 백도어 사용자를 주입합니다.
요구 사항:
기법: 시간 기반 블라인드 SQL 인젝션을 사용하여 자격 증명을 문자 단위로 추출합니다.
| 변수 | 의미 | 범위 |
|---|---|---|
%U | 원래 사용자 이름(인증 전) | 인증 전 |
%A | 익명 로그인 비밀번호 | 인증 전 |
%J | 명령 매개변수 | 인증 전 |
%m | FTP 동사(STOR, RETR 등) | 인증 전 |
%{basename} | 파일 이름 구성 요소 | 인증 후 |
%l | ident 응답 (RFC 1413) | 인증 전(identd 사용 가능 시) |
인증 전(가장 치명적):
%U + SQLLog ERR_* → 자격 증명 불필요
인증 후:
%{basename} + SQLLog STOR → 유효한 FTP 사용자 필요
즉시 ProFTPD 1.3.9a 이상으로 업데이트:
# 현재 버전 확인
proftpd -v
# 업데이트 (Debian/Ubuntu 예시)
sudo apt-get update
sudo apt-get install proftpd-basic=1.3.9a-1
즉시 업데이트할 수 없는 경우:
# proftpd.conf에서 다음 줄을 주석 처리하거나 제거
# SQLLog * log_activity
# SQLLog ERR_* log_activity
-- PostgreSQL에서 슈퍼유저 권한이 없는 사용자 생성
CREATE USER proftpd_user WITH PASSWORD 'secure_password';
GRANT SELECT, INSERT ON activity_log TO proftpd_user;
-- SUPERUSER 권한 부여 금지
TraceLog /var/log/proftpd/trace.log
Trace sql:17
ProFTPD 추적 로그에서(Trace sql:17 활성화 시) 다음을 검색:
text 'payload' is already escaped, skipping escaping it again
이 메시지는 우회 시도가 취약한 엔진에 의해 처리되었음을 나타냅니다.
# 상세 추적 활성화
echo "Trace sql:17" >> /etc/proftpd/proftpd.conf
# ProFTPD 재시작
sudo systemctl restart proftpd
# 로그 모니터링
tail -f /var/log/proftpd/trace.log | grep "already escaped"
| 버전 | 상태 |
|---|---|
| < 1.3.9 | ❌ 취약 |
| 1.3.9 | ❌ 취약 |
| ≥ 1.3.9a | ✅ 패치됨 |
| ≥ 1.3.10rc1 | ✅ 패치됨 |
# 저장소 클론
git clone https://github.com/ZeroPathAI/proftpd-CVE-2026-42167-poc.git
cd proftpd-CVE-2026-42167-poc
# 요구 사항
# - Docker
# - Git
# - Python 3.10+
# - uv (Python 패키지 관리자)
# 취약한 환경 설정
cd setup
./setup.sh
# PoC 실행
cd ../pocs
python3 preauth_user_backdoor.py # 백도어 사용자 주입 (인증 전)
python3 preauth_user_rce.py # COPY TO PROGRAM을 통한 RCE (인증 전)
python3 postauth_stor_backdoor.py # 사용자 주입 (인증 후)
python3 postauth_stor_rce.py # RCE (인증 후)
# 정리
cd ../setup
./teardown.sh
| 날짜 | 이벤트 |
|---|---|
| 2026-03-28 | ProFTPD에 취약점 보고 |
| 2026-04-07 | 검증 및 패치 개발 |
| 2026-04-24 | CVE-2026-42167 할당 |
| 2026-04-27 | 패치 릴리스 (커밋 af90843baf7dcb8c6be1e5261be2d0b5b5850673) |
| 2026-04-27 | ProFTPD 1.3.9a 릴리스 |
SQLLog 구성 검토최종 업데이트: 2026년 4월 28일
출처: ZeroPath Research, MITRE CVE, NVD