정상 사이트라는 믿음이, 지갑 서명 한 번으로 거래된다

정상 사이트라는 믿음이, 지갑 서명 한 번으로 거래된다

분류: Security · 웹·서버 · 악성코드(자산탈취) [정보성]

덱. 2024년 초부터 해킹된 정상 웹사이트에 몰래 심어져 방문자의 암호화폐 지갑 서명을 유도하는 “드레이너(drainer)” 악성코드가 급증했습니다. 웹 보안 업체 Sucuri에 따르면 이 가운데 “Angel Drainer”라는 서비스형 도구는 4주 사이 5,751개의 서로 다른 도메인에서 발견됐습니다. 핵심은 취약점을 뚫는 게 아니라, 방문자가 이미 갖고 있는 “이 사이트는 정상이다”라는 믿음과 “지갑에 서명 한 번 하는 건 별일 아니다”라는 오해를 그대로 이용한다는 점입니다.

리드

웹사이트에 악성 스크립트를 심는 공급망형 공격은 새롭지 않습니다. 다만 이번 사례가 보여주는 건 그 목적지가 달라졌다는 점입니다. 예전에는 해킹된 사이트에 방문자 몰래 채굴 스크립트를 돌리거나 카드 정보를 훔치는 스크립트를 심는 게 흔했다면, 이제는 방문자가 자기 지갑을 “직접, 자발적으로” 연결하고 서명하게 만드는 방향으로 옮겨가고 있습니다. 공격자 입장에서는 훔칠 필요 없이 피해자가 스스로 열쇠를 건네주게 만드는 셈이고, 이게 가능한 이유는 지갑 연결·서명이라는 행위 자체가 웹3(Web3, 탈중앙화 서비스) 생태계에서는 지극히 정상적인 절차이기 때문입니다.

01 개념 30초 — 드레이너란 무엇인가

“드레이너(drainer)“는 방문자가 암호화폐 지갑을 웹사이트에 연결하도록 유도한 뒤, 자산 이전을 승인하는 서명(스마트 컨트랙트 승인)을 받아내 지갑에 든 토큰·코인을 자신의 지갑으로 옮기는 악성 스크립트를 말합니다. 이런 스크립트를 “서비스형”으로 임대해주는 생태계가 이미 형성돼 있고, Angel Drainer는 그중 하나입니다. 공격자(해킹된 사이트의 운영 주체 또는 피싱 사이트 제작자)가 이 스크립트를 심으면, 실제 탈취된 자산 중 일부를 드레이너 서비스 운영자와 나누는 구조입니다. Sucuri는 2023년 한 해 동안 2만 개 이상의 웹3 피싱 사이트가 만들어졌고, 여러 드레이너 종류를 합쳐 1억 달러 이상 규모의 토큰이 탈취된 것으로 추정된다고 밝혔습니다(Sucuri 원문이 인용한 업계 추정치이며, 원문 문구를 그대로 확인함).

02 빈틈 — 해킹된 사이트 자체가 유통 경로가 되다

Sucuri가 분석한 사례 중 하나는 워드프레스 사이트의 데이터베이스 설정값(“헤더·푸터·게시물에 코드를 끼워 넣어주는” 플러그인이 쓰는 옵션 필드)에 악성 스크립트가 주입된 경우였습니다. 이 플러그인 자체가 침입 경로였다는 증거는 없었고, 공격자가 이미 다른 방식으로 확보한 사이트 접근권을 이용해 이 플러그인을 설치하거나 그 옵션값에 코드를 끼워 넣었을 가능성이 높다고 원문은 설명합니다(즉 플러그인 취약점이 아니라, 이미 장악된 사이트를 “정상적으로 보이게” 위장하는 용도). 실제로 감염된 사이트 대부분에서 다른 종류의 악성코드(SocGholish로 불리는 별도 감염군)가 함께 발견됐습니다.

주입된 스크립트는 세 갈래로 나뉘어 동작했습니다. 하나는 페이지의 입력 폼에서 값을 몰래 외부 서버로 전송하는 스크립트, 하나는 페이지의 모든 버튼·링크에 특정 클래스를 붙여 방문자가 “뭔가를 클릭했을 때”만 지갑 연결 팝업이 뜨도록 타이밍을 조절하는 스크립트, 그리고 실제 드레이너 본체를 외부의 새로 등록된 도메인에서 불러오는 스크립트였습니다. 이 드레이너 본체 파일은 상당수가 웹어셈블리(WebAssembly, 브라우저에서 네이티브에 가까운 속도로 실행되는 코드 형식) 바이너리를 base64로 인코딩해 숨긴 형태였고, 앞부분 평문 설정 코드에서 “최소 탈취 금액”, “지원하는 체인 목록(이더리움·바이낸스 스마트체인·폴리곤 등)”, 캠페인을 식별하는 접근 키 같은 값들이 확인됐습니다.

03 트릭 — “이건 그냥 서명일 뿐”이라는 착각을 이용하다

이 악성코드가 방문자를 속이는 방식은 기술적 취약점이 아니라 심리적 함정에 가깝습니다. 팝업은 “무료 화이트리스트 등록”, “에어드롭(무료 토큰 배포) 신청”, “이용약관 동의” 같은 무해해 보이는 명분으로 지갑 서명을 요청합니다. 이때 흔히 등장하는 문구가 “이 요청은 블록체인 거래를 일으키지 않고 가스비도 들지 않습니다”인데, 이건 절반만 맞는 말입니다. 서명 자체는 즉시 블록체인 거래로 이어지지 않지만, 그 서명이 미래에 자산을 이전할 수 있는 권한을 사전 승인하는 스마트 컨트랙트 “허가(permit)“인 경우가 많습니다. 일부 지갑은 “이 메시지 서명은 위험할 수 있습니다”라는 경고를 띄우기도 하는데, 원문에 따르면 드레이너 스크립트는 이 경고조차 “지갑이 오래돼서 뜨는 오류이니 서명 후 업데이트하라”는 안내로 재포장해 방문자가 그대로 서명하도록 유도합니다.

또한 하드웨어 지갑처럼 화면이 작아 서명 내용 전체를 표시하기 어려운 기기의 경우, 사용자가 서명 내용을 제대로 확인하지 못한 채 승인하는 “블라인드 서명”이 일어나기 쉽다는 점도 이런 공격이 노리는 구조적 틈입니다.

원문에는 실제 스크립트의 설정 변수명·요청 URL·암호화 로직이 상세히 나오지만, 이 글에서는 동작 원리만 다룹니다(개념용 단순화, 실제 페이로드 아님). 실제 요청 경로·도메인·난독화 해제 코드는 싣지 않습니다.

04 왜 반복되는가 — 신뢰는 도메인 단위가 아니라 페이지 단위로 깨진다

이 사례가 반복되는 근본 이유는, 방문자가 신뢰하는 대상이 “이 URL이 정상 사이트인가”이지 “이 페이지에 실제로 뜬 팝업이 사이트 운영자가 의도한 것인가”가 아니기 때문입니다. 공격자는 사이트 자체를 정면으로 뚫을 필요 없이, 이미 신뢰받는 도메인 위에 팝업 하나를 얹기만 하면 됩니다. 이건 저희가 다른 글에서 다룬 “한 계층에서의 신뢰를 다른 계층이 그대로 물려받는” 문제와 궤를 같이합니다 — 방문자는 브라우저 주소창의 도메인을 보고 신뢰를 판단하지만, 그 신뢰는 페이지 안에 삽입된 임의의 스크립트에게도 고스란히 넘어갑니다. Sucuri는 이 캠페인이 짧은 기간 안에 리다이렉트 방식(.htaccess 규칙으로 피싱 사이트로 강제 이동)에서 직접 스크립트 주입 방식으로, 다시 더 작고 암호화된 로더 스크립트 방식으로 빠르게 진화했다고 설명합니다 — 탐지를 피하기 위해 배포 방식을 계속 바꾸는 전형적인 “서비스형 악성코드” 생태계의 특징입니다.

05 남는 교훈

이 위협에 맞서는 방법은 새로운 게 아닙니다. CMS·플러그인을 정기적으로 업데이트하고, 쓰지 않는 플러그인을 지우고, 계정 비밀번호를 강하게 관리하고, 웹방화벽으로 알려진 악성 요청을 걸러내는 — 웹사이트 보안의 기본기가 그대로 첫 방어선입니다. 다만 사용자 쪽에서 기억할 원칙은 하나 더 있습니다: 지갑 서명 요청이 뜨면, 그 내용이 무엇을 승인하는지 지갑이 보여주는 상세 정보를 반드시 확인하고, “가스비가 안 든다”는 말이 “위험하지 않다”는 뜻은 아니라는 걸 기억하는 것입니다. 이 한 틈은 특정 캠페인이 사라져도 다른 이름으로 또 나옵니다 — 그래서 도구가 아니라 방법을 남깁니다.

References / 참고자료

  1. Denis Sinegubko (Sucuri), “New Web3 Crypto Malware Threat: Angel Drainer” — 이 글이 재구성한 원 분석. Angel Drainer 캠페인의 세 파도(Wave)와 스크립트 구조, 탐지 통계를 다룸. https://blog.sucuri.net/2024/02/web3-crypto-malware-angel-drainer.html

이 글은 위 원 분석을 우리 관점에서 다시 쓰고 짧은 논평을 더한 정보성 초안입니다. 특정 문장·스크립트 코드·URL을 그대로 옮기지 않았으며, 작동하는 재현 절차나 실제 페이로드는 싣지 않았습니다. ⚠️미확인 표시 항목은 발행 전 독립 팩트체크에서 확증·정정되어야 합니다.