Cyber security record

Ethereumcyber.coX

As of 14 Oct 2026, Cyber has 7 audit reports by 2 security firms on Trustblock; the latest is by HashEx, dated 20 Aug 2024. Those reports list no open critical findings. It also holds 1 deployed contract on 1 chain.

Critical findings
No open critical findings
Across 7 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. Statuses are the security firms’ own. Trustblock does not review code.

Audits7

Newest first

AuditSecurity firmDateScopeCritical findingsReport
CyberSecurity firm: HashExDate: Scope: 1 address on EthereumNo open critical findingsOpen · hashex.org
Cyberconnect - staking poolSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
CyberConnect - cybergraphSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
CyberConnect - AuditSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
Cyberconnect - cybervestingSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
CyberConnect - CyberTokenSecurity firm: CertiKDate: Scope: Not recorded. See the reportNo open critical findingsOpen · skynet.certik.com
CyberConnectSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com

Findings45

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

SeverityOpenAcknowledgedFixed
Critical000
High540
Medium106
Low2306
MediumPotential Reentrancy AttackCyberconnect - staking pool · CertiK · 9 Apr 2024Fixed

A reentrancy attack can occur when the contract creates a function that makes an external call to another untrusted contract before resolving any effects. If the attacker can control the untrusted contract, they can make a recursive call back to the original function, repeating interactions that would have otherwise not run after the external call resolved the effects. ### External call(s) ```solidity=265 IERC20(asset).approve(bridgeAddress, amount); ``` ### State variables written after the call(s) ```solidity=262 balance[asset][assetOwner] -= amount; ``` ```solidity=263 totalBalance[asset] -= amount; ```

Open the report
MediumPotential Reentrancy Attack (Sending Tokens)Cyberconnect - staking pool · CertiK · 9 Apr 2024Fixed

A reentrancy attack can occur when the contract creates a function that makes an external call to another untrusted contract before resolving any effects. If the attacker can control the untrusted contract, they can make a recursive call back to the original function, repeating interactions that would have otherwise not run after the external call resolved the effects. ### External call(s) ```solidity=119 IERC20(asset).safeTransfer(msg.sender, amount); ``` * This function call executes the following external call(s). * In `SafeERC20._callOptionalReturn`, * `returndata = address(token).functionCall(data,"SafeERC20: low-level call failed")` * In `Address.functionCallWithValue`, * `(success,returndata) = target.call{value: value}(data)` ### State variables written after the call(s) ```solidity=115 balance[asset][msg.sender] -= amount; ``` ```solidity=116 totalBalance[asset] -= amount; ```

Open the report
MediumIncomplete Signature ValidationCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

The function `_requiresExpectedSigner()` is used to check if `expectedSigner` is the correct signer, which will be called by the function `preProcess()` from the contract `PermissionMw`. ```solidity function _requiresExpectedSigner( bytes32 digest, address expectedSigner, uint8 v, bytes32 r, bytes32 s, uint256 deadline ) internal view { require(deadline >= block.timestamp, "DEADLINE_EXCEEDED"); require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "INVALID_SIGNATURE_S_VAULE" ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress == expectedSigner, "INVALID_SIGNATURE"); } ``` If `ecrecover()` fails to recover an address, a zero address will be returned, which is not checked in `_requiresExpectedSigner()`. If the role `NameRegistry` assign a zero address to the signer through the function `setMwData()`, an invalid signature could bypass the permission check of the function `preProcess()` in the middleware `PermissionMw`. ```solidity //file src/middlewares/mocaid/PermissionMw.sol function setMwData(bytes calldata data) external override onlyNameRegistry { signer = abi.decode(data, (address)); } function preProcess( DataTypes.RegisterNameParams calldata params, bytes calldata data ) external payable override onlyNameRegistry { DataTypes.EIP712Signature memory sig; (sig.v, sig.r, sig.s, sig.deadline) = abi.decode( data, (uint8, bytes32, bytes32, uint256) ); _requiresExpectedSigner( _hashTypedDataV4( keccak256( abi.encode( Constants._REGISTER_TYPEHASH, keccak256(bytes(params.name)), params.parentNode, params.to, nonces[params.to]++, sig.deadline ) ) ), signer, sig.v, sig.r, sig.s, sig.deadline ); } ``` References: - https://docs.soliditylang.org/en/v0.8.9/units-and-global-variables.html?highlight=ecrecover#mathematical-and-cryptographic-functions

Open the report
MediumMissing Validation on the Return Values of `usdOrCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

In the contract `StableFeeMiddleware`, the function `usdOracle.getRoundData()` returns the token's Oracle price. According to the documentation, it must validate the returned **timestamps**, **round ID**, and **price** to ensure the price is valid. ```solidity function _getPriceAt(uint80 roundId) internal view returns (int256) { // prettier-ignore ( /* uint80 roundID */, int price, /*uint startedAt*/, /*uint timeStamp*/, /*uint80 answeredInRound*/ ) = usdOracle.getRoundData(roundId); return price; } ``` Moreover, The function **_getPrice()** is using `latestRoundData()` to get the token's price by Chainlink, but there are no validations that the data is not stale. Reference: - https://docs.chain.link/data-feeds/historical-data#getrounddata-return-values

Open the report
MediumMoca xp set up validation can be bypassedCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

The value for moca xp can be updated via `setMocaXP` with a limitation of `_MAX_XP` by the operator. ```solidity=374 function setMocaXP(uint256 tokenId, uint256 xp) external { require(xp <= _MAX_XP, "XP_TOO_BIG"); DataTypes.MetadataPair[] memory pairs = new DataTypes.MetadataPair[](1); pairs[0] = DataTypes.MetadataPair(_MOCA_XP_KEY, xp.toString()); batchSetGatedMetadatas(tokenId, pairs); emit MocaXPSet(tokenId, xp); } ``` However, since `batchSetGatedMetadatas` is external function, the operator can invoke `batchSetGatedMetadatas` directly to bypass the validation on moca xp value.

Open the report
MediumPotential Manipulation on Registration costCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

When register cyber ID, there is a pre-register process when the middleware of the contract is not address(0) ```solidity=177 function register( string calldata cid, address to, bytes32 secret, uint8 durationYear, bytes calldata middlewareData ) external payable { ... uint256 cost; if (middleware != address(0)) { cost = ICyberIdMiddleware(middleware).preRegister{ value: msg.value }( DataTypes.RegisterCyberIdParams( msg.sender, cid, to, durationYear ), middlewareData ); } _register(cid, to, durationYear, cost); } ``` During the preregister process in stable fee middleware, it will query the fee and calculate the cost: ```solidity=83 function preRegister( DataTypes.RegisterCyberIdParams calldata params, bytes calldata data ) external payable override returns (uint256) { uint80 roundId = abi.decode(data, (uint80)); uint256 cost = getPriceWeiAt(params.cid, roundId, params.durationYear); _chargeAndRefundOverPayment(cost, params.msgSender); return cost; } ``` However, the `roundID` is based on the `middlewareData`, which is user's input. As a result, the user has the chance to select the price for the registration.

Open the report
LowMissing Zero Address ValidationCyberconnect - staking pool · CertiK · 9 Apr 2024Fixed

Addresses are not validated before assignment or external calls, potentially allowing the use of zero addresses and leading to unexpected behavior or vulnerabilities. For example, transferring tokens to a zero address can result in a permanent loss of those tokens. ```solidity=61 weth = _weth; ``` - `_weth` is not zero-checked before being used.

Open the report
LowPotential Reentrancy Attack (Out-of-Order Events)Cyberconnect - staking pool · CertiK · 9 Apr 2024Fixed

A reentrancy attack can occur when the contract creates a function that makes an external call to another untrusted contract before resolving any effects. If the attacker can control the untrusted contract, they can make a recursive call back to the original function, repeating interactions that would have otherwise not run after the external call resolved the effects. *This finding is considered minor because the reentrancy only causes out-of-order events. * ### External call(s) ```solidity=75 IERC20(asset).safeTransferFrom(msg.sender, address(this), amount); ``` * This function call executes the following external call(s). * In `SafeERC20._callOptionalReturn`, * `returndata = address(token).functionCall(data,"SafeERC20: low-level call failed")` * In `Address.functionCallWithValue`, * `(success,returndata) = target.call{value: value}(data)` ### Events emitted after the call(s) ```solidity=82 emit Deposit(_logId++, msg.sender, asset, actualAmount); ``` --- ### External call(s) ```solidity=95 IWETH(weth).deposit{ value: msg.value }(); ``` ### Events emitted after the call(s) ```solidity=97 emit Deposit(_logId++, msg.sender, weth, msg.value); ``` --- ### External call(s) ```solidity=119 IERC20(asset).safeTransfer(msg.sender, amount); ``` * This function call executes the following external call(s). * In `SafeERC20._callOptionalReturn`, * `returndata = address(token).functionCall(data,"SafeERC20: low-level call failed")` * In `Address.functionCallWithValue`, * `(success,returndata) = target.call{value: value}(data)` ### Events emitted after the call(s) ```solidity=127 emit Withdraw(_logId++, msg.sender, assets, amounts); ``` --- ### External call(s) ```solidity=265 IERC20(asset).approve(bridgeAddress, amount); ``` ```solidity=269 IBridge(bridgeAddress).bridge(assetOwner, recipient, assets, amounts); ``` ### Events emitted after the call(s) ```solidity=279 emit Bridge( _logId++, bridgeAddress, assetOwner, recipient, assets, amounts ); ```

Open the report
LowUnused Return ValueCyberconnect - staking pool · CertiK · 9 Apr 2024Fixed

The smart contract does not check or store the return value of an external call in a local or state variable, which may introduce vulnerabilities due to the unhandled outcome. ```solidity=265 IERC20(asset).approve(bridgeAddress, amount); ```

Open the report
LowMissing Access RestrictionCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

The following function are missing access control in `StableFeeMiddleware`: - `preRegister` - `preRenew` - `preBid`

Open the report
Show 2 more
LowMultiple ways for owner update in `TrustOnlyMiddlCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

In contract `TrustOnlyMiddleware`, the `_owner` can be updated by multiple parties 1. via `setMwData`(by NameRegistry) 2. via `transferOwnership`(by current owner).

Open the report
LowPotential Stuck Tokens When `middleware` is `addrCyberConnect - Audit · CertiK · 5 Sep 2023Fixed

The function `register()` is intended to register a new cid and ultimately calls the function `preRegister()` from `middleware`, which will charge the required native tokens. ```solidity function register( string calldata cid, address to, bytes32 secret, uint8 durationYear, bytes calldata middlewareData ) external payable { //... uint256 cost; if (middleware != address(0)) { cost = ICyberIdMiddleware(middleware).preRegister{ value: msg.value }( DataTypes.RegisterCyberIdParams( msg.sender, cid, to, durationYear ), middlewareData ); } _register(cid, to, durationYear, cost); } ``` However, if the middleware is zero address, the function `preBid()` won't be called and no cost will be calculated. As a result, the receiving token `msg.value` will be locked in the contract permanently. Moreover, the same thing will happen in other functions `renew()` and `bid()`.

Open the report

Contracts1

AddressChainSource code
0x14778860e937f509e651192a90589de711fb88a9Chain: EthereumSource code: Verified source

All 1 address and the files the reports name

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="cyber"
></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