Attackathon _ Fuel Network 32872 - [Smart Contract - High] Incorrect load_store_to_memcopy optimizat
Description
Brief/Intro
Vulnerability Details
fn is_clobbered(
context: &Context,
store_block: Block,
store_val: Value,
load_val: Value,
src_ptr: Value,
) -> bool {
let mut iter = store_block
.instruction_iter(context)
.rev()
.skip_while(|i| i != &store_val);
assert!(iter.next().unwrap() == store_val);
let src_symbols = get_gep_referred_symbols(context, src_ptr);
// Scan backwards till we encounter load_val, checking if
// any store aliases with src_ptr.
let mut worklist: Vec<(Block, Box<dyn Iterator<Item = Value>>)> =
vec![(store_block, Box::new(iter))];
let mut visited = FxHashSet::default();
'next_job: while let Some((block, iter)) = worklist.pop() {
visited.insert(block);
for inst in iter {
if inst == load_val || inst == store_val {
// We don't need to go beyond either the source load or the candidate store.
continue 'next_job;
}
if let Some(Instruction {
op:
InstOp::Store {
dst_val_ptr,
stored_val: _,
},
..
}) = inst.get_instruction(context)
{
if get_gep_referred_symbols(context, *dst_val_ptr)
.iter()
.any(|sym| src_symbols.contains(sym))
{
return true;
}
}
}
for pred in block.pred_iter(context) {
if !visited.contains(pred) {
worklist.push((
*pred,
Box::new(pred.instruction_iter(context).rev().skip_while(|_| false)),
));
}
}
}
false
}Impact Details
References
Proof of concept
Proof of Concept
PreviousAttackathon _ Fuel Network 32860 - [Blockchain_DLT - Insight] Resource Abuse CCP instruction is loadNextAttackathon _ Fuel Network 32884 - [Smart Contract - Medium] Compilerstd-lib storage collison betwee
Last updated
Was this helpful?