[하루한줄] CVE-2024-3116: PGAdmin의 파일 경로 검증 부족으로 인한 RCE 취약점

URL

https://ayoubmokhtar.com/post/remote_code_execution_pgadmin_8.4-cve-2024-3116/

Target

  • PGAdmin <= 8.4

Explain

PostgreSQL 데이터베이스 관리 도구 PGAdmin에서 RCE 취약점이 발견되었습니다.
취약점은 PGAdmin 내의 파일 경로에 대한 검증이 부족해 발생했습니다.

@blueprint.route("/filemanager/<int:trans_id>/", methods=["POST"], endpoint='filemanager')
@login_required
def file_manager(trans_id):
    ...

공격자는 PostgreSQL 유틸리티(pg_dump, pg_dumpall, pg_restore)로 위장한 악성 실행 파일을 API 엔드포인트 또는 브라우저를 통해 업로드할 수 있습니다.

def get_binary_path_versions(binary_path: str) -> dict:
    ...
    cmd = subprocess.run([full_path, '--version'], shell=False, capture_output=True, text=True)
    ...

임의의 파일 경로와 함께 /misc/validate_binary_path API 엔드포인트를 호출하면 get_binary_path_versions() 함수안에 파일 경로를 인자로한subprocess.run() 함수가 호출됩니다.

이때, 파일 경로에 대한 충분한 검사를 수행하지 않으므로, 위 과정으로 업로드한 파일의 경로를 전달하여 실행하는 것이 가능합니다.

POST /misc/validate_binary_path HTTP/1.1
Host: pgadmin
{
    "utility_path": "/var/lib/pgadmin/storage/{username}"
}

공격자는 위 API 요청을 통해 PGAdmin의 파일 경로 확인 로직을 트리거 하여 업로드한 악성 실행 파일을 실행하는 것이 가능합니다

해당 취약점은 서버 모드에서 경로 확인 기능과 PGAdmin 저장 디렉토리를 경로로 사용하는 것을 막는 코드가 추가되어 패치되었습니다.

Reference

https://github.com/TechieNeurons/CVE-2024-3116_RCE_in_pgadmin_8.4?tab=readme-ov-file