Due to a lack of checks in MysteryBox::changeOwner, any user at any time can make themselves the new owner of the protocol.
The owner "Can set the price of boxes, add new rewards, and withdraw funds", meaning any user could perform a takeover of the critical functionalities of the protocol. Also, different users could call this function repeatedly, making a game of hot potato with who owns and controls the contract.
While MysteryBox was initially owned by the deployer of the contract, a random address (user1) was able to change ownership of the contract over to themselves.
Make use of OpenZeppelin's Ownable standards, or add in the makeshift check used throughout the code:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.