00 서문
ImageMagick이란 무엇인가요?
ImageMagick은 널리 사용되는 JPEG, GIF, PNG, PDF 및 PhotoCD 형식을 포함하여 90가지 이상의 이미지 파일을 읽고 쓰고 처리하는 데 사용할 수 있는 강력한 오픈 소스 그래픽 처리 소프트웨어입니다. 자르기, 회전, 결합 등 다양한 특수효과로 사진을 가공할 때 사용합니다.
강력한 기능과 우수한 성능, 다양한 언어에 대한 확장된 지원으로 인해 프로그램 개발에 널리 사용됩니다. 많은 웹사이트 개발자는 ImageMagick 확장 프로그램을 사용하여 사용자 아바타 생성, 이미지 편집 등과 같은 웹에서 이미지 처리 작업을 수행하는 것을 좋아합니다.
01 취약점 설명
ImageMagick은 PHP, Ruby, NodeJS, Python 등 다국어를 지원하며 널리 사용되는 오픈소스 이미지 처리 라이브러리입니다. PHP imagick, Ruby rmagick 및 paperclip, NodeJS imagemagick을 포함한 많은 이미지 처리 플러그인은 모두 이를 사용하여 실행됩니다. 공격자가 악성 코드가 포함된 이미지를 구성하면 ImageMagick 라이브러리가 HTTPPS 파일을 부적절하게 처리하고 어떠한 필터링도 수행하지 않으며 원격으로 명령을 실행하고 서버를 제어할 수도 있습니다.
02 영향도
공격 비용: 낮음
위험도: 높음
영향을 받는 범위: ImageMagick 6.9.3-9 이전의 모든 버전
03 취약점 분석
ImageMagick이 https 파일을 처리하는 과정에서 명령어 실행 취약점이 발생합니다.
ImageMagick이 이렇게 많은 파일 형식을 지원하는 이유는 이미지 처리 라이브러리가 많이 내장되어 있기 때문입니다. 이러한 이미지 처리 라이브러리의 경우 ImageMagick에서 이름을 "Delegate"(대리인)로 지정하고 각 Delegate는 의 A 파일에 해당합니다. 형식을 지정한 다음 시스템의 system() 명령을 통해 처리하기 위해 외부 lib를 호출합니다. 외부 lib를 호출하는 프로세스는 시스템의 시스템 명령을 사용하여 실행되고, 그 결과 코드가 명령을 실행하게 됩니다.
ImageMagick 대리인의 기본 구성 파일: /etc/ImageMagick/delegates.xml
구체적인 코드는 Github-ImageMagick을 참조하세요
https 위임 라인을 찾습니다:
" <delegate decode=\"https\" command=\""wget" -q -O "%o" "https:%M"\"/>"
보시다시피 command는 https 파일을 처리할 때 system() 함수에 가져오는 명령을 정의합니다: "wget" -q -O "%o" "https:%M".
wget은 네트워크에서 파일을 다운로드하는 명령입니다. %M은 다음과 같이 구성 파일에 구체적으로 정의되어야 합니다.
%i input image filename %o output image filename %u unique temporary filename %Z unique temporary filename %# input image signature %b image file size %c input image comment %g image geometry %h image rows (height) %k input image number colors %l image label %m input image format %p page number %q input image depth %s scene number %w image columns (width) %x input image x resolution %y input image y resolution우리가 입력한 URL 주소인 입력 이미지 형식으로 %m이 정의되어 있는 것을 볼 수 있습니다. 하지만 필터링 없이 단순 문자열 이어붙이기만 하고 명령어 명령어에 직접 이어붙였기 때문에 "|", "`", "&" 등을 통해 따옴표를 닫고 다른 명령어로 불러올 수 있습니다. 즉, Command 주입이 형성됩니다.
예를 들어 다음 코드를 전달합니다.
https://test.com"|ls “-al시스템 기능에 의해 실행되는 실제 명령은 다음과 같습니다.
“wget” -q -O “%o” “ https://test.com"|ls “-al”이렇게 하면 ls -al 명령이 성공적으로 실행됩니다.
04 취약점 악용
이 취약점에 대한 POC는 다음과 같이 외국인에 의해 제공되었습니다.
push graphic-context viewbox 0 0 640 480 fill 'url(https://"|id; ")' pop graphic-context푸시 및 팝은 스택 작업에 사용되며, 하나는 스택에 푸시되고 다른 하나는 스택에서 팝됩니다.
Viewbox는 SVG의 가시 영역의 크기를 나타내며, 스테이지 크기나 캔버스 크기로 상상해도 됩니다. 간단한 이해는 다음 매개변수를 기반으로 화면의 일부를 선택하는 것입니다.
fill url()은 이미지를 현재 요소에 채웁니다.
여기서 fill url()을 사용하여 취약한 https 대리자를 호출합니다. ImageMagick이 이 파일을 처리하면 취약점이 트리거됩니다.
첨부 파일: ImageMagick은 기본적으로 mvg라는 이미지 형식을 지원하며 mvg는 svg 형식과 유사합니다. 이 형식에서는 벡터 이미지의 내용이 텍스트 형식으로 작성되어 ImageMagick의 다른 대리자를 로드할 수 있습니다(예: 취약한 https 위임). 그리고 그래픽 처리 과정에서 ImageMagick은 콘텐츠에 따라 자동으로 처리합니다. 즉, 파일을 웹 사이트 업로드에 허용되는 png, jpg 및 기타 형식으로 임의로 정의할 수 있으며, 이는 취약점의 악용 가능한 시나리오를 크게 증가시킵니다.
사용 과정:
다음 내용으로 Exploit.png 파일을 만듭니다.
push graphic-context viewbox 0 0 640 480 fill 'url(https://test.com/image.jpg"|ls "-al)' pop graphic-context실행 명령: Convert explore.png 1.png (다음은 변환 매개변수입니다)
05개 버그 수정
최신 버전으로 업그레이드/etc/ImageMagick/policy.xml을 구성하여 https 및 mvg 대리인을 비활성화하거나 해당 대리인을 구성 파일에서 직접 삭제하세요
<policymap> <policy domain="coder" rights="none" pattern="EPHEMERAL" /> <policy domain="coder" rights="none" pattern="URL" /> <policy domain="coder" rights="none" pattern="HTTPS" /> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern="MSL" /> </policymap>이상은 편집자가 소개한 ImageMagick 명령 실행 취약점에 대한 지식입니다. 궁금한 사항이 있는 경우 메시지를 남겨주시면 편집자가 시간에 맞춰 답변해 드리겠습니다. 또한 Script House 웹사이트를 지원해 주시는 모든 분들께 감사의 말씀을 전하고 싶습니다!