지갑 주소는 길고, 지갑과 블록 탐색기는 보통 가운데를 줄여 0x12ab…9f3c처럼 보여줍니다. 그래서 송금할 때 앞 몇 글자와 끝 몇 글자만 맞춰 보는 습관이 생겼습니다.

그 습관을 그대로 노리는 수법이 있습니다. 공격자는 정상 주소와 앞뒤가 닮은 새 주소를 만든 다음, 그 주소가 피해자의 거래 내역에 나타나게 합니다. 나중에 피해자가 거래 내역에서 주소를 다시 복사하면 자산은 공격자에게 갑니다. 이를 주소 오염 공격(address poisoning) 또는 주소 스푸핑이라고 부릅니다.

여기서 지갑의 개인키가 탈취되거나 블록체인의 기록이 바뀐 것은 아닙니다. 공격자가 만든 주소도 블록체인에서 정상적으로 사용할 수 있는 주소입니다. 다만 그 주소가 원래 보내려던 상대의 것처럼 보이도록 거래 내역에 끼어든 것입니다.

거래 내역에서 정상 주소와 앞뒤가 닮은 공격자 주소가 함께 표시되어 잘못된 주소를 복사할 수 있는 상황

주소 오염 공격을 단순화한 개념도. 두 주소는 앞뒤 모양만 비슷할 뿐 서로 다른 전체 주소입니다.

공격자는 어떻게 비슷한 주소를 만들까?

블록체인 거래는 공개되어 있습니다. 공격자는 온체인 기록을 살펴보다가 한 지갑이 반복해서 송금하는 상대 주소를 찾을 수 있습니다. 자신의 다른 지갑으로 자산을 자주 옮기는 이용자도 표적이 될 수 있습니다.

그다음 프로그램으로 주소를 계속 생성해 정상 수취 주소와 앞뒤 문자가 닮은 것을 찾습니다. 이렇게 특정 모양을 갖도록 골라 만든 주소를 **바니티 주소(vanity address)**라고 합니다. 정상 주소가 아래와 같다고 가정해 보겠습니다.

정상 주소   0x12ab 7d91e6c42f08a5b34781c0d2ee4a71b8 9f3c
유사 주소   0x12ab a04c3187b2d96e5f7014e8aa53d2c619 9f3c

앞의 0x12ab와 끝의 9f3c만 보면 같아 보이지만 가운데는 전혀 다릅니다. 두 주소의 개인키도 서로 다르며, 유사 주소의 개인키는 공격자가 가지고 있습니다.

중요한 점은 공격자가 기존 주소를 변조한 것이 아니라는 사실입니다. 원하는 앞뒤 문자가 나올 때까지 자신이 통제하는 새 주소를 찾아낸 것입니다. 앞뒤만 확인하는 관행이 공격자에게는 곧 주소 제작 규격이 됩니다.

닮은 주소가 왜 내 거래 내역에 나타날까?

유사 주소를 만들었다고 해서 피해자가 알아서 찾아오지는 않습니다. 공격자는 아주 적은 수량의 자산을 유사 주소에서 피해자에게 보내 거래 내역에 흔적을 남깁니다. 금액이 너무 작아 사실상 쓸 수 없는 경우가 많아 이런 전송을 ‘더스트’라고 부르기도 합니다.

EVM 계열 네트워크에서는 조금 더 헷갈리는 형태도 가능합니다. ERC-20 표준은 전송 수량이 0이어도 일반 전송처럼 처리하고 Transfer 이벤트를 남기도록 정합니다. OpenZeppelin v5.4.0과 같은 일부 구현에서는 기본 허용량(allowance) 0이 요청 수량 0보다 작지 않으므로, 공격자가 피해자 주소를 from으로 넣은 transferFrom 호출이 별도 승인 없이 성공할 수 있습니다. 토큰은 한 개도 움직이지 않았지만 지갑이나 블록 탐색기에는 피해자가 유사 주소로 보낸 것 같은 기록이 표시될 수 있습니다.

이 거래를 승인한 기억이 없다고 해서 곧바로 개인키 유출을 뜻하지는 않습니다. 실제 공격 트랜잭션에 서명하고 수수료를 낸 주체는 공격자이며, 피해자 잔액도 이 수량 0 전송 때문에 줄어들지 않습니다. 다만 거래 내역을 주소록처럼 사용하면 다음 송금이 문제가 됩니다.

공개 거래 관찰부터 유사 주소 생성, 소액 또는 수량 0 전송, 잘못된 주소로의 실제 송금까지 이어지는 주소 오염 공격 흐름

주소 오염 공격의 전형적인 흐름을 단순화한 그림. 소액 전송과 수량 0 토큰 이벤트의 구현 및 표시 방식은 네트워크·토큰·지갑에 따라 다를 수 있습니다.

마지막 송금은 피해자가 직접 서명합니다

공격자가 기다리는 순간은 피해자가 같은 상대에게 다시 보낼 때입니다. 거래 내역의 최근 주소를 찾아 앞뒤만 보고 복사한 뒤 송금을 승인하면, 블록체인은 입력된 유사 주소로 자산을 보냅니다.

블록체인이 확인할 수 있는 것은 “이 계정의 소유자가 이 주소로 보내는 거래에 서명했는가”까지입니다. 사용자가 마음속으로 다른 수취인을 생각했다는 사실은 알 수 없습니다. 그래서 정상적으로 확정된 거래를 네트워크가 알아서 되돌려 주지도 않습니다.

주소 오염은 전통적인 더스팅 공격과 겹쳐 보이지만 목적이 다릅니다. 더스팅은 여러 주소에 작은 금액을 보내 이후 움직임을 추적하거나 사용자를 다른 사기로 유도하는 데 주로 쓰였습니다. 주소 오염은 그 작은 전송을 이용해 유사 주소를 거래 내역에 심고 다음 송금의 목적지를 바꾸는 것이 직접적인 목표입니다.

정상 주소를 복사했는데 붙여 넣은 값이 다른 주소로 바뀌었다면 이는 주소 오염이 아니라 클립보드 변조 악성코드를 의심할 상황입니다. 주소 오염은 복사 과정에서 값을 바꾸는 대신, 사용자가 처음부터 거래 내역의 잘못된 주소를 고르도록 유도합니다.

앞뒤 확인 대신 이렇게 보내세요

가장 먼저 바꿀 습관은 간단합니다. 거래 내역에서 수취 주소를 복사하지 마세요. 상대방의 현재 입금 화면, 공식적으로 확인된 주소 또는 미리 검증해 저장한 주소록에서 가져오는 편이 안전합니다.

자주 보내는 주소라면 처음 확인할 때 전체 주소를 신뢰할 수 있는 별도 경로와 대조한 뒤 주소록이나 출금주소 목록에 저장하세요. 서비스가 새 출금주소 등록 후 대기시간이나 추가 인증을 제공한다면 번거로운 절차가 오히려 주소가 바뀌는 순간을 한 번 더 드러내 줍니다. 다만 거래소 입금 주소는 운영 정책이나 네트워크 사정으로 바뀔 수 있으니, 저장한 주소도 현재 입금 화면과 다시 대조하고 네트워크와 메모(태그)를 함께 확인해야 합니다.

최종 승인 화면에서는 표시된 주소가 복사한 값과 같은지만 보지 말고, 그 값이 수취인이 지금 제공한 주소와 같은지 확인해야 합니다. 하드웨어 지갑 화면도 컴퓨터가 보여준 주소와 실제 서명할 주소가 같은지는 확인해 주지만, 그 주소의 주인이 누구인지를 판별해 주는 것은 아닙니다.

큰 금액을 보낼 때 소액 시험 전송도 도움이 됩니다. 다만 시험 전송이 도착한 뒤 본 전송에서 거래 내역을 다시 열어 주소를 새로 복사하면 보호 효과가 사라집니다. 시험에 사용한 바로 그 주소를 저장하거나 그대로 검증해 재사용해야 합니다.

모르는 소액 전송이나 수량 0 이벤트가 거래 내역에 나타났더라도 돌려보내거나 해당 토큰·링크와 상호작용할 필요는 없습니다. 이미 유사 주소로 자산을 보냈다면 추가 전송을 멈추고 TXID, 수취 주소와 화면 기록을 보관한 뒤 이용 중인 서비스의 공식 고객지원과 수사기관에 신고하세요. 온체인 거래는 확정 후 취소가 어렵고, 신고가 곧 회수를 보장하지는 않습니다.

그럼 긴 주소를 매번 처음부터 끝까지 외워야 할까요? 그럴 필요는 없습니다. 다만 거래 내역은 영수증이지 주소록이 아닙니다.


참고 자료

안내

이 글은 공개 자료를 바탕으로 주소 오염 공격의 일반적인 작동 방식과 예방 원칙을 설명합니다. 공격 흔적이 표시되는 방식과 지갑의 경고·주소록 기능은 네트워크와 토큰, 서비스 버전에 따라 다를 수 있습니다. BTX에서 출금할 때는 실제 화면에 표시된 인증 절차와 최신 공식 안내를 함께 확인하세요.