당신의 지갑은 아직 안전한가요? 해커는 어떻게 Permit, Uniswap Permit2, 허가 서명을 이용해 피싱을 하는가?
이전에 그룹에서 누군가가 공유한 말이 기억납니다: "누가 수익을 제공하는지 모른다면, 당신이 그 수익을 제공하는 사람입니다." 이 말이 매우 타당하다고 느꼈습니다. 암호화 지갑 사용의 안전성 측면에서도 마찬가지입니다. 자신이 하고 있는 작업이 무엇을 의미하는지 확실하지 않다면, 당신이 수행하는 모든 온체인 상호작용이나 서명은 지갑 내 자산을 잃을 가능성이 있습니다.
얼마 전, Scam Sniffer가 2024년 중반 피싱 보고서를 발표했습니다: 올해 상반기 동안 EVM 체인(즉, 이더리움 계열 체인)에서만 26만 명의 피해자가 피싱 공격을 당해 총 3.14억 달러의 손실을 입었습니다. 지난해(2023년) 피싱 공격으로 도난당한 2.95억 달러와 비교할 때, 올해는 단 6개월 만에 이 수치에 도달했습니다. 아래 그림과 같습니다.
보고서에 따르면, 현재 대부분의 ERC20 토큰 도난은 피싱 서명(예: Permit(오프라인 승인 서명 방식), Increase Allowance(승인 한도 증가 방식), Uniswap Permit2) 서명에서 발생하고 있으며, 피싱 공격은 여전히 온체인 보안 문제의 주요 원인입니다.
며칠 전 한 파트너가 문제를 제기했습니다. 이 파트너는 두 달 전(6월 14일) Coinbase Wallet에서 Binance로 3건의 송금을 했습니다(이더 체인 기반 송금). 첫 번째 송금은 성공했지만, 나머지 두 건은 계속해서 수신되지 않았고, 두 달이 지났습니다. 무슨 문제가 발생했는지 모르겠습니다.
그래서 Etherscan을 통해 체인상의 토큰 거래 기록을 확인했지만, 해당 송금에 대한 기록(Transfer)만 보았고 나머지 두 건의 기록은 보이지 않았습니다. 아래 그림과 같습니다.
6월 14일 당일의 모든 온체인 거래 기록을 추가로 확인해 보니, 실제로 3건의 송금(Transfer) 기록이 있었지만, 나머지 두 건은 거래 실패로 표시되었습니다. 아래 그림과 같습니다.
그 후, 실패(Fail 상태) 거래 기록 중 하나를 열어보니, 표시된 오류 메시지는 "계약 실행 중 오류 발생"이었습니다. 이와 같은 오류는 이론적으로 지갑 내 자산 손실을 초래하지 않습니다. Etherscan 공식 문서에 따르면, 이러한 오류가 발생할 경우 발신자가 보낸 자산(토큰)은 발신자 지갑 주소에서 떠나지 않으며, 오직 가스 비용만 차감됩니다. 아래 그림과 같습니다.
따라서 이러한 문제를 해결하기 위해 확인해야 할 사항은:
지갑 내 자금이 당일 실제로 송금되었는지 또는 손실되었는지 확인(즉, 거래 실패 후 지갑으로 반환되지 않았는지)
자산이 송금되었거나 손실된 것이 확인되면, 해당 웹사이트의 고객 서비스에 연락하여 지원을 요청해야 할 수 있습니다(이 경우 주로 송신자 또는 출금 플랫폼에 연락하여 이 송금의 출처를 추가로 확인해야 하며, 수신자 또는 수신 주소의 플랫폼은 처리할 수 없습니다).
이 문제를 바탕으로, 제 일반적인 조언은: 일상 거래 과정에서 거래 기록표를 작성하는 것이 좋습니다. 예를 들어, Excel과 같은 도구를 사용하여 일상 거래(매매) 기록, 자금 지출(입금/출금) 기록 등을 잘 정리해 두는 것입니다. 그런 다음 문제가 발생했을 때, 이 표를 체인상의 거래 기록과 비교하여 확인할 수 있습니다. 사실 저도 이런 표를 가지고 있으며, 거래를 할 때마다 자세히 기록합니다(일부 기록에는 거래 경험에 대한 메모도 남깁니다).
이로써 위의 문제는 기본적으로 해결된 것 같습니다. 그러나 온체인에서 거래 기록을 조회하는 과정에서, 이 파트너의 지갑에 더 심각한 문제가 있다는 것을 발견했습니다: 해커의 표적이 되었습니다!
무슨 일이죠? 계속해서 살펴보겠습니다(아래 그림 참조):
먼저 위 그림의 빨간 상자(실제 거래)를 보세요:
지갑 소유자는 1만 달러의 스왑 작업을 수행하고, 교환한 USDT를 0x8F로 시작하는(f103으로 끝나는) 지갑으로 보냈습니다.
다음으로 위 그림의 초록 상자(피싱 거래)를 보세요:
그 직후, 해커는 여러 개의 가짜 거래를 생성했으며, 주의할 점은 해커가 생성한 주소 지갑도 0x8F로 시작하고(f103으로 끝나는) 있다는 것입니다.
이제 이 지갑 주소들을 비교해 보겠습니다:
아래는 지갑 소유자의 실제 주소입니다:
0x8F773C2E1bF81cbA8ee71CBb8d33249Be6e5f103
아래는 해커의 지갑 주소입니다:
0x8F7cCF79d497feDa14eD09F55d2c511001E5f103
0x8F776d5623F778Ea061efcA240912f9643fdf103
이제 여러분은 문제가 무엇인지 알 수 있을 것입니다. 이들 지갑의 처음 4자리와 마지막 4자리가 모두 동일합니다. 주의 깊게 보지 않으면 발견하지 못할 수도 있습니다. 만약 이 시점에서 거래 기록을 통해 지갑 주소를 복사하여 송금한다면, 기본적으로 돈이 해커에게 직접 송금되는 것을 의미합니다.
따라서 확실히 이 파트너의 지갑은 해커의 표적이 되었으며, 해커는 피싱 방식을 통해 이 파트너의 자산을 빼내려 하고 있습니다. 또한 거래 해시 페이지의 데이터에 따르면, 해당 거래의 Transaction Action도 Fake_Phishing으로 표시되어 있으며, 이는 100% 해커 주소입니다. 아래 그림과 같습니다.
추가 지식: Etherscan을 사용할 때 무효 거래나 제로 송금 기록을 볼 수 없는 이유는 무엇인가요? 이더리움 브라우저를 간체 중국어 인터페이스로 설정하는 방법은?
이는 이더리움 공식 브라우저가 기본적으로 무효 거래와 제로 송금 기록을 숨기기 때문입니다. 이러한 데이터를 보려면 Etherscan의 설정 페이지에서 고급 기능을 활성화하면 됩니다. 또한 간체 중국어 인터페이스를 사용하고 싶다면 설정 페이지에서 선택할 수 있습니다. 아래 그림과 같습니다. 또는 Oklink와 같은 제3자 멀티 체인 브라우저를 사용하는 것도 고려할 수 있습니다(간체 중국어 표시도 지원합니다).
지갑 사용의 안전 문제는 특히 대규모(100만 달러 이상) 자산 지갑에 대해 특별히 주의해야 할 사항입니다. 자산을 사용 상황에 따라 여러 지갑에 분산하여 보관하는 것이 안전성을 높이는 방법입니다. 예를 들어, 제 지갑은 다음과 같이 여러 단계로 나누어져 있습니다:
1단계는 애플 휴대폰으로 만든 콜드 지갑으로, 코인을 보관하는 용도로 사용하며, 오프라인 상태이고 어떤 거래/송금 작업도 하지 않습니다. 이 자산은 최소 10년 동안은 손대지 않을 것입니다. 물론, 콜드 지갑으로 거래를 하고 싶다면, Trezor, Ledger와 같은 유명한 하드웨어 지갑을 정식 경로로 구매하는 것을 고려할 수 있습니다.
2단계는 비교적 큰 자금의 핫 지갑으로, Trust Wallet을 사용하며 dApp 승인 작업은 하지 않고, 다른 자신의 지갑과의 송금만 포함됩니다. Binance의 출금이나 송금 작업도 포함됩니다.
3단계는 수십 개의 작은 지갑으로, 일부는 테스트용(예: 다양한 신규 프로젝트의 상호작용을 통해 제품을 경험하거나 에어드롭을 받기 위해 사용)이고, 일부는 이전에 산 알트코인이나 '개코인'을 위해 사용한 것입니다(최근 몇 년 동안 이와 관련된 거래는 거의 하지 않았습니다). 각 지갑은 소액 자금, 몇 백에서 몇 천 달러에 불과합니다. 이러한 지갑의 일상적인 승인/서명은 비교적 자유롭게 진행하며, 도난당해도 상관없습니다. 비록 이러한 지갑의 사용과 관리가 다소 번거로울 수 있지만, 주로 안전을 위해서입니다.
결론적으로, 사람마다 지갑 사용에 대한 선호가 다를 수 있으며, 이는 개인 상황에 따라 다릅니다. 오래된 투자자는 자산을 체인에 보관하는 것을 선호할 수 있지만, 이 분야에 막 들어온 대부분의 신규 사용자에게는 Binance, OKX와 같은 대형 거래소에 자산을 보관하는 것이 오히려 더 안전할 수 있습니다.
이제 현재 비교적 흔한 피싱 방식 몇 가지를 정리해 보겠습니다:
1. Permit 피싱 공격
먼저 기본 지식에 대한 설명이 필요합니다: 이더리움에서 토큰 송금을 할 때, 일반적으로 해당 토큰 스마트 계약의 Transfer 함수 또는 Transfer From 함수를 호출하여 실행합니다. 여기서 Transfer는 자산 소유자가 직접 승인 작업을 수행하고 토큰을 다른 주소로 전송하는 것을 의미하며, Transfer From은 제3자가 주소 내의 토큰을 다른 주소로 직접 전송하는 것을 의미합니다.
Permit 피싱 공격의 공격 과정은 다음과 같습니다:
먼저, 공격자는 피싱 링크나 피싱 웹사이트를 위조하여 사용자가 지갑을 통해 서명하도록 유도합니다(온체인에 기록되지 않음).
그런 다음, 공격자는 Permit 함수를 호출하여 승인을 완료합니다.
마지막으로, 공격자는 Transfer From 함수를 호출하여 피해자의 자산을 전송하여 피싱 공격을 완료합니다.
이러한 피싱 방식의 특징은 공격자가 서명 승인을 받은 후 Permit 및 Transfer From 작업을 수행하는 것입니다. 피해자 주소의 온체인 거래 기록에서는 승인 기록을 기본적으로 볼 수 없지만, 공격자 주소에서는 확인할 수 있습니다.
일반적으로 이러한 서명 승인 공격은 일회성이며 반복되거나 지속적으로 피싱 위험을 발생시키지 않습니다. 쉽게 설명하자면: 서명 피싱은 지갑의 니모닉(또는 개인 키)을 훔칠 수 없으며, 한 번의 서명 피싱은 한 번만 사용할 수 있고, 해당 계정에 해당하는 체인의 특정 토큰에만 적용됩니다(예: USDT를 승인했다면 해커는 당신의 USDT만 훔칠 수 있습니다). 간단히 말해, 피싱으로 서명당하면 해커는 한 번만 사용할 수 있으며, 이후에 계속해서 잘못된 서명을 하여 해커가 이용할 수 있습니다.
(위 이미지는 bocaibocai@wzxznl에서 가져온 것입니다)
2. Uniswap Permit2 피싱 공격
이 피싱 방식은 위에서 언급한 Permit와 유사하며, 모두 체외 서명 피싱에 해당합니다. Uniswap Permit2는 Uniswap이 2022년에 출시한 스마트 계약으로, 공식 설명에 따르면 이는 토큰 승인을 통해 다양한 애플리케이션에서 공유하고 관리할 수 있도록 허용하는 계약입니다. 이는 보다 통합되고 비용 효율적이며 안전한 사용자 경험을 창출합니다. 현재 많은 프로젝트가 Permit2와 통합되어 있습니다.
최근 bocaibocai(X@wzxznl)가 쓴 몇 편의 글을 통해 Uniswap Permit2 피싱 공격 방식에 대해 더 잘 알게 되었습니다. 여기서 간단히 요약해 드리겠습니다:
어떤 DEX에서 스왑 작업을 수행할 때, 전통적인 상호작용 방식은 먼저 이 DEX에 승인을 부여한 후 스왑 거래를 진행해야 하며, 이는 일반적으로 두 번의 가스 비용이 발생합니다. 사용자에게는 마찰 비용이 너무 크며, Permit2는 이 단계를 생략할 수 있어 사용자 상호작용 비용을 매우 효과적으로 줄여 더 나은 사용자 경험을 제공합니다.
즉, Permit2는 사용자와 dApp 간의 중개자 역할을 하며, 사용자는 토큰의 권한을 Permit2 계약에 승인하면, Permit2 계약을 통합한 모든 dApp이 이 승인 한도를 공유할 수 있습니다. 사용자에게는 상호작용 비용이 줄어들고 사용자 경험이 향상되며, dApp에게는 사용자 경험의 향상이 더 많은 사용자와 자금을 가져옵니다.
이는 본래 윈-윈 상황이지만, 동시에 양날의 검이 될 수 있습니다. 전통적인 상호작용 방식에서는 승인이나 자금 이동이 사용자에게 온체인 상호작용이지만, Permit2는 사용자의 작업을 체외 서명으로 변환합니다. 모든 온체인 작업은 중개자(예: Permit2 계약 및 Permit2를 통합한 프로젝트 등)가 수행하게 되며, 이 솔루션이 가져오는 이점은 온체인 상호작용의 역할이 사용자에서 중개자로 이동했지만, 사용자에게는 체외 서명이 가장 방어를 풀기 쉬운 단계입니다. 예를 들어, 우리가 지갑으로 특정 dApp에 로그인할 때 서명을 요구하며, 대부분의 사람들은 서명의 내용을 자세히 확인하지 않거나 이해하지 못합니다(일반 사용자에게는 서명 화면이 코드 덩어리처럼 보입니다). 이것이 가장 무서운 점입니다.
또 다른 무서운 점은, Swap할 금액이 얼마이든 Uniswap의 Permit2 계약은 기본적으로 해당 토큰의 전체 잔액을 승인하도록 설정되어 있습니다. MetaMask와 같은 지갑은 금액을 사용자 정의 입력할 수 있게 해주지만, 대부분의 사람들은 최대값이나 기본값을 클릭할 것입니다. Permit2의 기본값은 무한한 한도입니다. 아래 그림과 같습니다.
이는 당신이 Uniswap과 상호작용하고 Permit2 계약에 한도를 승인한 적이 있다면, 이 피싱 사기의 위험에 노출된다는 것을 의미합니다.
예를 들어, 작은 리는 이전에 Uniswap을 사용할 때 Uniswap Permit2에 무한한 USDT 한도를 승인했으며, 작은 리가 일상적으로 지갑 작업을 하던 중 해커가 설계한 Permit2 서명 피싱 함정에 빠졌다면, 해커는 작은 리의 서명을 이용해 Permit2 계약에서 Permit와 Transfer From 두 가지 작업을 수행하여 작은 리의 자산을 전송할 수 있습니다.
이 피싱 공격 방식의 구체적인 단계는 대략 다음과 같습니다:
먼저, 사용자의 지갑은 피싱 전에 Uniswap을 사용하고 토큰 한도를 Uniswap Permit2 계약에 승인했습니다(앞서 언급했듯이, Permit2의 기본값은 무한한 한도 승인입니다).
다음으로, 공격자는 피싱 링크나 피싱 웹사이트 페이지를 위조하여 사용자가 피싱 링크나 웹사이트를 통해 지갑 서명을 하도록 유도하고, 공격자는 필요한 서명 정보를 얻을 수 있습니다(이 단계는 Permit 피싱과 유사합니다).
그런 다음, 공격자는 Permit2 계약의 Permit 함수를 호출하여 승인을 완료합니다.
마지막으로, 공격자는 Permit2 계약의 Transfer From 함수를 호출하여 피해자의 자산을 전송하여 피싱 공격을 완료합니다.
일반적으로 이러한 공격 방식은 자산을 수신하는 주소가 많으며, 일부는 피싱을 수행하기 위해 특별히 생성된 주소(심지어 피해자의 지갑 주소와 동일한 주소로 끝나는 주소)일 수 있고, 일부는 피싱 서비스를 제공하는 블랙 마켓 주소일 수 있습니다(예: 일부 DaaS 공급자 주소, 현재 암호화 지갑을 대상으로 한 피싱은 이미 완전한 블랙 산업 체인을 형성한 것으로 보입니다). 아래 그림과 같습니다.
그렇다면 Permit, Permit2와 같은 문제를 어떻게 예방할 수 있을까요?
먼저 Scamsniffer와 같은 브라우저 보안 플러그인을 사용하여 피싱 링크를 방지하는 것을 고려할 수 있으며(저는 개인적으로 구글 크롬에서 이 플러그인을 사용하고 있습니다), 다음으로 Revoke Cash와 같은 도구를 사용하여 정기적으로 낯선 또는 불필요한 승인이나 서명을 확인하고 취소하는 것을 고려할 수 있습니다. 아래 그림과 같습니다.
또는 Scamsniffer에서 제공하는 Uniswap Permit2 전용 승인 관리 도구를 사용하여 정기적으로 확인하고, 이상 승인 시 즉시 취소하는 것을 권장합니다. 아래 그림과 같습니다.
물론 가장 중요한 것은 자신의 안전 의식입니다. 출처가 불분명한 링크나 웹사이트를 함부로 방문하지 말고, 평소 dApp 상호작용 승인을 할 때 필요한 검사를 많이 하세요.
(위 이미지는 bocaibocai@wzxznl에서 가져온 것입니다)
추가 지식: 지갑 서명이 Permit인지 Permit2인지 어떻게 식별하나요?
일상적으로 다양한 서명을 할 때, 우리는 승인 확인 화면에서 일부 코드를 보게 되며, 이를 통해 식별해야 합니다. 아래 그림과 같습니다.
위 그림의 Owner(승인자 주소), Spender(피승인자 주소), Value(승인 수량), Nonce(랜덤 수), Deadline(만료 시간).
3. Claim 피싱 공격
이 피싱 방식도 매우 흔합니다. 예를 들어, 우리가 X 플랫폼을 자주 사용하면, 무료로 에어드롭을 받는다는 정보가 많이 보입니다. 때때로 우리의 지갑에 알 수 없는 에어드롭 NFT 작은 이미지가 들어오기도 합니다(이미지 위에 도메인 주소가 있을 수 있습니다).
만약 지정된 피싱 웹사이트에 들어가 Claim 작업을 수행하면, 당신의 지갑 자산이 해커에게 직접 전송될 수 있습니다.
그렇다면 이러한 문제를 어떻게 예방할 수 있을까요?
먼저 하늘에서 떡이 떨어진다는 말을 믿지 마세요(즉, 출처가 불분명한 무료 NFT, 에어드롭 링크를 클릭하지 마세요). 둘째, 어떤 Claim 작업을 수행하기 전에 반드시 자신이 방문한 주소가 진짜 공식 웹사이트 주소인지 확인하세요. 경솔하게 행동하지 마세요.
4. 유사 주소 송금 피싱
올해 5월 3일, 한 거대 투자자가 동일한 시작과 끝 번호 주소 피싱 공격을 당해 1155개의 WBTC(당시 가치 약 7000만 달러)를 도난당하는 사건이 발생했습니다.
SlowMist는 이 사건에 대해 구체적인 분석을 했으며, 저는 더 이상 자세히 설명하지 않겠습니다. 관심 있는 분들은 검색하여 다시 확인해 보세요.
이 피싱 방식은 사실상 간단해 보입니다:
먼저, 해커는 미리 대량의 피싱 주소를 생성합니다. 이러한 주소는 일정한 혼란을 주며, 예를 들어 처음 4자리와 마지막 6자리가 피해자의 목표 송금 주소와 일치하는 주소입니다.
그런 다음, 분산 배포된 대량 프로그램을 통해 체인상의 사용자 동향에 따라 목표 송금 주소에 동일한 시작과 끝 번호 주소 피싱 공격을 시작합니다.
마지막으로, 목표 사용자(피해자)가 송금을 수행하면, 해커는 즉시 충돌로 생성된 피싱 주소를 사용하여 거래를 수행합니다. 이렇게 피싱 주소가 사용자의 거래 기록에 나타나게 됩니다. 아래 그림과 같습니다.
그 후, 사용자는 지갑의 거래 기록에서 최근 송금 정보를 복사하는 습관이 있기 때문에, 이 피싱 거래를 보고 복사한 주소가 정확한지 확인하지 않고, 결과적으로 1155개의 WBTC를 피싱 주소로 잘못 송금하게 됩니다.
그렇다면 이러한 문제를 어떻게 예방할 수 있을까요?
먼저, 자주 사용하는 주소를 지갑의 주소록에 저장하거나 화이트리스트에 추가하여 다음 송금 시 지갑의 주소록에서 목표 주소를 찾을 수 있도록 합니다. 둘째, 주소가 정확한지 확인하고, 처음 몇 자리나 마지막 몇 자리만 확인하고 송금하지 말고, 대규모 송금 전에 소규모 송금 테스트를 수행하는 것이 좋습니다.
5. 승인 서명 피싱
사실 우리가 앞서 언급한 Permit, Uniswap Permit2, Claim도 모두 승인 피싱의 범주에 속합니다. 승인을 언급할 때, 해커가 이용할 수 있는 여러 방법이 있습니다. 예를 들어, 비교적 흔한 Approve(즉, 승인, USDT 계약에 Uniswap이 내 지갑의 USDT를 사용할 수 있도록 허용하는 것), Increase Allowance(승인 한도 증가) 등이 있습니다.
공격 방식은 기본적으로: 공격자가 피싱 링크나 피싱 웹사이트를 통해, 또는 프로젝트 측의 공식 웹사이트를 해킹하여 악성 코드를 심고, 사용자를 유도하여 클릭하고 지갑을 승인하도록 하는 것입니다.
물론, 우리는 위에서 현재 비교적 일반적인 5가지 피싱 공격 방식을 나열했으며, 현재 해커의 공격 수단은 다양하고 끊임없이 진화하고 있습니다. "도는 높이, 마귀는 높이"라는 말처럼, 당신이 생각하지 못하는 것들은 해커가 생각하지 못하는 것이 없습니다. 지갑 사용의 안전 문제는 결코 간과할 수 없습니다.
이번 내용은 여기까지입니다. 더 많은 기사는 화리화외 홈페이지를 통해 확인할 수 있습니다.
면책 조항: 위의 내용은 개인적인 관점과 분석일 뿐이며, 학습 기록 및 교류 용도로만 사용됩니다. 암호화 분야는 매우 높은 위험 시장이며, 많은 프로젝트가 언제든지 제로가 될 위험이 있으므로, 합리적으로 바라보고 스스로 책임져야 합니다.