주소 포이즌: 스왑 내역에 끼어든 0값 전송
이더리움 20블록 구간에서 USDT 전송 로그의 25%가 0값이었습니다. 서명도 키도 필요 없고, 다음에 복사할 지급·환불 주소를 노립니다.
2026년 11월 7일, 이더리움 연속 20개 블록(26,363,482–26,363,501)의 USDT Transfer 로그를 전부 가져왔다. 2,346건 중 587건이 0값이었고, 이는 약 4분 동안 해당 토큰 전송의 25.0%다. 대부분은 배치 거래로 들어왔지만 하나는 달랐다. 0x8c6ff6…91e1에서 0x8c6f58…91e1로 간 0값 전송으로, 두 주소는 앞 4자리와 뒤 4자리 16진수가 완전히 같다. 이것이 주소 포이즌이다. 키가 털리지도, 컨트랙트가 승인되지도, 서명이 요구되지도 않았다. 공격자가 산 것은 수취인 내역 한 줄뿐이고, 다음 복사·붙여넣기가 틀린 주소를 고르리라 베팅한다. (XMR→USDT 출구 루트)
어떻게 만드나. 공격자는 대상 주소의 앞과 뒤가 같은 주소를 만든다. EVM 주소는 20바이트, 40개의 16진 문자로 표시된다. 앞 k자와 뒤 k자를 고정해도 가운데는 자유롭다. 배니티 검색에서 k+k 일치는 대략 16^(2k)번 시도가 필요하다. 3+3이면 1,670만 번으로 노트북에서 몇 분, 4+4면 43억 번으로 GPU 장비면 가능하지만 공짜는 아니다. 그다음 공격자는 가짜 주소에서 대상에게 0 USDT(또는 0.000001)를 보낸다. 직접 보내거나 배치 컨트랙트를 거칠 수 있다. 거래는 유효하고 가스만 조금 내면 되며, 공격자 주소가 대상 내역에 기록된다. 지갑과 익스플로러는 앞뒤 몇 글자만 보여 주므로 가짜는 언뜻 맞아 보인다. (XMR→USDT 출구 루트)
측정이 말하는 것과 말하지 않는 것. 다른 20블록 구간에서 0값 비율은 14.6%(2,287건 중 333건), 같은 시기 USDC 구간은 19.0%(1,638건 중 311건)였다. 비율은 스팸 파동에 따라 움직인다. 0값 전송은 값싼 잡음이다. 첫 구간의 배치 거래 한 건은 네 개 토큰 컨트랙트에 116개의 0값 Transfer 로그를 내보내며 1,767,530 가스, 46.5 gwei를 냈다. 0.0000822 ETH, 14:10 UTC ETH 2,243달러 기준 약 0.18달러, 로그당 약 0.0016달러다. 많은 0값 전송은 에어드롭 쓰레기나 인덱서 장난이고, 포이즌의 신호는 금액이 아니라 주소 쌍이다.
왜 적어도 이번 표본에서는 이더리움형인가. TRON 연속 60개 블록(87,795,702–87,795,761)에는 27,423건 거래, 5,514회 TRC20 transfer 호출이 있었고 0값은 한 건도 없었다. 잔액이 있는 주소에서 USDT-TRC20 컨트랙트(TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t)의 transfer(0)를 시뮬레이션하니 63,999 에너지를 썼고, 네트워크 100 sun/에너지 기준 6.3999 TRX, TRX 0.3196달러로 약 2.04달러다. 이더리움 배치는 로그당 0.0016달러로 약 1,300배 싸다. 이 비용 차이는 우리가 측정한 0값 대량 스팸이 이더리움에서 나타나는 이유를 설명하는 데 도움이 된다. TRON이 안전하다는 뜻은 아니다. 표본은 약 3분이고, 가짜 TRC20 컨트랙트나 다른 전송 방법이면 주소를 심을 수 있다. (XMR→USDT 출구 루트)
스왑 양식에서는 무엇을 뜻하나. 스왑은 지급 주소와 환불 주소를 내가 지정하고, 사이트가 입금 주소를 준다. 이 사이트의 입금 주소는 주문마다 생성되고 주문 후에야 나타나므로 미리 포이즌할 수 없다. 지급과 환불은 다르다. 내 지갑, 주소록, 내역에서 온다. 가짜 주소를 지급 칸에 붙이면 스왑 출금이 공격자에게 간다. 환불 칸에 붙이면 실패 주문의 환불이 그리로 간다. 환불 칸은 급하게 채우고, 이전 주문 페이지에서 복사하는 일이 많다 — 포이즌이 의지하는 습관 그대로다. Monero의 긴 base58 주소도 지갑이 줄여 표시하면 소용없다. 규칙은 같다.
실제로 통하는 다섯 가지 확인. 1) 지급·환불 주소는 거래 내역, 익스플로러, 채팅에서 복사하지 않는다. 지갑의 받기 화면을 열거나 내 지갑의 QR을 스캔한다. 2) 문자열 전체를 비교한다. 앞뒤 네 글자가 아니다 — 가운데가 가짜가 다른 곳이다. 하드웨어 지갑은 기기 화면에서 전체를 읽는다. 3) 자주 쓰는 코인/네트워크마다 주소록 항목을 만들고 라벨을 붙인다. 저장된 항목은 0값 전송으로 바뀌지 않는다. 4) 네트워크를 확인한다. EVM 주소는 이더리움, BSC, Arbitrum, Base에서 똑같이 생겼고, 이더리움의 포이즌 주소를 BSC 지급 칸에 붙일 수 있다. 5) 큰 금액은 작은 별도 주문부터. 큰 주문에 대한 분할 입금은 부분 결제로 해석될 수 있으므로, 서비스가 문서화하지 않았다면 입금을 쪼개지 않는다. (모네로 확인 대기)
사이트가 할 수 있는 것과 없는 것. 주문 양식은 다섯 필드뿐이고 시드 구문도 서명도 요구하지 않는다. 지급 주소는 주문 생성 시 고정되며 주문 페이지에서 나중에 바꿀 수 없다. 이것이 승인 피싱을 없애지만 복사·붙여넣기 위험을 없애지는 않는다. 주소는 내가 입력한 문자열 그대로다. 주문 페이지는 입금 주소와 금액을 보여 주고, 환불 주소는 주문에 저장된다. 지갑에 0값 토큰이 나타나면 상호작용하지 말고, 그 주소를 복사하지 말고, 가능하면 숨긴다. 취소할 승인은 없다 — 승인한 적이 없다. 0값 전송은 자금을 움직일 수 없고 주소 광고만 할 수 있다.
체크리스트와 작성 시점 숫자. 보내기 전: 전체 문자열 비교, 네트워크 확인, 주소록, 하드웨어 화면, 큰 금액이면 별도 소액 주문. 0인 줄은 결제도 잔액도 아니고 광고다. 작성 시점(2026년 11월 7일 14:23 UTC) 100 USDT-TRC20은 0.1434147 XMR, 1,000은 1.613784 XMR(2개 경로, 150bps 우위), 1 XMR은 606.72 USDT(2개 경로, 201bps), 0.01 BTC는 1.224825 XMR(2개 경로, 101bps). 카탈로그는 438개 자산·65개 네트워크, 그중 6개는 추가 ID가 필요하다. 숫자는 움직이고 페이지의 라이브 견적이 기준이다. (XMR→USDT 출구 루트)