From e46d711bf2a4d167ba45ab0690cd9ee9ed1ccc64 Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Fri, 13 May 2022 02:07:45 +0200 Subject: [PATCH] fix (security): filtered calls should not enter the tx pool. --- runtime/common/src/apis.rs | 21 +++++++++++++-------- runtime/g1/src/lib.rs | 3 ++- runtime/gdev/src/lib.rs | 3 ++- runtime/gtest/src/lib.rs | 3 ++- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/runtime/common/src/apis.rs b/runtime/common/src/apis.rs index 41edbb02f..e2d0ca4cd 100644 --- a/runtime/common/src/apis.rs +++ b/runtime/common/src/apis.rs @@ -123,15 +123,20 @@ macro_rules! runtime_apis { } } - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: <Block as BlockT>::Extrinsic, + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: <Block as BlockT>::Extrinsic, block_hash: <Block as BlockT>::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } + ) -> TransactionValidity { + // Filtered calls should not enter the tx pool. + if !<Runtime as frame_system::Config>::BaseCallFilter::contains(&tx.function) + { + return sp_runtime::transaction_validity::InvalidTransaction::Call.into(); + } + Executive::validate_transaction(source, tx, block_hash) + } + } impl sp_offchain::OffchainWorkerApi<Block> for Runtime { fn offchain_worker(header: &<Block as BlockT>::Header) { diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs index 6ab4dcb8a..2546c4f3c 100644 --- a/runtime/g1/src/lib.rs +++ b/runtime/g1/src/lib.rs @@ -41,6 +41,7 @@ pub use sp_runtime::BuildStorage; pub use sp_runtime::{KeyTypeId, Perbill, Permill}; use common_runtime::IdtyNameValidatorImpl; +use frame_support::traits::Contains; use frame_system::EnsureRoot; use pallet_grandpa::fg_primitives; use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; @@ -121,7 +122,7 @@ pub type Executive = frame_executive::Executive< >; pub struct BaseCallFilter; -impl frame_support::traits::Contains<Call> for BaseCallFilter { +impl Contains<Call> for BaseCallFilter { fn contains(call: &Call) -> bool { !matches!( call, diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs index d064ffe75..7bc127edf 100644 --- a/runtime/gdev/src/lib.rs +++ b/runtime/gdev/src/lib.rs @@ -41,6 +41,7 @@ pub use sp_runtime::BuildStorage; pub use sp_runtime::{KeyTypeId, Perbill, Permill}; use common_runtime::IdtyNameValidatorImpl; +use frame_support::traits::Contains; use frame_system::EnsureRoot; use pallet_grandpa::fg_primitives; use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; @@ -123,7 +124,7 @@ pub type Executive = frame_executive::Executive< >; pub struct BaseCallFilter; -impl frame_support::traits::Contains<Call> for BaseCallFilter { +impl Contains<Call> for BaseCallFilter { fn contains(call: &Call) -> bool { !matches!( call, diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs index 179d22690..be6b0723a 100644 --- a/runtime/gtest/src/lib.rs +++ b/runtime/gtest/src/lib.rs @@ -41,6 +41,7 @@ pub use sp_runtime::BuildStorage; pub use sp_runtime::{KeyTypeId, Perbill, Permill}; use common_runtime::IdtyNameValidatorImpl; +use frame_support::traits::Contains; use frame_system::EnsureRoot; use pallet_grandpa::fg_primitives; use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; @@ -122,7 +123,7 @@ pub type Executive = frame_executive::Executive< >; pub struct BaseCallFilter; -impl frame_support::traits::Contains<Call> for BaseCallFilter { +impl Contains<Call> for BaseCallFilter { fn contains(call: &Call) -> bool { !matches!( call, -- GitLab