은폐의 기술: 404 페이지를 악용하는 새로운 Magecart 캠페인
Executive Summary
Akamai Security Intelligence Group은 식품 및 리테일 업계의 대규모 기업을 포함한 광범위한 웹사이트 목록을 표적으로 삼는 Magecart 웹 스키밍 캠페인을 탐지했습니다.
이 캠페인은 세 가지 개선된 은폐 기법을 사용한다는 점에서 두드러집니다. 그 중 하나는 이전에는 볼 수 없었던 것으로, 특히 악성 코드를 숨기기 위해 웹사이트의 기본 404 오류 페이지를 조작하기 때문에 탐지 및 방어 과정에 특별한 과제를 제기하고 있습니다.
나머지 두 가지 난독화 기법은 공격자가 탐지를 피하고 공격 체인을 길게 늘이기 위해 사용하는 개선된 전술을 보여줍니다.
웹 스키밍 공격이 점점 더 정교해짐에 따라 기업은 경계를 늦추지 말고 이러한 진화하는 위협을 방어하기 위한 발전된 접근 방식을 모색해야 합니다.
서론
정교하고 은밀하며 새로운 Magecart 웹 스키밍 캠페인은 Magento와 WooCommerce 웹사이트를 표적으로 삼고 있습니다. 이 캠페인의 피해자 중에는 식품 및 리테일 업계의 대규모 기업이 포함되어 있습니다.
Akamai가 발견한 증거에 따르면 이 캠페인은 몇 주 동안 이어졌으며, 경우에 따라서는 더 오래 지속되기도 했습니다. 이 캠페인은 이전에는 경험하지 못했던 고도의 은폐 기법으로 Akamai에 충격을 주었습니다.
새로운 캠페인
Magecart 공격은 일반적으로 표적이 되는 웹사이트의 취약점을 악용하거나 해당 웹사이트가 사용 중인 써드파티 서비스를 감염시키는 것으로 시작됩니다. 이번 캠페인에서 탐지된 모든 피해 웹사이트는 퍼스트파티 리소스 중 하나에 악성 코드 스니펫이 삽입되었기 때문에 직접적으로 악용되었습니다.
악성 코드가 HTML 페이지에 삽입된 경우도 있었고, 웹사이트의 일부로 로드된 퍼스트파티 스크립트 중 하나에 숨겨진 경우도 있었습니다.
그 외 다양한 Magecart 캠페인과 마찬가지로 이 캠페인의 공격 인프라는 로더, 악성 공격 코드, 데이터 유출의 세 가지 주요 부분으로 구성됩니다(그림 1).
로더 — 공격의 전체 악성 코드 로드를 담당하는 짧고 모호한 자바스크립트 코드 스니펫입니다.
악성 공격 코드 — 공격을 실행하는 기본 자바스크립트 코드로, 민감한 인풋을 탐지하고, 데이터를 읽으며, 결제 프로세스를 방해하고, 가짜 양식을 삽입합니다.
데이터 탈취 — 탈취한 데이터를 공격자의 C2(Command and Control) 서버로 전송하는 데 사용되는 방법입니다.
공격을 세 부분으로 분리하는 것은 탐지를 더 어렵게 만들어 공격을 탐지하기 더욱 어렵게 만들기 위함입니다. 이를 통해 특정 표적 페이지에서만 공격의 전체 흐름을 활성화할 수 있습니다. 즉, 공격자가 사용한 난독화 조치로 인해 공격자가 실행을 의도한 페이지에서만 공격의 전체 흐름이 활성화될 수 있습니다. 그렇기에 공격은 더욱 은밀하게 이루어지며, 공격 대상 웹사이트에 설치되어 있을 수 있는 보안 서비스와 외부 스캐닝 툴로 탐지하기가 더욱 어려워집니다.
대부분의 Magecart 캠페인은 흐름과 단계가 유사하지만, 공격자가 사용하는 다양한 은폐 기법에 있어 다른 캠페인과 차별화됩니다. 이러한 기법은 공격의 인프라를 모호하게 만들고, 흔적을 숨기며, 탐지 및 리버스 엔지니어링을 복잡하게 만들고, 궁극적으로 공격을 장기화하기 위해 사용됩니다.
세 가지 변형 캠페인
Akamai는 이 캠페인의 세 가지 변형을 발견했는데, 이는 공격이 진화하고 있으며 시간이 지남에 따라 캠페인이 탐지되고 방어되는 것을 방지하고자 공격자들이 개선한 사항을 나타냅니다.
처음 두 가지 변형은 로더 부분에서 약간의 차이만 있을 뿐 매우 유사합니다.
세 번째 버전은 공격자가 웹사이트의 기본 404 오류 페이지를 사용해 악성 코드를 숨겼다는 점에서 독특하며, 이는 이전에는 볼 수 없었던 창의적인 은폐 기법입니다.
이 새로운 캠페인의 세 가지 변형에 대한 기술적 세부 사항을 자세히 살펴보겠습니다.
변형 1
Akamai의 리서치는 위협 인텔리전스 모니터링 툴이 한 주요 기업의 웹사이트에서 의심스러운 코드 조각을 탐지하면서 시작되었습니다. 이 스니펫을 분석한 결과, 악성으로 인코딩된 자바스크립트 로더가 웹사이트에 여전히 존재하고 활성화되어 있다는 사실을 발견했습니다. 이 발견을 계기로 추가 조사를 진행해 전체 캠페인의 변형과 수많은 웹사이트에 미치는 영향을 밝혀냈습니다.
변형 1 로더: 빙산의 일각
스키머는 악용된 웹사이트에 onerror 속성이 있는 변조된 HTML 이미지 태그를 삽입하는 데 성공했습니다(그림 2). 이 속성에는 난독화된 Base64로 인코딩된 악성 로더 코드 스니펫이 포함되어 있습니다. 이미지 태그의 의도적으로 비어 있는 src 속성은 네트워크 요청을 차단하고 난독화된 악성 자바스크립트 코드 스니펫이 포함된 인라인 onerror 콜백의 실행을 트리거하도록 설계되었습니다.
자바스크립트 코드를 실행하기 위한 목적으로 이미지 태그를 사용하는 것은 상대적으로 일반적이지 않지만 보다 정교한 기법입니다. 스키머가 일반적으로 네트워크 트래픽을 분석하는 외부 스캐너와 같은 보안 조치를 우회하는 데 도움이 될 수 있지만, 이 특정 사례에서는 트리거되지 않습니다. 난독화된 코드는 페이지의 맥락 내에서 실행되며 페이지 자체에서 시작된 네이티브 퍼스트파티 스크립트처럼 실행됩니다.
디코딩된 로더 코드 - 런타임
난독화된 Base64 인코딩 코드가 런타임에 실행되면 일반 자바스크립트로 변환되어 WebSocket 채널을 시작하게 됩니다(그림 3). 이 채널은 브라우저와 공격자의 C2 서버 간의 양방향 통신 링크 역할을 합니다.
WebSocket이 Magecart 공격에 사용되는 것을 최근 여러 캠페인에서 관찰했습니다. WebSocket은 공격자가 단일 네트워크 채널을 다양한 목적으로 활용할 수 있도록 해주는 더 조용하고 유연한 통신 방법으로 간주됩니다. 여기에는 C2 서버에서 브라우저로(또는 그 반대로) 공격의 다른 부분을 전송하고 특정 시나리오에서 데이터 유출 활동을 용이하게 하는 것이 포함됩니다.
코드의 또 다른 주목할 만한 측면은 봇 탐지 기능으로, 사용자 에이전트가 자동화 제어 하에 있는지 확인합니다. 이 경우 코드는 실행을 종료합니다. 이는 잠재적으로 공격을 탐지할 수 있는 외부 보안 스캐너와 샌드박스를 회피하기 위한 영리한 봇 방지 기술입니다.
WebSocket 통신 흐름
WebSocket 채널이 설정되면 공격자의 C2 서버에서 브라우저로 첫 번째 메시지가 전송됩니다. 이 메시지는 브라우저에 페이지의 현재 URL을 다시 보내도록 지시하는 한 줄 자바스크립트 명령이 포함된 Base64 인코딩 문자열로 전송됩니다.
이 단계의 목적은 C2 서버가 현재 페이지가 체크아웃 (민감한) 페이지인지 아니면 다른 비체크아웃 페이지인지 판단할 수 있도록 하는 것입니다. 이렇게 하면 공격자는 다음 단계를 적절히 조정할 수 있습니다.
이 간단한 서버 측 유효성 검사를 통해 공격자는 관련 표적 페이지에서만 공격을 활성화할 수 있으므로 중요하지 않은 페이지에 대한 잠재적 노출을 피할 수 있습니다. 이는 스키머가 보안 서비스와 외부 스캐너의 탐지를 회피하기 위해 얼마나 많은 노력을 기울이는지 보여주는 또 다른 예입니다.
C2 서버가 체크아웃 페이지 URL을 식별하면 흐름은 다음 단계로 진행됩니다. 이 단계에서는 또 다른 메시지가 브라우저로 전송됩니다. 이 메시지는 전체 공격 코드가 포함된 긴 Base64 인코딩 문자열입니다. 디코딩이 완료되면 길고 난독화된 자바스크립트 코드가 나타납니다(그림 4).
이 코드는 사용자의 민감한 개인 및 신용카드 데이터를 읽고 스키머의 C2 서버로 다시 전송하는 것을 목표로 표적화된 민감한 페이지에서 다양한 악성 활동을 수행합니다.
이후 악성 코드에 의해 수집된 민감한 탈취 데이터를 포함하는 난독화된 데이터 유출 메시지가 브라우저에서 C2 서버로 전송됩니다. 앞서 언급했듯이 전체 악성 코드 로드와 탈취한 데이터 유출에 동일한 WebSocket 채널을 사용하면 XHR, 가져오기 또는 HTML 리소스 요청 같은 기존 통신 방법보다 프로세스가 더 단조로워지며 네트워크 요청이 줄어듭니다.
변형 2
변형 2 로더: 같은 여자, 새 드레스
변형 1과 변형 2의 주요 차이점은 로더 구성요소에 있습니다. 변형 2에서는 스키머가 잘 알려진 Facebook 방문자 활동 추적 서비스인 Meta Pixel 코드 스니펫과 매우 유사한 코드 스니펫이 포함된 인라인 스크립트를 삽입하고 그 안에 몇 줄을 추가합니다(그림 5).
추가된 줄은 실제 로더 부분이며, Meta Pixel 코드를 둘러싼 부분은 정상적이고 의심스럽지 않은 코드 스니펫인 것처럼 보이게 오해를 불러일으킬 수 있는 커버입니다.
이 은폐 기법은 악성 코드 스니펫을 Google Tag Manager나 Facebook 같이 잘 알려진 서비스인 것처럼 보이게 하는 기법으로 최근 Magecart 캠페인에서 인기를 얻고 있습니다. 스키머는 이를 통해 외부 스캐너와 연구자의 정적 분석을 회피할 수 있습니다.
이미지 요청
가짜 Meta Pixel 코드 스니펫 내의 의심스러운 줄을 주의 깊게 살펴본 결과, 웹사이트의 자체 디렉토리에서 PNG 이미지를 가져오는 것처럼 보였습니다. 네트워크 요청은 웹사이트에 호스팅된 정상적인 이미지에 대한 일반적인 요청으로 보였습니다. 그러나 이 이미지의 실제 콘텐츠를 조사한 결과, 보기만큼 무해한 이미지가 아니라는 것이 분명해졌습니다(그림 6).
이미지 바이너리 내의 악성 자바스크립트 코드 스니펫
PNG 이미지의 바이너리 데이터에는 이미지 바이너리 파일 끝에 Base64로 인코딩된 문자열이 추가되어 있습니다(그림 7). 그런 다음 로더 코드 스니펫이 문자열을 추출하고, 디코딩하고, 실행합니다(그림 8). 디코딩된 문자열은 변형 1에서 로더의 onerror 속성 내부에 있는 것과 동일한 자바스크립트 코드 스니펫을 나타냅니다.
흐름의 후속 단계는 변경되지 않습니다. 이 코드 스니펫은 런타임에 일반 자바스크립트 코드로 변환되고, 이 코드는 공격자의 C2 서버로 WebSocket 채널을 시작하며, 나머지 시퀀스는 앞서 설명한 대로 이어집니다.
변형 3
이제 가장 중요한 부분에 대해 이야기해 보겠습니다. 비슷한 공격을 본 적이 있지만 이 공격은 매우 독특하고 Akamai를 놀라게 했습니다.
변형 3 로더: 똑같지만 완전히 다른 공격
언뜻 보기에 이 로더는 변형 2의 로더와 비슷해 보이지만, (Akamai가 그랬던 것처럼) 완전히 다른 시나리오라는 것을 알 수 있습니다. 경우에 따라 이 로더는 변형 2에서 볼 수 있듯이 Meta Pixel 코드 스니펫으로 위장되어 있습니다(그림 9). 하지만 다른 경우에는 페이지의 임의 인라인 스크립트 내에 삽입됩니다(그림 10).
이 로더에서 가장 먼저 눈에 띄는 부분은 'icons'라는 상대 경로에 대한 가져오기 요청입니다.
404 오류? 정말인가요?
로더가 실행된 후 공격은 실제로 존재하지 않는 상대 경로인 /icons가져오기 요청을 보냅니다. 이 요청은 "404 Not Found" 오류로 이어집니다(그림 11). 응답으로 반환된 HTML을 분석한 결과, 웹사이트의 기본 404 페이지처럼 보였습니다(그림 12). 이 때문에 혼란스러웠고 스키머가 발견된 피해 웹사이트에서 더 이상 활동하지 않는지 궁금해졌습니다.
로더를 과소평가하지 마세요
한 걸음 물러나 로더를 다시 분석한 결과, 퍼즐의 잃어버린 조각을 발견했습니다. 로더에는 icons 요청의 일부로 반환되는 404 오류 페이지에서 수행되어야 하는 "COOKIE_ANNOT" 문자열에 대한 정규식 일치 항목이 포함되어 있었습니다.
그래서 반환된 404 HTML 내에서 이 문자열을 검색한 결과, 짜잔! 페이지 끝에 숨겨진 "COOKIE_ANNOT" 문자열이 포함된 코멘트를 발견했습니다(그림 14). 이 문자열 옆에 긴 Base64로 인코딩된 문자열이 연결되었습니다. 이 인코딩된 문자열은 난독화된 자바스크립트 공격 코드 전체를 나타냅니다. 로더는 코멘트에서 이 문자열을 추출해 디코딩한 후 사용자가 입력한 개인 정보를 탈취하도록 설계된 공격을 실행합니다.
존재하지 않는 경로에 대한 추가 요청을 시뮬레이션한 결과, 모두 인코딩된 악성 코드가 포함된 코멘트가 포함된 동일한 404 오류 페이지를 반환했습니다. 이를 통해 공격자가 전체 웹사이트의 기본 오류 페이지를 성공적으로 변경하고 그 안에 악성 코드를 숨겼음을 확인할 수 있었습니다!
데이터 탈취
가짜 양식
변형 1, 변형 2와 달리, 공격자는 변형 3에서 다른 일반적인 데이터 유출 기법인 가짜 양식 삽입을 사용했습니다(그림 15). 이 기법은 일반적으로 스키머가 민감한 입력 정보에 접속할 수 없을 때 사용됩니다.
이는 웹사이트가 써드파티 아이프레임이나 외부 페이지 내에서 결제 양식을 구축하는 써드파티 결제 서비스를 사용하는 경우에 발생할 수 있습니다. 이러한 시나리오를 우회하기 위해 공격자는 기존 결제 양식과 매우 유사한 가짜 양식을 생성하고 이를 오버레이하는 기법이 점점 더 인기를 얻고 있습니다. 이것이 바로 변형 3에서 도난당한 데이터가 유출되는 방식입니다.
사용자가 공격자의 가짜 양식에 데이터를 제출하면 오류가 표시되고, 가짜 양식이 숨겨지며, 기존 결제 양식이 표시되고, 결제 세부 정보를 다시 입력하라는 메시지가 표시됩니다(그림 16).
도난당한 데이터가 포함된 이미지 요청
가짜 양식을 제출하면 공격자의 C2 서버로 이미지 네트워크 요청이 시작되며, 이 요청에는 탈취한 모든 개인 및 신용카드 정보가 쿼리 매개변수에 Base64로 인코딩된 문자열로 전달됩니다(그림 17). 이 문자열을 디코딩하면 요청의 실제 의도가 드러나며 공격의 전체 흐름이 명확해집니다.
변형 3에서 얻은 교훈: 404 사례
이 은폐 기법은 매우 혁신적이며 이전의 Magecart 캠페인에서는 볼 수 없었던 것입니다. 공격 대상 웹사이트의 기본 404 오류 페이지를 조작하는 아이디어는 Magecart 공격자에게 은폐 및 회피를 개선하기 위한 다양한 창의적인 옵션을 제공할 수 있습니다.
Akamai가 확인한 일부 사례에서는 악성 로더가 작성 시점에 이미 영향을 받은 웹사이트의 페이지에서 제거된 상태였습니다. 그러나 기본 404 페이지의 악성 코멘트는 그대로 남아 있어 스키머가 공격을 쉽게 재실행할 수 있는 가능성이 있었습니다. 이는 이러한 접근 방식을 탐지하는 것이 얼마나 복잡한지, 그리고 이를 방어하는 것이 얼마나 중요한지를 강조합니다.
404 페이지로 연결되는 퍼스트파티 경로에 대한 요청은 콘텐츠 보안 정책 헤더와 페이지에서 네트워크 요청을 적극적으로 분석하고 있을 수 있는 기타 보안 조치를 우회할 수 있는 또 다른 우회 기법입니다. 이는 의심할 여지 없이 최근 발견한 가장 정교한 Magecart 전략 중 하나입니다.
Akamai Client-Side Protection & Compliance와 스키머 비교
이 캠페인에 대한 리서치의 일환으로 런타임 자바스크립트 실행 동작을 분석해 자바스크립트 위협을 방어하고 클라이언트측 공격을 방어하는 솔루션인 Akamai Client-Side Protection & Compliance에 대해 스키머 시뮬레이션을 실시했습니다.
솔루션은 정교한 스키머를 성공적으로 탐지하고 심각도가 높은 이벤트를 트리거해 즉시 방어 조치를 취했습니다. 특정 웹 페이지에서 Client-Side Protection & Compliance가 활성화된 실제 시나리오에서, 그림 18은 웹사이트 소유자가 위협을 신속하게 조사하고 다양한 방어 옵션으로 실시간 대응할 수 있도록 알림을 수신하는 것을 보여줍니다.
결론
이 캠페인은 웹 스키밍 기법이 끊임없이 진화하고 있다는 사실을 강조합니다. 웹 스키밍 기법은 점점 더 정교해지고 있으며, 이로 인해 정적 분석과 외부 스캐닝을 통한 탐지 및 방어가 점점 더 어려워지고 있습니다. 이 영역의 공격자들은 피해 웹사이트에 자신의 공격을 숨기고, 공격을 노출시킬 다양한 보안 조치를 회피하기 위한 더 나은 방법을 지속적으로 찾고 있습니다.
이 리서치에서 강조된 복잡성 수준은 기업이 웹 스키밍 공격 기법에 대한 경계와 주의를 기울이고 이러한 종류의 공격에 대처할 수 있는 새롭고 진보된 접근 방식을 적극적으로 모색해야 한다는 점을 상기시켜 줍니다.
IOC
Pmdresearch[.]com
secures-tool[.]com
Adsometric[.]com
cngresearch[.]com