From c7e60073f01fc8c4e7781aac737f278788d14860 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 12 Apr 2023 08:24:33 +0200 Subject: [PATCH] Check if context is static for state-changing opcodes (#973) * Check if context is static for state-changing opcodes * PR feedback --- evm/src/cpu/kernel/asm/core/call.asm | 14 +++++++++++--- evm/src/cpu/kernel/asm/core/create.asm | 2 ++ evm/src/cpu/kernel/asm/core/syscall_stubs.asm | 5 +++++ evm/src/cpu/kernel/asm/core/terminate.asm | 1 + evm/src/cpu/kernel/asm/memory/metadata.asm | 7 +++++++ .../cpu/kernel/asm/mpt/storage/storage_write.asm | 1 + evm/src/cpu/kernel/asm/util/basic_macros.asm | 6 ++---- 7 files changed, 29 insertions(+), 7 deletions(-) diff --git a/evm/src/cpu/kernel/asm/core/call.asm b/evm/src/cpu/kernel/asm/core/call.asm index acb10f11..dcebb231 100644 --- a/evm/src/cpu/kernel/asm/core/call.asm +++ b/evm/src/cpu/kernel/asm/core/call.asm @@ -2,7 +2,15 @@ // Creates a new sub context and executes the code of the given account. global sys_call: + // Check that the value is zero if the context is static. // stack: kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size + DUP4 ISZERO %not_bit + // stack: value≠0, kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size + %mload_context_metadata(@CTX_METADATA_STATIC) + // stack: is_static, value≠0, kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size + MUL // Cheaper than AND + %jumpi(fault_exception) + SWAP2 // stack: address, gas, kexit_info, value, args_offset, args_size, ret_offset, ret_size %u256_to_addr // Truncate to 160 bits @@ -311,7 +319,7 @@ global after_call_instruction: // Compute C_xfer // stack: Caaccess, address, gas, kexit_info, value - DUP5 ISZERO PUSH 1 SUB + DUP5 ISZERO %not_bit // stack: value≠0, Caaccess, address, gas, kexit_info, value DUP1 %mul_const(@GAS_CALLVALUE) @@ -336,7 +344,7 @@ global after_call_instruction: // stack: leftover_gas=Cextra, (leftover_gas=Cextra, (leftover_gas (Cgascap, address, gas, kexit_info, value) - DUP5 ISZERO PUSH 1 SUB + DUP5 ISZERO %not_bit // stack: value!=0, Cgascap, address, gas, kexit_info, value %mul_const(@GAS_CALLSTIPEND) ADD %stack (C_callgas, address, gas, kexit_info, value) -> diff --git a/evm/src/cpu/kernel/asm/core/create.asm b/evm/src/cpu/kernel/asm/core/create.asm index 3cc457d9..866e482c 100644 --- a/evm/src/cpu/kernel/asm/core/create.asm +++ b/evm/src/cpu/kernel/asm/core/create.asm @@ -4,6 +4,7 @@ // Pre stack: kexit_info, value, code_offset, code_len // Post stack: address global sys_create: + %check_static // stack: kexit_info, value, code_offset, code_len // TODO: Charge gas. %stack (kexit_info, value, code_offset, code_len) @@ -25,6 +26,7 @@ sys_create_got_address: // Pre stack: kexit_info, value, code_offset, code_len, salt // Post stack: address global sys_create2: + %check_static // stack: kexit_info, value, code_offset, code_len, salt // TODO: Charge gas. SWAP4 diff --git a/evm/src/cpu/kernel/asm/core/syscall_stubs.asm b/evm/src/cpu/kernel/asm/core/syscall_stubs.asm index 95b50b0b..42dc73ad 100644 --- a/evm/src/cpu/kernel/asm/core/syscall_stubs.asm +++ b/evm/src/cpu/kernel/asm/core/syscall_stubs.asm @@ -16,12 +16,17 @@ global sys_chainid: SWAP1 EXIT_KERNEL global sys_log0: + %check_static PANIC global sys_log1: + %check_static PANIC global sys_log2: + %check_static PANIC global sys_log3: + %check_static PANIC global sys_log4: + %check_static PANIC diff --git a/evm/src/cpu/kernel/asm/core/terminate.asm b/evm/src/cpu/kernel/asm/core/terminate.asm index 5d9ed853..a46bbf0f 100644 --- a/evm/src/cpu/kernel/asm/core/terminate.asm +++ b/evm/src/cpu/kernel/asm/core/terminate.asm @@ -45,6 +45,7 @@ sys_return_finish: %jump(terminate_common) global sys_selfdestruct: + %check_static // stack: kexit_info, recipient SWAP1 %u256_to_addr %address DUP1 %balance diff --git a/evm/src/cpu/kernel/asm/memory/metadata.asm b/evm/src/cpu/kernel/asm/memory/metadata.asm index 4941f8d6..8f8e9881 100644 --- a/evm/src/cpu/kernel/asm/memory/metadata.asm +++ b/evm/src/cpu/kernel/asm/memory/metadata.asm @@ -283,3 +283,10 @@ global sys_basefee: %jumpi(fault_exception) // stack: (empty) %endmacro + +// Convenience macro for checking if the current context is static. +// Called before state-changing opcodes. +%macro check_static + %mload_context_metadata(@CTX_METADATA_STATIC) + %jumpi(fault_exception) +%endmacro diff --git a/evm/src/cpu/kernel/asm/mpt/storage/storage_write.asm b/evm/src/cpu/kernel/asm/mpt/storage/storage_write.asm index 90fb0e0b..6da8f567 100644 --- a/evm/src/cpu/kernel/asm/mpt/storage/storage_write.asm +++ b/evm/src/cpu/kernel/asm/mpt/storage/storage_write.asm @@ -4,6 +4,7 @@ // Post stack: (empty) global sys_sstore: + %check_static %stack (kexit_info, slot, value) -> (slot, kexit_info, slot, value) %address %insert_accessed_storage_keys POP // TODO: Use return value in gas calculation. // TODO: Assuming a cold zero -> nonzero write for now. diff --git a/evm/src/cpu/kernel/asm/util/basic_macros.asm b/evm/src/cpu/kernel/asm/util/basic_macros.asm index c57f0649..279d449a 100644 --- a/evm/src/cpu/kernel/asm/util/basic_macros.asm +++ b/evm/src/cpu/kernel/asm/util/basic_macros.asm @@ -360,8 +360,6 @@ %macro not_bit // stack: b - PUSH 1 - // stack: 1, b - SUB - // stack: 1 - b + ISZERO + // stack: not b %endmacro