Hello Tadle,
The CapitalPool contract calls the approve function on the MaliciousToken contract.
The approve function of MaliciousToken is executed, which emits an event (AttackSuccessful) and then self-destructs, sending its balance to the spender (the tokenManager in the original approve function).
Deploy the MaliciousToken Contract: Deploy the MaliciousToken contract on the Ethereum network.
Deploy the CapitalPool Contract: Deploy the CapitalPool contract, ensuring it has the ability to call the approve function on other contracts.
Execute the Attack:
Call the approve function of CapitalPool with the address of the MaliciousToken contract as the tokenAddr.
Since the CapitalPool contract does not check what the approve function actually does, it will trigger the arbitrary code in MaliciousToken.
The MaliciousToken contract’s approve function is called.
The event AttackSuccessful is emitted, indicating that the attack was successful.
The selfdestruct function is executed, sending the balance of the MaliciousToken contract to the spender address (which is the tokenManager).
PoC
This is at most low severity, even though giving max approvals shouldn't be permisionless, the respective tokenManager address is retrieved from the TadleFactory contract whereby the trusted guardian role is responsible for deploying such contracts as seen [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/factory/TadleFactory.sol#L68). Since the user still has to go through the PreMarkets/DeliveryPlace contracts to perform market actions, this max approval cannot be exploited.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.