From d6711ced93e3a82c6c285005a106fc63744b6259 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 30 Jan 2018 20:09:06 +0100 Subject: [PATCH] Actually check state root. Also refactor wasm exports to be stricter on invalid mem references. --- substrate/executor/src/wasm_executor.rs | 132 +++++++----------- .../polkadot/src/runtime/system.rs | 7 +- substrate/wasm-runtime/std/src/lib.rs | 13 +- .../release/runtime_polkadot.compact.wasm | Bin 64314 -> 64623 bytes .../release/runtime_polkadot.wasm | Bin 64363 -> 64672 bytes 5 files changed, 67 insertions(+), 85 deletions(-) diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 1039a20654..a741a7b07b 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -66,15 +66,15 @@ impl<'e, E: Externalities> FunctionExecutor<'e, E> { } trait WritePrimitive { - fn write_primitive(&self, offset: u32, t: T); + fn write_primitive(&self, offset: u32, t: T) -> ::std::result::Result<(), DummyUserError>; } impl WritePrimitive for MemoryInstance { - fn write_primitive(&self, offset: u32, t: u32) { + fn write_primitive(&self, offset: u32, t: u32) -> ::std::result::Result<(), DummyUserError> { use byteorder::{LittleEndian, ByteOrder}; let mut r = [0u8; 4]; LittleEndian::write_u32(&mut r, t); - let _ = self.set(offset, &r); + self.set(offset, &r).map_err(|_| DummyUserError) } } @@ -95,29 +95,29 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, println!("Runtime: {}", number); }, ext_memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 => { - if let (Ok(sl1), Ok(sl2)) - = (this.memory.get(s1, n as usize), this.memory.get(s2, n as usize)) { - match sl1.cmp(&sl2) { - Ordering::Greater => 1, - Ordering::Less => -1, - Ordering::Equal => 0, - } - } else { - return Err(DummyUserError.into()); + let sl1 = this.memory.get(s1, n as usize).map_err(|_| DummyUserError)?; + let sl2 = this.memory.get(s2, n as usize).map_err(|_| DummyUserError)?; + match sl1.cmp(&sl2) { + Ordering::Greater => 1, + Ordering::Less => -1, + Ordering::Equal => 0, } }, ext_memcpy(dest: *mut u8, src: *const u8, count: usize) -> *mut u8 => { - let _ = this.memory.copy_nonoverlapping(src as usize, dest as usize, count as usize); + this.memory.copy_nonoverlapping(src as usize, dest as usize, count as usize) + .map_err(|_| DummyUserError)?; println!("memcpy {} from {}, {} bytes", dest, src, count); dest }, ext_memmove(dest: *mut u8, src: *const u8, count: usize) -> *mut u8 => { - let _ = this.memory.copy(src as usize, dest as usize, count as usize); + this.memory.copy(src as usize, dest as usize, count as usize) + .map_err(|_| DummyUserError)?; println!("memmove {} from {}, {} bytes", dest, src, count); dest }, ext_memset(dest: *mut u8, val: u32, count: usize) -> *mut u8 => { - let _ = this.memory.clear(dest as usize, val as u8, count as usize); + this.memory.clear(dest as usize, val as u8, count as usize) + .map_err(|_| DummyUserError)?; println!("memset {} with {}, {} bytes", dest, val, count); dest }, @@ -136,90 +136,66 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, } }, ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8 => { - let (offset, written) = if let Ok(key) = this.memory.get(key_data, key_len as usize) { - if let Ok(value) = this.ext.storage(&key) { - let offset = this.heap.allocate(value.len() as u32) as u32; - let _ = this.memory.set(offset, &value); - (offset, value.len() as u32) - } else { (0, 0) } - } else { (0, 0) }; + let key = this.memory.get(key_data, key_len as usize).map_err(|_| DummyUserError)?; + let value = this.ext.storage(&key).map_err(|_| DummyUserError)?; - this.memory.write_primitive(written_out, written); - offset as u32 + let offset = this.heap.allocate(value.len() as u32) as u32; + this.memory.set(offset, &value).map_err(|_| DummyUserError)?; + + this.memory.write_primitive(written_out, value.len() as u32)?; + offset }, ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32 => { - if let Ok(key) = this.memory.get(key_data, key_len as usize) { - if let Ok(value) = this.ext.storage(&key) { - let value = &value[value_offset as usize..]; - let written = ::std::cmp::min(value_len as usize, value.len()); - let _ = this.memory.set(value_data, &value[..written]); - written as u32 - } else { 0 } - } else { 0 } + let key = this.memory.get(key_data, key_len as usize).map_err(|_| DummyUserError)?; + let value = this.ext.storage(&key).map_err(|_| DummyUserError)?; + let value = &value[value_offset as usize..]; + let written = ::std::cmp::min(value_len as usize, value.len()); + this.memory.set(value_data, &value[..written]).map_err(|_| DummyUserError)?; + written as u32 + }, + ext_storage_root(result: *mut u8) => { + let r = this.ext.storage_root(); + this.memory.set(result, &r[..]).map_err(|_| DummyUserError)?; }, ext_chain_id() -> u64 => { this.ext.chain_id() }, ext_twox_128(data: *const u8, len: u32, out: *mut u8) => { - let maybe_value = if len == 0 { - Ok(vec![]) + let result = if len == 0 { + twox_128(&[0u8; 0]) } else { - this.memory.get(data, len as usize) + twox_128(&this.memory.get(data, len as usize).map_err(|_| DummyUserError)?) }; - let result = if let Ok(value) = maybe_value { - twox_128(&value) - } else { - [0; 16] - }; - let _ = this.memory.set(out, &result); + this.memory.set(out, &result).map_err(|_| DummyUserError)?; }, ext_twox_256(data: *const u8, len: u32, out: *mut u8) => { - let maybe_value = if len == 0 { - Ok(vec![]) + let result = if len == 0 { + twox_256(&[0u8; 0]) } else { - this.memory.get(data, len as usize) + twox_256(&this.memory.get(data, len as usize).map_err(|_| DummyUserError)?) }; - let result = if let Ok(value) = maybe_value { - twox_256(&value) - } else { - [0; 32] - }; - let _ = this.memory.set(out, &result); + this.memory.set(out, &result).map_err(|_| DummyUserError)?; }, ext_blake2_256(data: *const u8, len: u32, out: *mut u8) => { - let maybe_value = if len == 0 { - Ok(vec![]) + let result = if len == 0 { + blake2_256(&[0u8; 0]) } else { - this.memory.get(data, len as usize) + blake2_256(&this.memory.get(data, len as usize).map_err(|_| DummyUserError)?) }; - let result = if let Ok(value) = maybe_value { - blake2_256(&value) - } else { - [0; 32] - }; - let _ = this.memory.set(out, &result); + this.memory.set(out, &result).map_err(|_| DummyUserError)?; }, ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { - (||{ - let mut sig = [0u8; 64]; - if let Err(_) = this.memory.get_into(sig_data, &mut sig[..]) { - return 2; - }; - let mut pubkey = [0u8; 32]; - if let Err(_) = this.memory.get_into(pubkey_data, &mut pubkey[..]) { - return 3; - }; + let mut sig = [0u8; 64]; + this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| DummyUserError)?; + let mut pubkey = [0u8; 32]; + this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| DummyUserError)?; + let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| DummyUserError)?; - if let Ok(msg) = this.memory.get(msg_data, msg_len as usize) { - if ed25519::Signature::from(sig).verify(&msg, &ed25519::Public::from(pubkey)) { - 0 - } else { - 5 - } - } else { - 4 - } - })() + if ed25519::Signature::from(sig).verify(&msg, &ed25519::Public::from(pubkey)) { + 0 + } else { + 5 + } } => <'e, E: Externalities + 'e> ); diff --git a/substrate/wasm-runtime/polkadot/src/runtime/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs index 2be96b19e3..8ca1704c20 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/system.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs @@ -18,7 +18,7 @@ //! and depositing logs. use runtime_std::prelude::*; -use runtime_std::{mem, print}; +use runtime_std::{mem, print, storage_root}; use codec::KeyedVec; use support::{Hashable, storage, with_env}; use primitives::{Block, BlockNumber, Hash, UncheckedTransaction, TxOrder}; @@ -91,9 +91,8 @@ pub mod internal { // any final checks final_checks(&block); - // TODO: check storage root. - // this requires non-trivial changes to the externals API or compiling trie rooting into wasm - // so will wait until a little later. + // check storage root. + assert!(header.state_root == storage_root(), "Storage root must match that calculated."); } /// Execute a given transaction. diff --git a/substrate/wasm-runtime/std/src/lib.rs b/substrate/wasm-runtime/std/src/lib.rs index 9b7d385e69..13df07c49f 100644 --- a/substrate/wasm-runtime/std/src/lib.rs +++ b/substrate/wasm-runtime/std/src/lib.rs @@ -42,6 +42,7 @@ extern "C" { fn ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; + fn ext_storage_root(result: *mut u8); fn ext_chain_id() -> u64; fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8); fn ext_twox_128(data: *const u8, len: u32, out: *mut u8); @@ -72,6 +73,15 @@ pub fn read_storage(key: &[u8], value_out: &mut [u8], value_offset: usize) -> us } } +/// The current storage's root. +pub fn storage_root() -> [u8; 32] { + let mut result: [u8; 32] = Default::default(); + unsafe { + ext_storage_root(result.as_mut_ptr()); + } + result +} + /// The current relay chain identifier. pub fn chain_id() -> u64 { unsafe { @@ -82,7 +92,6 @@ pub fn chain_id() -> u64 { /// Conduct a 256-bit Blake2 hash. pub fn blake2_256(data: &[u8]) -> [u8; 32] { let mut result: [u8; 32] = Default::default(); - // guaranteed to write into result. unsafe { ext_blake2_256(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } @@ -92,7 +101,6 @@ pub fn blake2_256(data: &[u8]) -> [u8; 32] { /// Conduct four XX hashes to give a 256-bit result. pub fn twox_256(data: &[u8]) -> [u8; 32] { let mut result: [u8; 32] = Default::default(); - // guaranteed to write into result. unsafe { ext_twox_256(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } @@ -102,7 +110,6 @@ pub fn twox_256(data: &[u8]) -> [u8; 32] { /// Conduct two XX hashes to give a 128-bit result. pub fn twox_128(data: &[u8]) -> [u8; 16] { let mut result: [u8; 16] = Default::default(); - // guaranteed to write into result. unsafe { ext_twox_128(data.as_ptr(), data.len() as u32, result.as_mut_ptr()); } diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm index 0bd07dc534053aed194903000f119179e4b28a8c..efedffaadf90f38db73dd269166034bb41567390 100644 GIT binary patch delta 17591 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 delta 17315 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 ZnfOl}Yc@k{-lNTCWCP^ial_8G{{;|hxO@Nr diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm index 1e4d2fb99ba3e5a29ef5e6a35c0dc8ad4d99950c..c4e00c3e3e2ca46605a6f4416500bc0c18f558de 100644 GIT binary patch delta 17541 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 Ih8<1+3$tsn?f?J)