슬로우 미스트: 백지 수표 eth_sign 피싱 분석
慢雾科技
2022-10-11 03:30
本文约2468字,阅读全文需要约10分钟
"당신"의 클릭, "나"의 NFT.

원작자: Lisa & Kong

최근 eth_sign 서명에 대한 많은 피싱 사건을 발견했습니다.

피싱 웹사이트 1: https://moonbirds-exclusive.com/

지갑을 연결하고 청구를 클릭하면 서명 신청 상자가 팝업되고 동시에 MetaMask에 빨간색 경고가 표시되며 이 팝업 창에서는 서명이 필요한 항목을 알 수 없습니다.

사실 이것은 기본적으로 이더리움의 "백지 수표"인 매우 위험한 유형의 서명입니다. 이 피싱을 통해 사기꾼은 개인 키를 사용하여 거래에 서명할 수 있습니다.

또한 다른 종류의 피싱이 있습니다. 위의 서명을 거부하면 메타마스크에 다른 서명 상자가 자동으로 표시되고 주의를 기울이지 않는 동안 서명을 속입니다. 그리고 서명 내용을 보면 SetApprovalForAll 메서드가 사용되며 승인된 자산의 대상이 All of your NFT로 표시됩니다. 즉, 일단 서명하면 사기꾼이 제한 없이 모든 NFT를 훔칠 수 있습니다. 다음과 같이:

피싱 사이트 2: https://doooooodles.org/

당사는 MistTrack을 사용하여 사기 주소를 분석합니다.

0xa594f48e80ffc8240f2f28d375fe4ca5379babc7

분석 결과, 사기꾼은 SetApprovalForAll을 수차례 호출하여 사용자 자산을 훔쳤고, 사기꾼의 주소는 33개의 NFT를 받았고, 일부를 판매한 후 4ETH 이상을 얻었습니다.

주제로 돌아가서 이 낚시 방법을 연구해 봅시다. 먼저 MetaMask가 공식적으로 설명하는 방법을 살펴보겠습니다.

즉, MetaMask에는 현재 6개의 서명 방법(예: personal_sign)이 있으며 eth_sign 서명의 경우 발생하는 MetaMask 경고는 eth_sign 방법이 모든 해시 서명을 허용하는 개방형 서명 방법이기 때문에 한 가지 방법에서만 메타마스크 경고가 발생합니다. 거래 또는 기타 데이터에 서명하는 데 사용될 수 있으므로 위험한 피싱 위험이 있습니다.

공식 MetaMask 문서에 따르면 eth_sign 메서드는 모든 해시에 서명할 수 있으며 트랜잭션에 서명할 때 본질적으로 해시 문자열에 서명하지만 중간의 인코딩 프로세스는 MetaMask에서 처리합니다. 코딩에서 트랜잭션 브로드캐스팅까지의 프로세스를 간략하게 검토할 수 있습니다.

트랜잭션을 방송하기 전에 MetaMask는 전송 대상(대상), 전송 금액(가치), 수반되는 데이터(데이터) 및 MetaMask가 자동으로 얻고 계산하는 nonce, gasPrice 및 gasLimit 매개 변수를 얻습니다. 원시 트랜잭션 콘텐츠(rawTransaction)를 얻기 위해 RLP 인코딩을 수행합니다. 계약 호출인 경우 to는 계약 주소이고 data는 호출 데이터입니다.

rlp = require('rlp');

// Use non-EIP115 standard

const transaction = {

nonce: '',

gasPrice: '',

gasLimit: '',

to: '0x',

value: '',

data: '0x'

};

// RLP encode

const rawTransaction = rlp.encode([transaction.nonce, transaction.gasPrice, transaction.gasLimit, transaction.to, transaction.value, transaction.data]);

그런 다음 이 콘텐츠에 대해 keccak256 해시를 수행하여 서명해야 하는 데이터인 bytes32 데이터 문자열을 가져옵니다.

// keccak256 encode

const msgHex = rawTransaction.toString('hex');

const msgHash = Web3.utils.keccak256('0x'+ msgHex);

MetaMask를 사용하여 이 데이터 문자열에 서명한 후 r, s, v 값을 얻은 다음 이 세 값을 사용하여 nonce/gasPrice/gasLimit/to/value/data로 RLP 인코딩을 수행하여 서명된 원본을 얻습니다. 트랜잭션 내용 이제 이 시점에서 트랜잭션을 브로드캐스트할 수 있습니다.

rlp = require('rlp');

const transaction = {

nonce: '',

gasPrice: '',

gasLimit: '',

to: '',

value: '',

data: '',

v: '',

r: '',

s: ''

};

// RLP encode

const signedRawTransaction = rlp.encode([transaction.nonce, transaction.gasPrice, transaction.gasLimit, transaction.to, transaction.value, transaction.data, transaction.v, transaction.r, transaction.s]);

위에서 언급했듯이 eth_sign 메서드는 모든 해시에 서명할 수 있으므로 서명된 bytes32 데이터에 서명하는 것이 자연스럽습니다. 따라서 공격자는 DApp에 연결한 후 계정을 분석하고 쿼리하기 위해 주소를 얻은 다음 eth_sign을 통해 서명할 데이터(예: 기본 토큰 전송, 계약 호출)를 구성하기만 하면 됩니다.

이 피싱 방법은 사용자에게 매우 혼란스러울 것입니다.MetaMask는 과거에 우리가 접한 인증된 피싱에 대해 공격자가 서명하기를 원하는 데이터를 직관적으로 표시합니다. 아래와 같이 MetaMask는 이 피싱 웹사이트가 사용자가 악성 주소에 대한 NFT를 인증하도록 유도하고 있음을 보여줍니다.

요약하다

요약하다

원본 링크

원본 링크

慢雾科技
作者文库