diff --git a/soroban-env-host/src/test/hostile.rs b/soroban-env-host/src/test/hostile.rs index 10b759028..e0380fc1c 100644 --- a/soroban-env-host/src/test/hostile.rs +++ b/soroban-env-host/src/test/hostile.rs @@ -1,6 +1,6 @@ use soroban_env_common::{ xdr::{ScErrorCode, ScErrorType}, - Env, Symbol, + Env, EnvBase, Symbol, }; use soroban_test_wasms::HOSTILE; @@ -116,3 +116,34 @@ fn hostile_objs_traps() -> Result<(), HostError> { )); Ok(()) } + +#[test] +fn hostile_forged_objects_trap() -> Result<(), HostError> { + let host = Host::test_host_with_recording_footprint(); + let contract_id_obj = host.register_test_contract_wasm(HOSTILE); + + host.set_diagnostic_level(crate::DiagnosticLevel::Debug)?; + host.with_budget(|b| b.reset_default())?; + host.with_budget(|b| b.reset_unlimited_cpu())?; + + let private_vec = host.vec_new_from_slice(&[1u32.into(), 2u32.into()])?; + + let payload = private_vec.to_val().get_payload(); + let lo = payload as u32; + let hi = (payload >> 32) as u32; + let args = host.vec_new_from_slice(&[lo.into(), hi.into()])?; + + // Here we're passing a vector of two numbers that, when reassembled into a + // payload and cast to an object, might potentially alow access to the + // underlying `vec`. But they shouldn't, because that vec was not explicitly + // passed to the function as an argument (thus not installed in its relative + // object reference table). + let res = host.call(contract_id_obj, Symbol::try_from_small_str("forge")?, args); + + assert!(HostError::result_matches_err( + res.clone(), + (ScErrorType::Context, ScErrorCode::InvalidInput) + )); + + Ok(()) +} diff --git a/soroban-test-wasms/wasm-workspace/Cargo.lock b/soroban-test-wasms/wasm-workspace/Cargo.lock index e9e081e28..dce528a2a 100644 --- a/soroban-test-wasms/wasm-workspace/Cargo.lock +++ b/soroban-test-wasms/wasm-workspace/Cargo.lock @@ -1051,7 +1051,7 @@ dependencies = [ "soroban-env-macros", "soroban-wasmi", "static_assertions", - "stellar-xdr", + "stellar-xdr 0.0.17 (git+https://github.com/stellar/rs-stellar-xdr?rev=a49a739d2af0d75814b62004a5c301ac2fd77036)", ] [[package]] @@ -1096,14 +1096,14 @@ dependencies = [ "quote", "serde", "serde_json", - "stellar-xdr", + "stellar-xdr 0.0.17 (git+https://github.com/stellar/rs-stellar-xdr?rev=a49a739d2af0d75814b62004a5c301ac2fd77036)", "syn 2.0.18", "thiserror", ] [[package]] name = "soroban-ledger-snapshot" -version = "0.9.1" +version = "0.9.2" dependencies = [ "serde", "serde_json", @@ -1124,7 +1124,7 @@ dependencies = [ [[package]] name = "soroban-sdk" -version = "0.9.1" +version = "0.9.2" dependencies = [ "arbitrary", "bytes-lit", @@ -1140,7 +1140,7 @@ dependencies = [ [[package]] name = "soroban-sdk-macros" -version = "0.9.1" +version = "0.9.2" dependencies = [ "crate-git-revision", "darling", @@ -1152,30 +1152,30 @@ dependencies = [ "soroban-env-common", "soroban-spec", "soroban-spec-rust", - "stellar-xdr", + "stellar-xdr 0.0.17 (git+https://github.com/stellar/rs-stellar-xdr?rev=0f16673441898162c9996da6117be2280ef8fd84)", "syn 2.0.18", ] [[package]] name = "soroban-spec" -version = "0.9.1" +version = "0.9.2" dependencies = [ "base64 0.13.1", - "stellar-xdr", + "stellar-xdr 0.0.17 (git+https://github.com/stellar/rs-stellar-xdr?rev=0f16673441898162c9996da6117be2280ef8fd84)", "thiserror", "wasmparser", ] [[package]] name = "soroban-spec-rust" -version = "0.9.1" +version = "0.9.2" dependencies = [ "prettyplease", "proc-macro2", "quote", "sha2 0.9.9", "soroban-spec", - "stellar-xdr", + "stellar-xdr 0.0.17 (git+https://github.com/stellar/rs-stellar-xdr?rev=0f16673441898162c9996da6117be2280ef8fd84)", "syn 2.0.18", "thiserror", ] @@ -1228,6 +1228,17 @@ dependencies = [ name = "stellar-xdr" version = "0.0.17" source = "git+https://github.com/stellar/rs-stellar-xdr?rev=0f16673441898162c9996da6117be2280ef8fd84#0f16673441898162c9996da6117be2280ef8fd84" +dependencies = [ + "crate-git-revision", + "hex", + "serde", + "serde_with", +] + +[[package]] +name = "stellar-xdr" +version = "0.0.17" +source = "git+https://github.com/stellar/rs-stellar-xdr?rev=a49a739d2af0d75814b62004a5c301ac2fd77036#a49a739d2af0d75814b62004a5c301ac2fd77036" dependencies = [ "arbitrary", "base64 0.13.1", diff --git a/soroban-test-wasms/wasm-workspace/Cargo.toml b/soroban-test-wasms/wasm-workspace/Cargo.toml index be58d2b52..594f512d5 100644 --- a/soroban-test-wasms/wasm-workspace/Cargo.toml +++ b/soroban-test-wasms/wasm-workspace/Cargo.toml @@ -52,7 +52,7 @@ soroban-env-guest = { path = "../../soroban-env-guest" } soroban-env-host = { path = "../../soroban-env-host" } [workspace.dependencies.soroban-sdk] -version = "0.9.1" +version = "0.9.2" git = "https://github.com/stellar/rs-soroban-sdk" # Always build using the local SDK. Usually the env change is accompanied with diff --git a/soroban-test-wasms/wasm-workspace/hostile/src/lib.rs b/soroban-test-wasms/wasm-workspace/hostile/src/lib.rs index 53eafb863..964d3845e 100644 --- a/soroban-test-wasms/wasm-workspace/hostile/src/lib.rs +++ b/soroban-test-wasms/wasm-workspace/hostile/src/lib.rs @@ -1,5 +1,5 @@ #![no_std] -use soroban_sdk::{contract, contractimpl, Bytes, Env}; +use soroban_sdk::{contract, contractimpl, Bytes, Env, Val, Vec, FromVal}; #[contract] pub struct Contract; @@ -57,4 +57,10 @@ impl Contract { Bytes::from_slice(&env, &local_buf); } } + + pub fn forge(env: Env, lo: u32, hi: u32) -> u32 { + let payload: u64 = lo as u64 | ((hi as u64) << 32); + let v: Vec = Vec::from_val(&env, &Val::from_payload(payload)); + v.get(0).unwrap() + } } diff --git a/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm index e8d421cb3..ed5887de7 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm b/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm index d52ad8e21..20079cd8b 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm b/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm index 19ad84df8..1a5228797 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm b/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm index ab6b0c182..5c1d3f352 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm b/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm index 72dacabbd..63f87d26f 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm index 178be909c..e9e776c68 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm b/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm index 9f55bb69a..ecbb005dc 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm b/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm index 453dc776b..f534c74ed 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm b/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm index 94e812d48..82076c8d1 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm index b419f25df..24a83ce98 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm b/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm index 6770bfbb1..97a41c79e 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm b/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm index 9ac928732..15ed616c5 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm index 4100c10ed..a8f93a85b 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm b/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm index 966b510cb..c2a9ee21f 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/test_delegated_account.wasm b/soroban-test-wasms/wasm-workspace/opt/test_delegated_account.wasm index 737913fe3..076c30bc1 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/test_delegated_account.wasm and b/soroban-test-wasms/wasm-workspace/opt/test_delegated_account.wasm differ