거래 없이 털렸다: 서명 한 번으로 하드웨어 지갑의 예치 토큰이 빠져나간 구조

보안, 털려 본 사람의 보안 노트 #1

TL;DR 2024년 5월, 나는 하드웨어 지갑을 쓰고 있었는데도 서명 한 번으로 예치해 둔 토큰을 통째로 잃었습니다. 내가 보낸 트랜잭션도, 내가 한 승인 기록도 없었습니다. 그 구조와 이 사건에서 정리한 서명 전 체크리스트를 적습니다.

무슨 일이 있었나

예치해 둔 토큰을 하드웨어 지갑에 보관하고 있었습니다. 에어드랍을 받으려고 들어간 곳이 가짜 사이트였고, 거기서 서명 요청 하나에 승인을 눌렀습니다. 그 뒤 그 토큰 전부가 공격자 지갑으로 넘어갔습니다.

“나의 얼굴은 하얗게 질렸고 정말 끔찍한 경험이었다.”

2026-10-02 · 소급 기록에 남긴 나의 말

2년 넘게 지나 온체인 기록을 다시 추적하고 나서야 정확히 무슨 일이 있었는지 알게 됐습니다. 범인은 permit 서명이었습니다.

permit 서명은 무엇인가

토큰을 다른 주소가 대신 옮기게 하려면 보통 승인(approve) 트랜잭션을 내 지갑에서 직접 보내야 합니다. ERC-2612 permit은 이 승인을 트랜잭션 대신 서명된 메시지로 할 수 있게 만든 표준입니다. 서명 안에는 소유자, 받는 쪽(spender), 금액, 순번(nonce), 기한(deadline)이 들어갑니다.

중요한 점은 서명하는 순간에는 체인에 아무것도 올라가지 않는다는 것입니다. 서명은 그것을 손에 넣은 쪽이 제출할 때 비로소 체인에 올라가고, 그 시점은 그쪽이 고릅니다. MetaMask 안내도 이 점을 짚습니다. 오프체인 서명은 그것을 모은 쪽이 자기가 고른 시점에 쓸 수 있습니다.

내 서명에 들어 있던 것

  • 받는 쪽: 처음 보는 컨트랙트였습니다.
  • 금액: 최대값, 사실상 무제한이었습니다.
  • 기한: 최대값, 사실상 무기한이었습니다.

공격자는 내 서명으로 permit을 실행하고 곧바로 토큰을 빼 갔습니다.

왜 아무 흔적이 없었나

내 지갑에서 나간 트랜잭션이 없으니 내가 보낸 기록에는 아무것도 없었습니다. 서명만 해 둔 permit은 제출되기 전까지 체인 위의 승인 목록에도 나타나지 않습니다. 승인 취소 도구로 미리 찾아 막을 수 없었던 이유입니다.

내 기억도 틀려 있었습니다. 나는 사고가 4월 중순쯤이라고 기억했지만 실제로는 그보다 약 4주 뒤였습니다. 어느 사이트에서 서명했는지, 하드웨어 지갑 화면에 서명 내용이 제대로 보였는지는 지금도 확인하지 못했습니다.

뒤이어 온 두 번째 공격

유출 뒤 얼마 지나지 않아 내 거래 내역에 이상한 기록이 하나 생겼습니다. 내가 자주 쓰던 송금 주소와 앞뒤 글자가 똑같은 가짜 주소로 토큰을 보낸 것처럼 보이는 기록이었습니다. 주소 위조(address poisoning)입니다. 다음 송금 때 거래 내역에서 주소를 복사하면 공격자 주소로 돈을 보내게 됩니다.

그 뒤 내가 한 것

그 뒤 남아 있던 승인을 0으로 돌리고 다른 자산도 옮겼습니다. 다른 지갑에서 빠진 것이 더 있는지는 아직 확인하지 못했습니다.

2026년 10월에 자금 흐름을 따라가 봤습니다. 빠져나간 토큰은 곧 다른 코인으로 바뀌고 다른 체인으로 옮겨진 뒤, 익명성 프로토콜로 들어가며 추적이 끊겼습니다. 스테이블코인 발행사가 동결할 수 있는 형태도 이미 아니었습니다. 회수할 기술적 경로는 없었습니다.

이 사건에서 정리한 서명 전 체크리스트

  1. 서명이나 승인 요청에 permit, Permit2, setApprovalForAll 같은 말이 보이면 일단 멈춥니다.
  2. 받는 쪽 주소가 내가 아는 공식 컨트랙트인지 확인합니다. 처음 보는 주소면 서명하지 않습니다.
  3. 금액이 무제한이거나 기한이 무기한이면 거절합니다.
  4. 하드웨어 지갑 화면에 내용 대신 해시만 보이면 서명하지 않습니다.
  5. 에어드랍, 클레임, 지갑 인증 페이지는 검색 결과나 DM이 아니라 공식 채널의 링크로만 들어갑니다.
  6. 큰 자산을 둔 지갑으로는 클레임이나 새 사이트 연결을 하지 않습니다. 용도별로 지갑을 나눕니다.
  7. 송금 주소는 거래 내역에서 복사하지 않습니다. 저장해 둔 주소록에서 고르고 전체 글자를 확인합니다.

다르게 볼 수 있는 점

  • 문제는 하드웨어 지갑이 아니었습니다. 하드웨어 지갑은 키를 지켜 줄 뿐, 내가 승인한 서명까지 막아 주지는 않습니다.
  • 이 체크리스트로 모든 피싱을 막을 수는 없습니다. 서명 방식은 계속 바뀌고, 공격도 그 변화를 따라옵니다.
  • 서명한 사이트와 정확한 시점은 끝내 확인하지 못했습니다. 이 글의 일부는 온체인 기록으로 거꾸로 맞춘 추정입니다.

이 글은 내 기록과 생각을 정리한 것이며 투자 권유가 아닙니다. 보안 사고가 났다면 지갑 제공사의 공식 지원 채널과 관할 수사기관에 먼저 알리는 것이 좋습니다.

이 글을 쓴 시점(2026-11-04 15:55 KST), BTC 약 $77,600, ETH 약 $2,300 (작성 시점 시장가, 반올림)

출처

개인 의견이며 투자 권유가 아닙니다. 가격 목표나 매수·매도 권유는 하지 않습니다. 틀린 내용은 고치고, 고친 날짜를 남깁니다.