[하루한줄] CVE-2024-47051: Mautic의 임의 파일 업로드로 인한 RCE

URL

https://www.sonicwall.com/blog/critical-mautic-vulnerability-cve-2024-47051-enables-arbitrary-file-uploads

Target

  • Mautic < 5.2.3

Explain

Mautic은 오픈 소스 마케팅 자동화 소프트웨어입니다. 오늘은 이 Mautic에서 발생한 임의 파일 업로드로 인한 RCE 취약점에 대해 살펴보겠습니다.

업로드된 파일 처리

업로드된 파일 처리

이 취약점은 사용자가 asset을 추가/편집할 때 파일 업로드 기능의 보안 과정에서 발생하는 논리적 결함으로 인해 발생합니다. 파일 업로드 기능은 추가/편집 동작에 대해 각각 public function newActionpublic function editAction으로 정의됩니다. 위 그림에서 볼 수 있듯이 해당 함수에서는 업로드된 파일을 처리하는 로직이 있고 파일을 디스크에 쓰는 문제의 함수 preUpload()upload()를 호출합니다.

preUpload 함수

preUpload 함수

preUpload() 함수는 디스크에 저장될 최종 파일의 이름과 확장자를 결정합니다. 파일 이름은 SHA1 해시로 생성되며, 확장자를 결정하는 과정이 핵심입니다. 먼저 MIME 유형을 기반으로 guessExtension() 함수를 통해 확장자를 추정하지만, 실패할 경우 사용자가 제공한 originalFileName의 확장자를 사용합니다. 공격자는 이를 악용해 허용된 확장자(예: .jpg)로 PHP 코드를 업로드한 후, 해당 파일 요청 시 originalFileName의 확장자를 .php로 변경하여 악성 코드를 실행할 수 있습니다. 이때 guessExtension()은 NULL을 반환하고, 최종적으로 .php 확장자가 적용됩니다.

upload 함수

upload 함수

마지막으로 upload() 함수는 정의된 업로드 디렉토리(default: media/files/)에서 preUplaod() 함수에서 제공한 파일 이름과 확장자를 사용하여 파일을 디스크에 저장하고 임시 파일을 삭제하여 allowed_extensions 구성 변수에서 제공하는 필터를 우회합니다.

취약점 요약

  • 공격자는 shell1.png라는 파일을 업로드합니다.
  • preUpload() 함수에서 MIME 유형을 기반으로 guessExtension()을 호출하지만, 실패하여 NULL을 반환합니다.
  • 따라서 코드가 originalFileName의 확장자(.php)를 사용하여 최종 파일명이 shell1.php가 됩니다.
    • 이때, 공격자는 asset 저장 요청을 보낼 때 .php 확장자로 originalFileName을 가로채서 수정해야 합니다.

image.png

  • 공격자가 php 파일에 접근 가능하고 www-data에 대상 디렉토리 및 파일에 대한 읽기-쓰기 권한이 있으면 RCE 공격이 가능합니다.

위 취약점은 allowed extensions에서 allowd_mimetypes로 구체적으로 필터링을 추가하는 등으로 패치되었습니다. 자세한 내용은 링크를 확인해주세요.

Reference

https://github.com/mautic/mautic

https://github.com/mautic/mautic/security/advisories/GHSA-73gx-x7r9-77x2

https://nvd.nist.gov/vuln/detail/CVE-2024-47051

https://github.com/mautic/mautic/commit/75bc488ce98b9c8ec01114984049fc1c42c0cae5