在这个特定的方案中,我们传递Attacker契约的地址( Victim.foo )。
通过使用委托代理,我们维护了msg.sender字段,但是我们使用的不是Storage的存储,而是Attacker的S。
Victim合同是否容易受到维护msg.sender字段的攻击(这里将是Victim的S地址)并使用Victim的存储?
contract Victim {
uint some;
function foo(address _contract) {
// ....
SomeInterface(_contract).changeStorage(10);
//....
}
}
contract Storage {
uint value;
function changeStorage(uint _value) {
require(msg.sender == victim);
value = _value;
}
}
contract Attacker {
function changeStorage(uint _value) {
bytes memory data = 0x.. //abi-encoded changeStorage with some value
execute(victim, data);
}
function execute(address _target, bytes memory _data) {
(bool success,) = _target.delegatecall(_data);
}
}发布于 2020-11-26 21:22:20
这就是我从代码和问题中了解到的:如果A调用B,而B委托C,那么C执行中的状态更改是否会影响A中的存储?
答案是否定的,但不是。因为受害者正在调用攻击者,攻击者的存储变成了操作的存储,受害者是msg.sender。然后,当攻击者将调用委托到Storage时,它将受害者保留为msg.sender,并保留作为攻击者操作的存储。
这里修改受害者中的存储的唯一方法是让受害者直接委托所有存储。
https://ethereum.stackexchange.com/questions/90525
复制相似问题