Security

帶還原的 Dos

  • January 8, 2021

當我閱讀智能合約安全指南(由consensys 提供)時,我發現了這一點:

// INSECURE
contract Auction {
   address currentLeader;
   uint highestBid;

   function bid() payable {
       require(msg.value > highestBid);

       require(currentLeader.send(highestBid)); // Refund the old leader, if it fails then revert

       currentLeader = msg.sender;
       highestBid = msg.value;
   }
}

這裡的漏洞(引自指南):

當它嘗試給舊的領導者退款時,如果退款失敗,它會恢復。這意味著惡意競標者可以成為領導者,同時確保向其地址的任何退款將始終失敗。通過這種方式,他們可以阻止其他任何人呼叫 bid() 函式,並永遠保持領先地位。

某人如何使所有傳入交易(退款)到他們的地址失敗?如果是契約,我猜答案是revertfallback函式內部。在簡單地址的情況下,有人怎麼能做到呢?我在問,因為它真的讓我大吃一驚,因為我以前從未聽說過這個(因為我猜這有點毫無意義)。

乾杯!

地址也可以是另一個合約,當拍賣試圖向它發送資金時執行。另一個合約可以執行非法指令或用盡所有 gas 以使退款交易失敗。

據我所知,向賬戶地址發送資金不會失敗(至少在發件人有足夠資金的情況下)。

只是在正確的現有答案之後添加更多資訊。只要您提供足夠的氣體,我就沒有辦法讓 EOA(外部擁有地址)的交易失敗。

當您將 Ether 發送到一個地址時,您可能不知道它是合約地址還是 EOA。或者,也許它是一個全新的地址,但(還)都不是。

如果您將 Ether 發送到未使用的地址,則交易不會失敗,但仍會保留在該地址中。之後,有人甚至可以創建一個使用該地址並具有備份恢復功能的合約,但乙太坊已經在該地址中,因此無法恢復。這是將 Ether 發送到合約中的一種方法,該合約沒有拒絕 Ether 的選項。

引用自:https://ethereum.stackexchange.com/questions/42638