이더리움 청소 로봇이 맹위를 떨치고 있는데, 사용자들은 유출된 주소의 자금을 어떻게 구할 수 있을까요?
이 글은 바비트 정보에 게시되었으며, 저자: Harry Denley, 번역:洒脱喜입니다.
당신은 이더리움 자금을 전송한 후 지갑의 돈이 즉시 사라진 경험이 있습니까? 당신은 청소기(sweeper)의 표적이 되었을 수 있습니다. 이 글은 이 문제를 해결하는 데 도움을 주기 위해 작성되었으며, 원작자는 MyCrypto의 보안 및 피싱 방지 엔지니어인 Harry Denley입니다.
당신의 비밀이 유출되면, 악의적인 측은 일반적으로 당신의 계정에 청소기(sweeper)를 설정하여, 해당 주소에서 발생하는 모든 일을 이용하려고 합니다. 예를 들어, 사용자가 ETH를 입금하여 일부 토큰을 인출하려고 하거나 에어드롭 또는 기타 상황이 발생할 때입니다.
이 글에서는 사용자의 자금이 어떻게 청소되는지, 그리고 청소되지 않은 자금을 구하기 위한 세 가지 독특한 방법을 개요합니다(예: 스테이킹 자금).
사용자가 피싱당하는 방법
최근 우리는 많은 사용자가 텔레그램 그룹 관리자를 사칭하는 것을 보았습니다. 이 가짜 관리자들은 주 채널에서 도움을 요청하는 사용자에게 도움을 제공합니다(그들은 진짜 관리자가 아니며, 관리자 프로필 정보를 복사했지만 사용자 이름에 약간의 차이가 있습니다). 이 사칭자들은 종종 많은 전문 용어를 사용하여 사용자를 혼란스럽게 하고, 한눈에 합법적으로 보이는 웹사이트 링크를 공유하지만, 결국 당신에게 니모닉 또는 개인 키를 입력하라고 요구합니다.
그런 다음, 당신의 암호 자산은 사라지고, 그 위에 청소기가 있습니다.
다음은 이러한 가짜 웹사이트 중 하나의 예입니다:
청소기의 작동 방식
청소기는 블록체인을 모니터링하는 코드(기술적으로 txpool에서, 체인에 존재하지 않음)로, 특정 거래에 대해 프로그래밍된 규칙 세트를 기반으로 서명하는 반응을 인간보다 더 빠르게 수행합니다.
이는 당신이 블록체인 탐색기에서 주소를 확인하거나 dapp의 UI에 "연결"할 때 청소기(sweeper)는 보이지 않는다는 것을 의미합니다. 당신이 거래에 서명하고 네트워크에 방송한 후에만 청소기(sweeper)는 당신의 활동을 볼 수 있습니다.
시간이 지나면서 우리는 청소기(sweeper)와 그것을 이용하는 활동의 진화를 보았습니다.
청소기의 진화
2017년 동안 상당수의 활동이 잠금 기능이 있는 토큰(즉, transfer()를 성공적으로 호출할 수 없음)과 가격 피드를 포함한 토큰을 이용했습니다. Dave Appleton은 이러한 활동에 대한 글을 발표했습니다.
악의적인 측은 이 사기를 이용하는 방법으로, 그들은 개인 키를 이 주소에 게시하고(어떤 무고하거나 잘못된 방식으로) 사람들이 ETH를 해당 주소에 입금하기를 기다립니다(주소의 토큰을 전송하기 위해). 그런 다음 악의적인 측은 해당 계정의 청소기 프로그램을 사용하여 해당 주소에 입금된 ETH를 자신의 계정으로 빠르게 전송합니다. 이론적으로 잠금된 토큰은 가치가 없는 것으로 간주되므로, 그들은 무방비 상태의 "탐욕스러운" 사용자로부터 이익을 얻으려고 합니다.
현재 유출된 주소에는 기본적으로 ETH 청소기 프로그램이 배치되어 있으며, 일부 조직은 가격 피드를 기반으로 한 ERC20 토큰을 청소하기 위해 더 고급 청소기 프로그램 로직을 사용하고 있습니다.
올해 초, 나는 유출된 주소에 대해 일부 정찰 연구를 수행했으며, 청소기가 지속적으로 진화하고 있음을 발견했습니다:
- 청소기는 달러 가치가 가장 높은 자산을 선호하며, 이는 청소를 위해 더 많은 거래 수수료를 지불해야 함을 의미합니다.
- 청소기는 모든 사용 가능한 ETH를 사용하여 청소 가치를 극대화하며, nonce의 "승리" 거래 비율도 높습니다.
- 청소기는 스테이킹 토큰(즉: xKNCa=KNC)과 그 원래 토큰을 매칭하는 매칭 엔진을 가지고 있어, 가격 피드가 스테이킹 토큰에 반영됩니다.
- 청소기는 자체 내부 nonce 카운터를 가지고 있으며, 최고 nonce 랜덤 수가 특정 시간 범위 내에 확인되지 않거나 다른 거래에 의해 폐기/대체되지 않으면 정기적으로 nonce 랜덤 수를 eth.getTransactionCount() 출력으로 재설정합니다.
- 청소기가 겨냥하는 고가치 자산이 존재하는 경우, 일부 활동은 운영자가 자금을 통해 "희생"하여 고가치 자산을 빠르게 청소하려고 제안합니다.
- 달러 가치가 특정 임계값 이하인 경우, 일부 청소기는 자산을 청소하지 않으며, 이는 당신이 청소기에 표적이 되었는지 모를 수 있음을 의미하며, 이는 매우 무섭습니다.
청소기를 설명하는 글은 2017년에 처음 등장했으며, 지금 우리가 관찰하는 청소기는 더욱 진화하여, 운영자의 이익을 극대화하고 피해자에게 최대한의 손실을 초래하도록 설계되었습니다.
청소기를 이기는 방법은?
우선, 인간은 코드보다 빠를 수 없으므로, 우리의 해결책은 코딩을 포함해야 합니다. 당신은 몇 가지 다른 경로를 선택할 수 있으며, 이들은 100% 보장을 제공하지 않지만 우리에게 유리합니다.
당신은 구출하려는 토큰 목록을 우선순위에 따라 작성해야 하며, 이를 통해 당신의 계획을 쉽게 파악할 수 있습니다. 당신은 다음을 나열해야 합니다:
- 토큰 계약 주소;
- 토큰이 스테이킹되었는지(그리고 언스테이킹이 시간 잠금인지);
- 토큰이 전송 가능한지;
- 토큰 가치(달러 기준);
핵심은 당신이 이 작업을 체계적으로 수행하는 것이며, 이를 통해 빠르고 효율적으로 실행할 수 있습니다. 유명한 말처럼, "계획이 없으면 실패를 계획하는 것입니다."
TAICHI 사용하기
청소기의 작동 방식은 txpool에서 청소 주소로 전송되는 수신 거래를 모니터링하는 것이며, TAICHI는 당신이 서명된 거래를 직접 채굴자(SparkPool)에게 제출할 수 있게 해줍니다. 이는 공공 txpool을 통해 방송할 필요가 없으며, 청소기 프로그램은 보이지 않게 되고, 당신의 거래가 청소기 로봇에 의해 선점되지 않을 가능성이 높습니다(적어도 제 경험상 그렇습니다).
이미지는 TAICHI.NETWORK에서 가져왔습니다.
여기서의 방법은 모든 거래를 nonce 순서로 미리 서명하고 프로그래밍 방식으로 TAICHI에 제출하는 것입니다. 대부분의 청소기는 공공 txpool/mempool에서 수신되는 ETH 거래를 모니터링하며, 매 블록마다 eth_getBalance()를 호출하지 않기 때문에(CPU 주기 및 RPC 메서드 호출 비용을 절약하기 위해), 이는 전용 txpool을 통해 계정으로 전송된 ETH를 보지 못하게 하여 청소되지 않게 합니다.
이것은 당신이 약간의 수학 작업을 해야 하며, 수학 계산이 올바르게 수행되면 청소기 프로그램이 거래를 선점하려고 시도할 때 실패할 수 있습니다!(보통, 저는 gas 가격이 GasNow의 "빠른" 카테고리보다 몇 퍼센트 높다고 가정하므로, 채굴자가 다음 블록에서 당신의 거래를 확인할 가능성이 더 높습니다.)
당신은 MyCrypto를 오프라인으로 사용하여 서명된 거래를 생성하고 준비가 되면 TAICHI에 푸시하거나 ethers.js(또는 다른 라이브러리)를 사용하여 서명된 거래를 생성하는 코드를 만들 수 있습니다.
방법 2: 자가 파괴 스마트 계약 사용하기
TAICHI 방법을 사용하는 것처럼, 우리는 스마트 계약을 사용하여 ETH를 계정으로 전송할 수 있으며, 이는 공공 txpool에 표시되지 않습니다. 우리는 안전한 주소에서 스마트 계약을 배포한 다음, 구조적으로 ETH를 유출된 주소로 전송합니다(이는 내부 거래가 될 것입니다).
이 계약을 배포함으로써 우리는 생성자 함수 매개변수에 ETH와 유출된 주소 문자열을 보낼 수 있습니다. 이 계약은 동일한 거래에서 계약을 생성하고 자가 파괴하여 작동합니다. selfdestruct()를 사용하면 블록체인 상태를 지우게 되며(일회용 계약이기 때문에), 한 거래에서 ETH를 유출된 주소로 전송합니다. (예시)
이 방법은 효과적이지만, 추가 비용이 발생합니다. 왜냐하면 우리가 수행해야 할 작업은 단순히 ETH를 한 계정에서 다른 계정으로 전송하는 것이 아니기 때문입니다. 이 방법의 비용은 약 70,000 gas이며, 높은 gas 가격 상황에서는 이 방법의 수수료 비용이 0.0112ETH에 이를 수 있습니다.
방법 3: Flashbots 사용하기
일반적으로 우리는 거래가 확인되기 위해 ETH를 지불해야 합니다(거래 수수료는 송신자가 지불합니다). 그러나 Flashbots의 출현으로 인해 우리는 다른 계정의 자금을 "뇌물"로 사용하여 0 gas 가격(즉, 0 달러 거래 수수료)으로 거래를 확인할 수 있게 되었습니다. 이는 우리가 유출된 주소에서 토큰을 이동할 수 있게 해주며, ETH로 gas 비용을 지불할 필요가 없습니다. 맞습니다, 그렇게 간단합니다.
이 전략은 두 개의 계정을 필요로 합니다. 하나는 유출된 계정이고, 다른 하나는 채굴자에게 뇌물을 주는 계정입니다.
Flashbots 팀은 Flashbots / searcher-sponsored-tx라는 프로젝트를 발표했으며, 이는 두 개의 계정에서 거래를 확인하기 위한 기본 원리를 가지고 있습니다.
우리는 다른 계정으로 거래 수수료를 지불할 것이므로, 손상된 계정에 ETH를 입금할 필요가 없습니다.
유출된 계정에 ETH가 없도록 하기 위해, 우리는 강력히 Burner 로봇을 운영할 것을 권장합니다.
우리는 일반적으로 각 인스턴스에서 다른 RPC 노드를 사용하고, 두 대 이상의 컴퓨터에서 이 Burner 로봇을 운영할 것을 권장합니다. 예를 들어, Infura를 사용하여 로컬에서 Burner 로봇을 실행하고, 다른 제공업체(예: Quiknode)의 원격 서버에서 또 다른 Burner 로봇을 실행합니다. 이렇게 하면 높은 네트워크 지연이나 노드 문제(속도 제한, 동기화 문제)에 대비한 백업 계획이 생깁니다.
Flashbots/searcher-sponsored-tx의 코드는 특정 요구 사항에 맞게 수정해야 하지만, 이 엔진은 유출된 주소에서 토큰을 구출하는 데 도움을 줄 수 있습니다. 이 Flashbots 엔진은 단일 transfer() 호출 또는 unstake() 및 transfer() 호출을 지원할 만큼 충분히 유연합니다.
코드에 익숙하지 않다면, @kendricktan/flashbots.tools 웹사이트를 사용해 볼 수도 있습니다.