Platform: Code4rena
Start Date: 13/10/2023
Pot Size: $31,250 USDC
Total HM: 4
Participants: 51
Period: 7 days
Judge: 0xsomeone
Id: 295
League: ETH
Rank: 25/51
Findings: 1
Award: $113.54
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: niroh
Also found by: 0xDetermination, 0xSmartContract, 0xbrett8571, 0xdice91, 0xweb3boy, Bauchibred, Bube, DadeKuma, JCK, K42, LinKenji, Myd, SAAJ, ZanyBonzy, albahaca, castle_chain, catellatech, digitizeworx, emerald7017, fouzantanveer, hunter_w3b, invitedtea, m4ttm, rahul, xiao
113.5407 USDC - $113.54
Brahma Console is a custody and DeFi execution environment that aims to provide a secure way for users to interact with DeFi protocols. It does this by deploying Gnosis Safe accounts for users and enabling policy-based approvals for transactions.
The core components of Brahma Console include:
AddressProvider - Single source of truth for resolving addresses of core components and external contracts
Registries - Keep track of wallets, policies, and executors
SafeDeployer - Deploys new Console accounts (Gnosis Safes) and sub-accounts
TransactionValidator - Validates transactions against policies before and after execution
SafeModerator - A Guard contract that ensures only policy-abiding transactions can execute
ExecutorPlugin - Allows execution of batch transactions via a module
Brahma Console follows a modular architecture, with core components inheriting from AddressProviderService
. This provides a standardized way to resolve addresses of other components through the AddressProvider
.
The AddressProvider
acts as the single source of truth, being the only contract that needs to be deployed initially. Other components are then added by governance, with their addresses stored in the AddressProvider.
This is a robust and extensible pattern, allowing easy swapping out of components as needed, while maintaining a consistent address resolution mechanism.
The core registries like PolicyRegistry
and WalletRegistry
are separated from the main logic contracts, keeping the system decoupled. Application logic is further divided into domains like account deployment, transaction validation, and execution.
Overall the code is well structured, making use of appropriate inheritance, libraries, and interfaces. Naming conventions are followed throughout. Comments provide ample explanation of logic and architecture.
Error handling is done properly with custom errors instead of generic revert
calls. Input validation ensures bad data does not enter the system. Access controls via _onlyGov
modifiers restrict sensitive functionality.
There is extensive test coverage of core components like AddressProvider
, SafeDeployer
, TransactionValidator
and ExecutorPlugin
. Mocks are used appropriately to isolate unit tests.
Some opportunities for improvement:
Reduce code duplication between SafeModerator
and SafeModeratorOverridable
contracts
Use events more consistently to make transactions easily traceable
Validate policy signatures on chain instead of relying on off-chain backend
Add integration tests covering end-to-end workflow
The AddressProvider
governance account has a lot of power, being able to update any authorized address. This is mitigated by supporting a pending governance pattern, where governance changes must be accepted by the new account.
No timelocks are imposed on governance changes, so the AddressProvider
could be pointed to malicious contracts instantly. A timelock would make the system more resilient.
The backend Signer that generates policy signatures is also a central point of failure. Signing should ideally happen on-chain to remove this trust assumption.
Console accounts and sub-accounts are created by deploying Gnosis Safe proxies in a deterministic way using create2
. Salts are used to generate a nonce and owners are sorted to generate the same deployment address consistently.
This predictable account generation enables easy porting of accounts across chains. It does introduce some risk of nonce manipulation, which is mitigated by checking for pre-computed addresses and bumping the nonce if needed.
Setup transactions are bundled to enable modules, register accounts, and set policies in one call using GnosisMultiSend
.
The TransactionValidator
checks transactions against policies in a modular way, supporting both Guard and module flows. Policies take the form of a commit hash, with the actual validation happening off-chain. This avoids expensive on-chain policy validation.
The SafeModerator
Guard implements the checkTransaction
hook to validate transactions pre-execution. It provides flexibility for Console accounts to override policies by removing the Guard if needed.
The ExecutorPlugin
module conducts similar policy checks for batch transactions. A standardized transactionStructHash
is passed from the plugin for validation.
Post-execution checks on critical account states provide additional security guarantees.
Since custom Guard contracts can be added by governance, care must be taken to avoid introducing vulnerable or malicious guards into the core system.
There is also a risk of funds being locked if a console owner account loses access to its private key, given the social recovery design.
The backend signer has broad power to generate policy signatures that allow arbitrary transactions. Strict controls need to govern this component to prevent compromise.
Move policy signature generation on-chain to minimize trust assumptions
Implement a timelock mechanism for AddressProvider governance changes
Conduct comprehensive smart contract audits on all core components before launch
ProvideTOOLS to help users understand and set policies easily
Build integration testing suite covering complete end-to-end scenarios
Introduce a escape hatch mechanism like Safe's "Disable Module" to unblock funds in emergency
Document key operational processes & ownership controls related to signature generation
Consider allowing users to select their preferred Guard contract for customizability
Some enhancements around decentralization, testing, and documentation would help improve security and transparency further. With proper controls governing the operational aspects, Brahma Console could provide a robust DeFi execution platform for users.
19 hours
#0 - c4-pre-sort
2023-10-22T21:17:09Z
raymondfam marked the issue as sufficient quality report
#1 - alex-ppg
2023-10-27T13:22:44Z
The report is nicely formatted, well worded, and details solid one-line recommendations at the end that the Brahma project should follow.
#2 - c4-judge
2023-10-27T13:22:49Z
alex-ppg marked the issue as grade-a