Cube3 security record

Arbitrum, Avalanche, Base, BNB Chain, Ethereum, Optimism, Polygon (POS)cube3.aiXGitHub

As of 30 Oct 2026, Cube3 has 2 audit reports by 1 security firm on Trustblock; the latest is by Resonance Security, dated 14 Aug 2024. Those reports list no open critical findings.

Critical findings
No open critical findings
Across 2 reports.
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.

Audits2

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Cube3Security firm: Resonance SecurityDate: Scope: Repository, no commit namedNo open critical findingsOpen · IPFS
Cube3Security firm: Resonance SecurityDate: Scope: Repository, no commit namedNo open critical findingsOpen · IPFS

Findings14

Statuses are the security firm’s own, from each report.

SeverityOpenAcknowledgedFixed
Critical000
High001
Medium002
Low407
HighCube3Protection Bypass Using delegatecall()Cube3 · Resonance Security · 20 Oct 2023Fixed

The cube3Protected modifier is used to protect integration functions already enabled for protection. The status of each function's protection mechanism is tracked inside the state variable _functionToProtectionEnabled. This variable contains a mapping between the function selectors and a boolean value identifying whether the protection is enabled or not.When an integration function is disabled for protection, the check on line 55 will still allow the function to execute without any issues, bypassing all the logic to forward the cube3SecurePayload to the respective security module. This is intended.On the other hand, when an integration function's protection is enabled, the router will forward the cube3SecurePayload to the respective module, and only allow the execution of the function's logic if the module returns a valid result. This is also intended.Although both previous scenarios work as expected, it is possible for a malicious user to create a smart contract that will stand between the user's EOA and the integration contract. This contract (e.g MockMaliciousContract) simply implements a maliciousFunction() that performs a delegatecall() to the integration contract. Since a delegatecall() is being made, the storage context passed on to the integration contract is that of the malicious contract, and not of the integration contract's. This effectively means that the state variable _functionToProtectionEnabled will be searched for in the storage slots of the malicious contract where all protections are disabled (`placeholder2`).It should be noted however, that mostly integration functions that make external calls are vulnerable, due precisely to the fact that storage context on the integration contract is not modified. Integration functions that modify the integration's storage are generally safe.

Open the report
MediumMissing 2-Step Security Administration TransferCube3 · Resonance Security · 20 Oct 2023Fixed

The function _transferSecurityAdministration() attempts to implement the logic for transferring the role of _securityAdmin to another address. This role manages the protection status of the integration contract's functions and is set to the deployer of the contract by default.The transfer of this role does not follow a 2-step process. Being a critical and dangerous process, it should be ensured that no potential errors are made during the transfer. The change to an incorrect address on a single step would render the system useless forever.

Open the report
MediumSetting Signing Authority Does Not Account For Variable UpdatesCube3 · Resonance Security · 20 Oct 2023Fixed

The functions setClientSigningAuthority() and batchSetSigningAuthority() are used to set the signing authorities specified by the KMS for the specific integration contracts. These functions maintain a counting variable _signingAuthorityCount and increase it every time a new signing authority is set into the variable integrationToSigningAuthoritySet.Whether it is an update or a new insert of signing authority, the variable _signingAuthorityCount is always updated and can lead to the incorrect management of currently active signing authorities.

Open the report
LowFloating Pragma On Core ProtocolCube3 · Resonance Security · 14 Aug 2024Fixed

Floating pragmas is a feature of Solidity that allows developers to specify a range of compiler versions that can be used to compile the smart contract code. For security purposes specifically, the usage of floating pragmas is discouraged and not recommended. Contracts should be compiled and deployed with a strict pragma, the one which was thoroughly tested the most by developers. Locking the pragma helps ensure that contracts do not accidentally get deployed using too old or too recent compiler versions that might introduce security issues that impact the contract negatively.It should be noted however that, pragma statements can be allowed to float when a contract is intended for consumption by other developers, as in the case with contracts in a library or EthPM package.The smart contracts of Cube3's core protocol make use of floating pragmas. These are not intended for use as libraries for other developers and, as such, should be locked of their pragma.

Open the report
LowMissing getIsProtocolPaused() ValidationCube3 · Resonance Security · 14 Aug 2024Fixed

The functions transferIntegrationAdmin(), acceptIntegrationAdmin(), updateFunctionProtectionStatus(), and initiateIntegrationRegistration() are capable of modifying the storage of the Router smart contract, yet they do not validate whether the protocol is paused via the function getIsProtocolPaused().

Open the report
LowRedundant Data Validation Of moduleAddressCube3 · Resonance Security · 14 Aug 2024Fixed

The ProtocolManagement contract defines an installModule() function that saves new module's address into the storage. It was observed that it performs a zero-address check that is then followed by ERC165's supportsInterface() verification. Because the ERC165 standard is used, the zero-address check is redundant as the supportsInterface() function will fail if called on the zero-address. Effectively, the zero-address check is performed twice which incurs a higher gas costs.

Open the report
LowInstalling Non-Cube3 Module PossibleCube3 · Resonance Security · 20 Oct 2023Fixed

The function installModule() does not validate if the module to be installed identified by the input parameter moduleAddress is in fact a Cube3Module. As per the implementation of this function, the module is only required to implement the functions moduleVersion() and moduleId(). This effectively means that when installing a new module via installModule() it is not necessary for the module to inherit from the contract Cube3Module, therefore, it doesn't need to implement the function deprecate(). A vulnerable module that was previously installed on the router will never be able to be deprecated by the Cube3 administrator.

Open the report
LowMissing Input Validation on moduleVersionCube3 · Resonance Security · 20 Oct 2023Fixed

According to the documentation and code commenting, the minimum valid length for a module version is 9 bytes. However, the check on the constructor of the Cube3Module contract only allows modules to be deployed with a version of 10 bytes or more.Additionally, no validation is being made on the module version in regards to the specification of its format.

Open the report
LowMissing Zero Address Validation on _transferSecurityAdministration()Cube3 · Resonance Security · 20 Oct 2023Fixed

The function _transferSecurityAdministration() does not validate against the Zero Address, allowing for a potential transfer of administration to an inexistent user, therefore removing all possibilities of regaining administration of the contract.

Open the report
LowSignature Module Unusable When Contract Is Caller of IntegrationCube3 · Resonance Security · 20 Oct 2023Fixed

Inside the function validateSignature(), the first input validation is made between the variables integrationMsgSender and tx.origin, requiring both variables to be the same address. The integrationMsgSender variable is set all the way back in the Cube3Protected contract as the caller of the integration contract. The tx.origin variable always contains the address of the transaction's initiator EOA account.As per the implemented logic, a contract can never call a protected function in the integration contract since the address of the caller contract will never be an EOA address. This hinders many legitimate use cases and affects blockchain and smart contract interoperability.

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

Show this on your site

Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.

Content

Facts

Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="cube3"
></div>
</body>

Paste the code where the label should appear. It uses no API credit and updates by itself.

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us