원문 캡처 · romanzipp.com
원문 캡처 · romanzipp.com

2026년 10월 10일 현재 Shopify 상점의 결제 페이지를 가짜 페이지로 바꾸는 공격이 계속되고 있다. HulkApps 앱이나 확장 프로그램을 설치한 상점의 고객은 결제 정보를 피싱 사이트에 제출할 수 있다. 악성 코드가 HulkApps의 API 엔드포인트에서 전달되는 것은 확인됐지만, 코드가 유입된 경로와 피해 상점 수는 불분명하다.

공격 발견과 추적

제보자는 독일에서 mechanicalkeyboards.com의 키보드 배송비를 확인하려고 상품을 장바구니에 담고 ‘Checkout’을 눌렀다. Shopify 결제 화면처럼 보이는 페이지에서 1Password 자동 완성이 이름 대신 신용카드 명의자의 이름을 제안하자 의심을 품었다. 실제 주소는 https://www.biliing(.)top/check-out/였고, 피싱 페이지로 연결된 것이었다.

검색 중 같은 도메인과 문제를 보고한 전자담배 상점 운영자의 Reddit 게시물을 발견했다. 게시물은 18일 전에 올라왔으며, 운영자는 Shopify에 연락했다고 밝혔다. 그런데도 mechanicalkeyboards.com에서는 같은 공격이 진행 중이었다고 제보자는 전했다.

제보자는 Chrome DevTools에서 클릭 이벤트 중단점을 살펴 악성 동작의 흔적을 찾았다. hijack이라는 이름의 함수는 소스 파일에 연결되지 않았고, Chrome에서는 VM142로 표시됐다. 이에 실행 중 삽입된 스크립트의 출처를 추적했다.

아래 코드는 addEventListener를 재정의해 콜백 함수에 hijack이라는 문자열이 포함되면 디버거를 멈추게 한다.

const orig = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function (type, fn, opts) {
 if (String(fn).includes('hijack')) {
 debugger
 }
 return orig.call(this, type, fn, opts)
};

호출 스택을 따라가자 삽입된 스크립트의 출처로 hulkcode.js가 확인됐다. 이 파일은 Shopify CDN에서 제공되며, Hulkapps가 만든 것으로 보인다고 제보자는 설명했다.

https://cdn.shopify.com/extensions/01a0f64c-e6fd-7cec-a0fb-2d0baaff2105/product-options-by-hulkapps-1-201/assets/hulkcode.js

악성 코드의 동작

제보자는 페이지 로드 시 hulkcode.js가 다음 주소로 POST 요청을 한 번 보내는 것을 관찰했다.

https://productoption.hulkapps.com/api/v2/store/get_all_relationships

요청에는 상점 ID와 현재 보고 있는 상품 정보가 담겼다. 응답에는 22.7KB 분량의 자바스크립트가 포함된 advanced_users.custom_js 항목이 있었다. JSON 디코딩 후 확인한 스크립트는 보기 좋게 정리된 형태였으며 난독화되지 않았다고 제보자는 밝혔다. 전체 스크립트는 GitHub Gist에서 볼 수 있다.

스크립트의 firstCheckoutDetectedAt 항목을 보면 상점별로 한 번만 작동하도록 되어 있다. 고객이 피싱 사이트로 이동한 뒤 Shopify 상점의 세션 저장소에 __ctf_shim_handoff_done_v1을 기록해 같은 사용자를 다시 리디렉션하지 않도록 한다. __ctf_checkout_txn_v1의 용도는 확인되지 않았으며, 제보자는 선택한 상품을 연결하는 세션 ID일 가능성을 제시했다.

스크립트 끝부분의 설정에는 다음 도메인이 들어 있었다.

  • biliing(.)top
  • checkout-confirm(.)top
  • order-confirm(.)top

이 도메인들은 URLhaus, URLhaus, URLhaus 또는 Google 세이프 브라우징에 등록되어 있지 않았다고 제보자는 적었다.

제보자는 새 비공개 브라우징 세션에서 결제 정보를 입력해 피싱 흐름도 확인했다. 정보를 제출하자 모든 데이터가 https://www.biliing(.)top/api/submissions로 POST 전송됐고, 이어 정상 결제 페이지로 이동했다. 응답은 다음과 같았다.

{"ok":true,"id":1529,"recordId":"66ff0762-f2c0-417b-980f-da1cfe3a2a2e","duplicate":false}

피싱 사이트는 AS54801에서 호스팅됐다. 관련 IP 정보는 IPinfo에서 확인할 수 있다.

피해 범위와 확인 방법

HulkApps는 Shopify 상점용 도구를 제공하며, 상점 운영자는 해당 확장 프로그램을 설치하고 HulkApps 계정에서 사용자 지정 자바스크립트를 설정할 수 있다고 제보자는 설명했다. 이 자바스크립트는 페이지가 로드될 때마다 상점에 전달돼 실행된다. 이번 사례에서는 결제 중 고객을 가짜 피싱 페이지로 보내도록 하는 코드가 들어 있었다.

악성 스크립트가 HulkApps 인프라에 들어간 경로는 밝혀지지 않았다. 제보자는 상점 운영자의 HulkApps 계정 탈취, HulkApps 직원 계정 탈취, HulkApps 자체 침해, 또는 다른 악성 Shopify 앱이 HulkApps 설정을 변경했을 가능성을 제시했다.

제보자가 파악한 피해 상점은 두 곳이지만, 스크립트가 여러 Shopify 상점에 적용되도록 작성된 것으로 보인다고 밝혔다. HulkApps 앱이나 확장 프로그램을 사용하지 않는 상점은 이번 공격의 영향을 받지 않았을 가능성이 높다. 사용 중인 상점은 새 시크릿 브라우저 창에서 상품을 장바구니에 넣고 ‘Checkout’을 눌러 정상 결제 페이지로 이동하는지 확인할 수 있다. 제보자는 원인이 불분명한 상황에서도 HulkApps 비밀번호를 변경하고 2단계 인증을 설정할 것을 권고했다.

제보자는 HulkApps 제품을 사용하는 상점이 침해됐을 수 있음을 알리기 위해 글을 공개했다고 밝혔다. 2026년 10월 1일 12시 10분에 피싱 시도를 발견했고, 12시 24분 mechanicalkeyboards.com에 이메일을 보냈다. 같은 날 14시 32분 HulkApps에 연락했다. 10월 10일 14시 46분에는 관련 도메인을 URLhaus와 Google 세이프 브라우징에 신고했으며, Shopify와는 계속 연락 중이라고 밝혔다.