
原作者: リサ&コング
最近、eth_sign 署名に関するフィッシング事件が多数見つかりました。
フィッシングサイト1:https://moonbirds-exclusive.com/
ウォレットを接続して「Claim」をクリックすると、署名申請ボックスがポップアップ表示され、同時に MetaMask は赤い警告を表示しましたが、このポップアップウィンドウからは何に署名が必要なのかを知ることはできませんでした。
実際、これは非常に危険なタイプの署名であり、基本的にはイーサリアムの「白紙小切手」です。このフィッシングでは、詐欺師はあなたの秘密キーを使用してあらゆるトランザクションに署名することができます。
さらに、別の種類のフィッシングもあります。上記の署名を拒否すると、MetaMask に別の署名ボックスが自動的に表示され、注意を払っていない間に署名が騙されます。そして、署名の内容を見ると、SetApprovalForAll メソッドが使用されており、承認済みアセットのターゲットがすべての NFT として表示されます。つまり、一度署名すると、詐欺師は制限なくすべての NFT を盗むことができます。次のように:
フィッシングサイト2: https://dooooodles.org/
MistTrack を使用して詐欺アドレスを分析します。
0xa594f48e80ffc8240f2f28d375fe4ca5379babc7
分析により、詐欺師は SetApprovalForAll を複数回呼び出してユーザー資産を盗み、詐欺師のアドレスは 33 個の NFT を受け取り、その一部を売却した後、4 ETH 以上を取得しました。
話は戻りますが、この釣り方を勉強しましょう。まず、MetaMask が公式にどのように説明しているかを見てみましょう。
つまり、MetaMask には現在 6 つの署名メソッド (personal_sign など) があり、MetaMask 警告が発生するのは 1 つのメソッドだけです。これは、eth_sign 署名の場合に発生します。これは、eth_sign メソッドがオープンな署名メソッドであり、あらゆるハッシュ署名が許可されているためです。これは、トランザクションやその他のデータに署名するために使用される可能性があり、危険なフィッシングのリスクを引き起こす可能性があることを意味します。
MetaMask の公式ドキュメントによると、eth_sign メソッドは任意のハッシュに署名でき、トランザクションに署名するときは基本的にハッシュの文字列に署名することになりますが、途中のエンコード プロセスは MetaMask によって処理されます。コーディングからトランザクション ブロードキャストまでのプロセスを簡単に説明します。
トランザクションをブロードキャストする前に、MetaMask は転送のオブジェクト (to)、転送量 (value)、付随するデータ (data)、および MetaMask が自動的に取得して計算する nonce、gasPrice、gasLimit パラメータを取得します。 RLP エンコードを実行して、Raw トランザクション コンテンツ (rawTransaction) を取得します。契約通話の場合、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 の値を取得し、これら 3 つの値を使用して 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 は、このフィッシング Web サイトがユーザーに悪意のあるアドレスへの NFT を許可するよう誘導していることを示しています。
要約する
要約する
元のリンク