From fab03398dda7e768b1b620c07bf82cbfed662fa8 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 12 Feb 2018 13:19:43 +0300 Subject: [PATCH] disable internal memory (#7842) --- ethcore/wasm/src/parser.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ethcore/wasm/src/parser.rs b/ethcore/wasm/src/parser.rs index f705bf131..13e055529 100644 --- a/ethcore/wasm/src/parser.rs +++ b/ethcore/wasm/src/parser.rs @@ -56,12 +56,20 @@ pub fn payload<'a>(params: &'a vm::ActionParams, schedule: &vm::Schedule) }, }; - let contract_module = wasm_utils::inject_gas_counter( - elements::Module::deserialize( + let deserialized_module = elements::Module::deserialize( &mut cursor ).map_err(|err| { vm::Error::Wasm(format!("Error deserializing contract code ({:?})", err)) - })?, + })?; + + if deserialized_module.memory_section().map_or(false, |ms| ms.entries().len() > 0) { + // According to WebAssembly spec, internal memory is hidden from embedder and should not + // be interacted with. So we disable this kind of modules at decoding level. + return Err(vm::Error::Wasm(format!("Malformed wasm module: internal memory"))); + } + + let contract_module = wasm_utils::inject_gas_counter( + deserialized_module, &gas_rules(schedule), );