// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/*
Let's say Alice can see the code of Foo and Bar but not Mal.
It is obvious to Alice that Foo.callBar() executes the code inside Bar.log().
However Eve deploys Foo with the address of Mal, so that calling Foo.callBar()
will actually execute the code at Mal.
*/
/*
1. Eve deploys Mal
2. Eve deploys Foo with the address of Mal
3. Alice calls Foo.callBar() after reading the code and judging that it is
safe to call.
4. Although Alice expected Bar.log() to be execute, Mal.log() was executed.
*/
contract Foo {
Bar bar;
constructor(address _bar) {
bar = Bar(_bar);
}
function callBar() public {
bar.log();
}
}
contract Bar {
event Log(string message);
function log() public {
emit Log("Bar was called");
}
}
// This code is hidden in a separate file
contract Mal {
event Log(string message);
// function () external {
// emit Log("Mal was called");
// }
// Actually we can execute the same exploit even if this function does
// not exist by using the fallback
function log() public {
emit Log("Mal was called");
}
}
In the given example, three contracts are introduced: Foo
, Bar
, and Mal
. The Foo
contract interacts with the Bar
contract under the assumption that the function callBar()
will execute the code inside Bar
’s log()
function. However, an attacker (Eve) can deploy the Mal
contract and provide its address to Foo
, effectively causing callBar()
to execute the code within Mal
instead of Bar
.
From the above contracts i didn't understand what will happens under the hood if we deploy some other contract(Foo) at the address of other contract(Mal).Explain what happens under the hood or provide any links to understand better.