Uma série de desafios para aprender segurança ofensiva de contratos inteligentes na Ethereum. Inclui flash loans, oráculos de preços, governança, NFTs, lending pools, carteiras baseadas em smart contracts, timelocks, e mais!
Os desafios foram elaborados por @tinchoabbate e postados originalmente em damnvulnerabledefi.xyz, todos os direitos pertencem ao criador. As soluções apresentadas foram elaboradas por @izcoser, desenvolvedor blockchain Venturus.
Na branch main
:
- Clone este repositório.
- Instale as dependências:
yarn install
. - Programe sua solução no teste de cada desafio. Você deve ser, exclusivamente, a conta
player
. - Para verificar se sua solução passou:
yarn run hardhat test <arquivo de teste>
.
Nota: em alguns desafios, será necessário programar seus próprios contratos de ataque.
Para ver as soluções e explicações, troque para a branch solutions
.
Há um cofre tokenizado com um milhão de tokens DVT. O cofre oferece flash loans de graça, até que o período carência termine. Para passar no desafio, faça com que o cofre pare de oferecer flash loans. Você começa com 10 tokens DVT em saldo.
Existe uma pool com 1000 ETH em saldo, oferecendo flash loans. Elas tem uma taxa fixa de 1 ETH. Um usuário criou um contrato com 10 ETH em saldo. Ele é capaz de interagir com a pool e receber flash loans em ETH. Tome todo o ETH do contrato do usuário, se possível em uma única transação.
Mais e mais lending pools estão oferecendo flash loans. Nesse caso, uma nova pool está oferecendo flash loans de tokens DVT de graça.
A pool possui 1 milhão de tokens DVT. Você não possui nada. Para passar neste desafio, tome todos os tokens da pool. Se possível em uma única transação.
Uma pool surpreendentemente simples permite que qualquer pessoa deposite ETH e o resgate a qualquer momento. Ela possui 1000 ETH em saldo e está oferecendo flash loans usando o ETH depositado para promover seu sistema. Iniciando com 1 ETH em saldo, passe o desafio tomando todo o ETH da pool.
Existe uma pool oferecendo benefícios em tokens a cada 5 dias para aqueles que depositam DVT nela.
Alice, Bob, Charlie e David já depositaram alguns DVTs e ganharam seus benefícios.
Você não possui nem um DVT. Mas no próximo round, você deve resgatar todos os benefícios para si mesmo.
Por falar nisso, há rumores que uma nova pool foi lançada e ela está oferecendo flash loans de DVT.
Uma nova lending pool foi lançada. Ela está oferecendo flash loans de tokens DVT. Inclui até um elaborado mecanismo de governança para controlá-la.
O que poderia dar errado, né?
Você começa com 0 tokens DVT e a pool possui 1.5 milhões de tokens. Seu objetivo é obter todos eles.
Investigando o web service de um dos mais populares projetos DeFi do ecossistema, você encontra uma resposta estranha do seu servidor:
HTTP/2 200 OK
content-type: text/html
content-language: en
vary: Accept-Encoding
server: cloudflare
4d 48 68 6a 4e 6a 63 34 5a 57 59 78 59 57 45 30 4e 54 5a 6b 59 54 59 31 59 7a 5a 6d 59 7a 55 34 4e 6a 46 6b 4e 44 51 34 4f 54 4a 6a 5a 47 5a 68 59 7a 42 6a 4e 6d 4d 34 59 7a 49 31 4e 6a 42 69 5a 6a 42 6a 4f 57 5a 69 59 32 52 68 5a 54 4a 6d 4e 44 63 7a 4e 57 45 35
4d 48 67 79 4d 44 67 79 4e 44 4a 6a 4e 44 42 68 59 32 52 6d 59 54 6c 6c 5a 44 67 34 4f 57 55 32 4f 44 56 6a 4d 6a 4d 31 4e 44 64 68 59 32 4a 6c 5a 44 6c 69 5a 57 5a 6a 4e 6a 41 7a 4e 7a 46 6c 4f 54 67 33 4e 57 5a 69 59 32 51 33 4d 7a 59 7a 4e 44 42 69 59 6a 51 34
Uma corretora on-chain, relacionada a este projeto, está vendendo colecionáveis (absurdamente caros) chamados "DVNFT", a um preço de 999 ETH cada.
O preço é obtido a partir de um oráculo on-chain, baseado em 3 reportadores confiáveis: 0xA732...A105,0xe924...9D15 and 0x81A5...850c.
Iniciando com somente 0.1 ETH, passe o desafio obtendo todo o ETH disponível na corretora.
Existe uma lending pool onde usuários podem pegar empréstimos de Damn Valuable Tokens (DVTs). Para isso, eles precisam, antes, depositar o dobro do valor em ETH como colateral. A pool atualmente possui 100000 DVTs em liquidez.
Existe um mercado de DVT aberto em uma antiga corretora Uniswap V1, atualmente com 10 ETH e 10 DVT em liquidez.
Passe o desafio obtendo todos os tokens da lending pool. Você começa com 25 ETH e 1000 DVTs em saldo.
Os desenvolvedores a pool anterior parecem ter aprendido com o erro. E lançaram uma nova versão. Agora eles estão usando a corretora Uniswap V2 como oráculo, assim como as bibliotecas de utilidade recomendadas. Isso deve ser o suficiente.
Você começa com 20 ETH e 10000 DVT em saldo. A pool possui um milhão de DVT em saldo. Você sabe o que fazer.
Um novo marketplace de Damn Valuable NFTs foi lançado. Ocorreu um mint inicial de 6 NFTs, as quais estão disponíveis para venda no marketplace. Cada uma custa 15 ETH.
Os desenvolvedores foram alertados de que o marketplace está vulnerável. Todos os tokens podem ser tomados. No entanto, eles não fazem ideia de como fazê-lo. Então, eles estão oferecendo uma recompensa de 45 ETH para qualquer um que consiga retirar as NFTs e mandá-las para eles.
Você concordou em ajudar. Porém, você só possui 0.1 ETH em saldo. Os desenvolvedores não respondem às suas mensagens.
Se apenas você pudesse conseguir um pouco de ETH de graça, pelo menos por um instante.
Para incentivar a criação de carteiras mais seguras no time, alguém criou um cartório de carteiras Gnosis Safe. Quando alguém no time cria uma carteira e a registra no cartório, ela ganha 10 DVTs.
Para garantir que tudo está seguro, o cartório integra-se firmemente com o legítimo Gnosis Safe Proxy Factory, e possui checagens adicionais de segurança.
Atualmente, existem 4 pessoas registradas como beneficiários. Alice, Bob, Charlie e David. O cartório possui 40 DVTs em saldo para distribuir entre eles.
Seu objetivo é obter todos os fundos do cartório. Em uma única transação.
Veja os contratos Complete o desafio Resolva o desafio
Existe um contrato de cofre seguro guardando 10 milhões de tokens DVT. O cofre é upgradeable, seguindo o UUPS pattern.
O dono do cofre, atualmente um timelock contract, pode resgatar uma quantidade limitada de tokens a cada 15 dias.
No cofre, existe um papel adicional com poderes para resgatar todos os tokens em caso de emergência.
No timelock, somente a conta com o papel "Proposer" pode agendar ações, as quais podem ser executadas uma hora após o agendamento.
Para passar esse desafio, obtenha todos os tokens do cofre.
Existe um contrato que incentiva usuários a criarem carteiras Gnosis Safe, recompensando-os com 1 DVT. Ele integra com um mecanismo upgradeable de autorização. Isso garante que somente deployers permitidos (a.k.a wards) são pagos por deployments específicos. Lembre-se, partes desse sistema foram altamente otimizadas por gurus do Crypto Twitter.
O deployer contract funciona somente com a Gnosis Safe factory oficial no endereço 0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B e a master copy correspondente no endereço 0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F. Não sei como deve funcionar, afinal estes contratos ainda nem foram criados nesta rede.
Enquanto isso, parece que alguém já transferiu 20 milhões de tokens DVT para 0x9b6fb606a9f5789444c17768c6dfcf2f83563801. Esse endereço foi atribuído como um ward no contrato de autorização. O que é estranho, pois esse endereço também está vazio.
Passe o desafio obtendo todos os tokens controlados pelo contrato wallet deployer. Ah, e os 20 milhões de DVT também.
Mesmo em um bear market, os desenvolvedores da Puppet continuam construindo.
Na última versão, eles estão usando a Uniswap V3 como um oráculo. Isso mesmo, não usam mais preços spot. Dessa vez, a pool verifica o preço do ativo usando uma média ponderada ao longo do tempo, usando as bibliotecas recomendadas.
A corretora Uniswap possui 100 WETH e 100 DVT em liquidez. A lending pool tem um milhão de tokens DVT.
Iniciando com 1 ETH e alguns DVT, passe esse desafio tomando todos os tokens da lending pool.
NOTA: ao contrário dos outros, este desafio requer conexão a uma URL de RPC válida no arquivo de teste do desafio para realizar um fork do estado da mainnet no ambiente local.
Existe um cofre permissionado com um milhão de tokens DVT. O cofre permite resgate de fundos periodicamente, assim como o resgate de todos os fundos em caso de emergência.
O contrato possui um esquema de autorização integrado, permitindo somente que contas conhecidas executem ações específicas.
O time de desenvolvimento recebeu um alerta de que todos os fundos podem ser roubados.
Antes que seja tarde, resgate os fundos do cofre e transfira para a conta de recuperação.
Todo o código Solidity, práticas e patterns neste repositório estão vulneráveis e são somente para propósitos educacionais. Não use em produção.