VeilSwap
← All posts
보안2026-10-249 min read

클립보드 하이재킹: 전송 전 주소 검증법

체크섬은 오타를 잡지, 교체를 잡지 못합니다. 비트코인 주소 1,304개와 모네로 주소 5,415개를 변형해 검증한 뒤, 실제로 통하는 확인 절차를 정리했습니다.

클립보드는 사적인 통로가 아닙니다. 거의 모든 데스크톱 OS에서 클립보드는 단일 공유 버퍼이고, 당신 계정으로 실행되는 어떤 프로그램이든 읽고 덮어쓸 수 있습니다. 확인 창도, 기록도 없습니다. 클립보드 하이재킹이 노리는 지점이 정확히 이것입니다: 암호화폐 주소처럼 생긴 문자열을 감시하다가 당신이 복사하는 순간 자기 주소로 바꿔치기합니다. 붙여넣기하고, 형식은 완벽하고, 지갑은 받아들이고, 돈은 나갑니다. 가상의 형식 문제가 아닙니다. 흉내 낼 수 있는 주소 형식은 체인 위에 널려 있습니다. 2026년 10월 24일 17:47:02 UTC에 채굴된 비트코인 블록 972,954에는 사용 가능한 출력 660개가 다섯 가지 형태로 들어 있었습니다: 42자 P2WPKH 409개, 34자 P2PKH 143개, 34자 P2SH 46개, 62자 P2TR 44개, 62자 P2WSH 18개. 복사한 내용의 앞 네 글자만 보면 하이재커는 어떤 형태로 돌려줘야 하는지 압니다. (모네로 확인 대기)

체크섬은 이 문제를 실제보다 안전하게 느끼게 만드는 원인입니다. 우리는 그 블록에서 실제 주소 bc1q5js6zn25fwvr0zhm537ytt30f2d2fjzuh7gs6n를 가져와 42개 위치마다 bech32 알파벳의 다른 문자로 바꿔 1,304개 변형을 시험했습니다. 통과한 것은 0개입니다. 4바이트 Keccak 체크섬을 쓰는 95자 모네로 주소에도 같은 실험을 해 5,415개 단일 문자 변형을 만들었고, 통과는 0개였습니다. Base58Check도 같습니다. 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa를 한 글자 바꾸면 이중 SHA256 검사에서 떨어지고, TRON의 USDT 컨트랙트 TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t를 한 글자 바꿔도 떨어집니다. 이 주소는 0x41 네트워크 바이트와 20바이트로 디코딩되며 끝 4바이트가 체크섬입니다. 즉 한 글자 실수는 사실상 항상 잡힙니다. 논리의 결함은 하이재커가 한 글자 실수를 하지 않는다는 데 있습니다. 넘겨주는 것은 체크섬까지 올바르게 생성된 다른 문자열입니다. (XMR→USDT 출구 루트)

파이프라인의 검사는 여기서 끝입니다. 저희 주문 엔드포인트의 서버 검증은 길이 상한 — 256자, 그게 전부 — 이고, 형식과 체크섬 검사는 한 단계 아래 유동성 제공자 쪽에서 이뤄집니다. 두 거부 경로 모두 실재하며 오늘 직접 발생시켜 확인했습니다: 95자 모네로 주소에서 한 글자를 바꾸면 “… is not valid. Reason: Invalid checksum”이 돌아오고, “test”를 보내면 “invalid destination address”가 돌아옵니다. 잘린 붙여넣기는 잡지만, 제대로 붙여넣은 것은 잡지 못합니다. 더 약한 쪽은 EVM 계열입니다. 이더리움 주소에는 필수 체크섬이 없습니다. EIP-55는 대소문자에 체크섬을 심는 방식이고, 그것도 대소문자를 섞어 쓸 때만 작동합니다. 0xdAC17F958D2ee523a2206206994597C13D831ec7로 다시 계산해 일치함을 확인했지만, 같은 주소를 전부 소문자로 쓰거나 소문자 16진수 한 자리를 바꿔도 모든 지갑이 받아들입니다. ETH와 USDT-ERC20에서는 오타를 막아주는 것이 당신의 눈뿐입니다. (XMR→USDT 출구 루트)

바꿔치기를 하는 면은 네 가지이고, 클립보드는 그중 하나일 뿐입니다. 호스트 수준 악성코드는 버퍼를 읽고 패턴을 맞춘 뒤 되씁니다. 악성 브라우저 확장은 클립보드조차 필요 없습니다 — 붙여넣은 뒤 입력 필드의 값을 직접 바꿀 수 있습니다. 몇 년 전 피싱 페이지에서 저장한 주소는 계속 살아 있습니다. 주소록은 기본적으로 신뢰되고 거의 재확인되지 않기 때문입니다. QR 덮어쓰기는 카메라에는 한 코드를, 화면에는 다른 코드를 보여줍니다. 이 넷을 관통하는 것은 '붙여넣기, 힐끗 보기, 전송'이라는 습관이고, 약한 고리는 '힐끗 보기'입니다. 34자 비트코인 주소에서 앞 네 글자와 뒤 네 글자만 비교한다면 34자 중 8자, 약 4분의 1만 확인한 것이며, 그것도 이미 변조됐을 수 있는 바로 그 화면에서 확인한 것입니다. (모네로 확인 대기)

통하는 확인은 지루하고 30초면 끝납니다: 전송에 쓰는 기기가 아닌 다른 기기에서 전체 문자열을 한 글자씩 대조하는 것입니다. 하드웨어 지갑으로 서명한다면 그 기기는 서명 시점에 자기 화면에 목적지를 표시합니다. 그 화면은 펌웨어가 그리는 것이지 OS가 그리는 것이 아니며, 침해된 호스트가 바꿀 수 없는 유일한 뷰입니다. 스왑 주문이나 거래소로 보내는 경우 목적지는 폰 안에 있습니다: 받는 지갑을 열고 받기를 눌러 데스크톱 화면과 대조해 읽으세요. QR은 클립보드를 완전히 우회하므로 공격면 하나를 통째로 없앱니다. 다만 받는 지갑 자체의 화면에서 스캔하고, 코드 아래 인쇄된 주소 문자열도 반드시 읽으세요. QR 바꿔치기는 실제로 쓰이는 수법입니다. 이렇게 한 번 검증한 주소는 지갑 주소록에 저장하고 이후에는 저장된 항목만 쓰세요. 채팅에서 다시 복사하는 것이 두 번째 시도에서 당하는 전형적인 경로입니다. (모네로 확인 대기)

브로드캐스트 후에는 무엇도 되돌릴 수 없습니다. 그래서 전송 전 확인만이 의미를 갖습니다. 비트코인 트랜잭션은 서명 시 RBF를 켰을 때만 교체될 수 있고, 스왑 입금은 거의 켜지지 않습니다. 모네로, TRON, 이더리움 전송은 확인되면 확정입니다. 스왑 주문에서 당신이 책임지는 주소는 지급 주소만이 아닙니다. 환불 주소가 또 하나이고, 실패 방식은 완전히 같습니다: 환불 주소가 바뀌면 실패한 주문이 기부가 됩니다. 알아둘 비대칭이 하나 있습니다. 주문 페이지의 입금 주소는 제공자가 주문마다 생성해 전용 QR과 함께 보여주므로 당신의 클립보드를 거치지 않고, 하이재커가 바꿀 대상이 없습니다. 당신의 책임은 직접 입력하거나 붙여넣는 두 주소 — 지급과 환불 — 입니다. (모네로 확인 대기)

많은 사람이 '먼저 소액을 보내 시험한다'에 손이 갑니다. 자기 지갑으로 보내는 경우라면 계산은 맞습니다. 오늘 시세로 141 vB 비트코인 트랜잭션은 1 sat/vB에서 141사토시, BTC 80,255달러 기준 약 0.11달러입니다. 모네로 1입력/2출력은 1,534바이트이고 20,000피코네로/바이트 하한에서 0.00003068 XMR, 2센트 미만입니다. USDT-TRC20 전송은 64,285 에너지(6.4285 TRX)에 345바이트 대역폭(0.345 TRX), TRX 0.3295달러 기준 약 2.23달러입니다. 통하지 않는 것은 스왑 주문으로 시험하는 방식입니다. USDT-TRC20에서 XMR로의 최소 금액은 지금 19.741234 USDT이고, 실시간 견적 — 100 USDT가 0.14558008 XMR, 5,000이 8.18028676 — 을 맞춰보면 한계 가격은 XMR당 609.85 USDT, 주문당 고정비는 약 11.22달러입니다. 최소 금액으로 보내면 이 고정비가 보낸 금액의 56.8%입니다. 시험할 거라면 자기 지갑 전송으로 시험하고, 스왑 주문으로는 하지 마세요. (XMR→USDT 출구 루트)

정직한 한계: 입력에 쓰는 기기가 커널 수준에서 침해됐다면 그 기기에서 하는 어떤 확인도 의미가 없습니다. 지갑의 주소 표시도, 블록 탐색기도, QR 코드도 마찬가지입니다. 그래서 이 절차는 소프트웨어가 아니라 두 번째 기기를 축으로 짜입니다. 실제 악성코드를 견디는 습관은 모두 작습니다. 전체 문자열을 대조하지 않은 주소를 클립보드에 태우지 마세요. 검증된 주소록을 유지하고 채팅에서 재복사를 그만두세요. 방금 붙여넣은 주소는 지난주에 쓰던 것과 같아도 신뢰하지 마세요. 바로 그 지점이 하이재커가 바꾸는 곳입니다. 잃으면 아까운 금액이라면 전송 버튼을 누르기 전에 하드웨어 지갑 화면이나 폰에서 소리 내어 대조하세요. 특별한 일이 아닙니다. 30초의 지연과, 아무도 되찾아줄 수 없는 송금의 차이입니다. (모네로 확인 대기)

Frequently asked questions

주소 체크섬이 클립보드 하이재킹을 막아주나요?

아니요. 체크섬이 잡는 것은 오타이고 교체가 아닙니다. 실제 비트코인 bech32 주소의 단일 문자 변형 1,304가지와 95자 모네로 주소의 5,415가지를 모두 시험했고 통과한 것은 없었습니다. 한 글자 실수는 잡힌다는 뜻입니다. 하지만 하이재커는 실수를 하지 않습니다. 유효하고 체크섬도 맞는 다른 주소를 넣으므로 모든 검증기가 통과시킵니다.

몇 글자나 대조해야 하나요?

전부, 그리고 두 번째 기기에서 — 이것만이 성립하는 답입니다. 줄여야 한다면 앞 4자 + 뒤 4자로 58^8, 약 128조 가지라 고정 주소를 쓰는 하이재커는 맞출 수 없습니다. 앞 4자만이면 58^4 약 1,132만 가지로, 배니티 주소 생성기로 만들어낼 수 있습니다. 그리고 주소를 보여주는 화면 자체가 침해됐다면 둘 다 무의미합니다.

소액 테스트 전송으로 충분한가요?

이미 목적지를 한 번 확인한 뒤의 보조 수단일 뿐이고, 체인에 따라 실제 비용이 듭니다. 141 vB 비트코인 전송은 1 sat/vB에서 약 0.11달러, USDT-TRC20 전송은 약 2.23달러입니다. 스왑 주문에는 형태가 전혀 맞지 않습니다. 최소 금액이 19.741234 USDT이고 주문당 고정비가 약 11.22달러라, 최소 크기 테스트 주문은 56.8%가 고정비로 사라집니다. 시험은 자기 지갑 간 전송으로 하세요.

Keep reading

All articles →

Ready to swap?

No account · No KYC · No email

Exchange now
클립보드 하이재킹: 전송 전 주소 검증법 — VeilSwap