SecurityInsider
Le blog des experts sécurité Wavestone

Ethereum x DAO : retours sur l’attaque de juin 2016


Introduction

Ethereum est une plateforme décentralisée reposant sur le principe de la blockchain. La
crypto-monnaie associée a pour nom Ether (symbole ETH), et comme sous-unité le Wei, Szabo et le Finney.
Les transactions validées par Ethereum sont effectuées entre deux types de comptes :
  • Des comptes classiques
  • Des comptes spécifiques appelés smart contracts
Un smart contract est un compte auquel est associé un code écrit dans un langage de programmation, le plus utilisé étant Solidity. À la différence du compte standard, bien que le smart contract ait la possibilité d’émettre des transactions en Ether vers d’autres comptes, ces transactions ne sont créées qu’en réponse à un virement initialement reçu par un autre compte standard ou smart contract.
Le smart contract peut ainsi être perçu comme un bot émettant des transactions en réponse à d’autres transactions reçues.

Des organisations, labellisées DAO(1), sont construites autour de l’utilisation de ces smart contracts. The DAO, victime de l’attaque du 17 juin, est l’une de ces DAO, utilisant un smart contract pour gérer des fonds d’investissement  pour différents projets. Les détenteurs investissent dans le fond et en retour reçoivent des tokens DAO correspondant à un nombre de voix proportionnels au nombre de tokens possédés. Ces voix sont utilisées lors de votes permettant au smart contract de répartir l’investissement entre les projets lors de propositions de splits et de verser les dividendes aux investisseurs.

Mécanisme de l’attaque

La personne à l’origine de cette attaque a découvert une vulnérabilité dans le code source du smart contract de The DAO. En cas de désaccord d’un certain nombre de détenteurs de tokens DAO, une proposition de séparation (split proposal) du DAO initial et de création d’un nouveau DAO peut être soumise à un vote. La fonction splitDAO est au cœur de ce mécanisme et assure qu’une fois que le vote est passé, les personnes se séparant du DAO initial récupèrent leur part.

L’attaquant a été en mesure de trouver une vulnérabilité au sein de cette même fonction, lui permettant de compromettre le fonctionnement standard d’un split proposal.
Ci-dessous un extrait de la fonction splitDAO, incluant la section vulnérable :
function splitDAO(uint _proposalID, address _newCurator)
  noEther onlyTokenholders returns (bool _success) {
    ...
    // Move tokens
    if(p.splitData[0].newDAO.createTokenProxy.value(fundsToBeMoved)
(msg.sender) == false)
    throw;
    ...
    // Reward attribution
    Transfer(msg.sender, 0, balances[msg.sender]);
    withdrawRewardFor(msg.sender); // be nice, and get his rewards
    ...
    // Set balance to 0
    balances[msg.sender] = 0; paidOut[msg.sender] = 0;
}

Cette fonction appelle la fonction withdrawRewardFor, qui elle-même appelle la fonction payOut, dont voici le code :
function
 payOut(address _recipient, uint _amount) returns (bool) {
 
    if (msg.sender != owner || msg.value > 0 || (payOwnerOnly && _recipient != owner))
    throw;
    if (_recipient.call.value(_amount)()) { 
      PayOut(_recipient, _amount);
      return true;
    } else {
      return false;
    }
}

Le paramètre _recipient étant contrôlé dès l’input de la fonction splitDAO, à savoir lors de l’émission de la proposition de split, l’attaquant peut utiliser l’appel _recipient.call.value() pour exécuter la fonction de son choix.
Dans le cas de l’attaque de The DAO, l’attaquant a choisi de rediriger le flux d’exécution vers un nouvel appel à la fonction splitDAO, provoquant une boucle d’appels imbriqués. Chaque appel provoque un versement des récompenses pour l’attaquant, sans une seule fois débiter son propre compte.

Le montant total de la fraude est estimé à 3.6 millions ETH, sur un total de 12 millions disponibles pour The DAO, actuellement évalués à 50 millions de dollars. Cette somme a cependant dû être versé des comptes de type DAO enfant, et est bloquée pendant 27 jours avant réinvestissement ou conversion en monnaie réelle. Il s’agit d’un mécanisme mis en palce dans The Dao préalablement à l’attaque.

Solutions envisagées

Une fois la fraude découverte, le code du smart contract étant toujours vulnérable, un groupe d’utilisateurs d’Ethereum en partie anonyme a décidé d’employer la même attaque pour sécuriser 7.2 millions des 8.4 millions ETH restant, en attendant la résolution complète du problème.
Bien que localisée dans le code de The DAO, la vulnérabilité présentée ici a eu un impact non négligeable sur l’Ether et donc la blockchain elle-même (baisse de 50% de la valeur de l’Ether).
Deux choix ont été pour l’instant présentés aux utilisateurs d’Ethereum pour contrer cette fraude :

Soft fork

Le soft fork consiste en une modification mineure du programme exécuté par la communauté Ethereum. Il s’agirait de rajouter un commutateur optionnel
--illegal-hashes, dont le rôle serait d’ignorer les transactions placées en liste noire.
Le but de ce fork serait de prévenir le retrait d’Ether depuis n’importe quel DAO afin de geler la situation, et ce en attendant qu’une solution permettant de recouvrir les fonds dérobés soit mise en place. Cette action permet de gagner du temps mais ne résout pas fondamentalement le problème.

Hard fork

Le hard fork est une solution qui apporte des modifications au protocole Ethereum. Ce fork aurait pour vocation, dans un premier temps, de récupérer la somme dérobée depuis les comptes contrôlés par l’attaquant afin de la réattribuer au DAO initial. Dans un second temps, le contrat du DAO initial serait modifié afin de permettre un retrait équitable  des fonds versés par les possesseurs de tokens DAO. Mais cette action remet en cause le principe d’inviolabilité de la blockchain et du fonctionnement des « smart contract » censés être autonomes et gérés sans intervention humaine.

Dans les deux cas, l’adoption de la solution proposée reste au choix de l’utilisateur. Les utilisateurs en majorité définiront la blockchain Ethereum nominale, tandis que les personnes en minorité ayant décidé de ne pas prendre cette décision, créent alors un cluster parallèle.

Conclusion

Le lendemain de la fraude, l’attaquant a rédigé une lettre ouverte sur Pastebin(2), adressée aux communautés DAO et Ethereum, dans laquelle il détaille les impacts néfastes d’une action sur la blockchain suite à son exploitation de la vulnérabilité. Des arguments sur l’aspect légal de sa propre action sont également avancés, citant les conditions générales de The DAO : « code is law ».
Selon lui, toute intervention de la communauté, même sur une décision démocratique, endommagera la confiance dans Ethereum, et de manière plus générale dans les systèmes de type blockchain.
L’attaque portée contre le smart contract de The DAO met en lumière les impacts considérables de la confiance en un code écrit par une tierce partie. En acceptant des smart contracts, Ethereum expose sa propre crypto-monnaie aux retombées des actions portées sur les DAO.
L’exploitation de cette vulnérabilité a conduit à une fraude de plus de 50 millions de dollars et il semblerait qu’Ethereum, à tort tenu pour responsable, soit désormais en charge de la gestion
post-crise.

(1) Decentralized Autonomous Organizations
(2) http://pastebin.com/CcGUBgDG

Sources :
https://blog.ethereum.org/2016/06/17/critical-update-re-dao-vulnerability/
http://www.bortzmeyer.org/the-dao-ethereum-et-une-attaque.html
https://blog.ethcore.io/attack-on-thedao-what-will-be-your-response/
https://blog.ethcore.io/our-dao-response-2/
http://www.coindesk.com/will-ethereum-hard-fork/
Jean MARSAULT

1 commentaire:

  1. D'où l'intérêt des langages de programmation fonctionnelle seuls capable de limiter ce genre de problème (typage fort, complétude du pattern matching, etc. type Haskell ou OCaml)

    RépondreSupprimer