Fjord allows users to stake Sablier NFT as long as they stream Fjord Tokens using the stakeVested() function.
This function performs checks regarding the nature of the NFT before proceeding to the staking.
One of them makes sure the NFT was emitted by trusted parties which are said to be "authorised multisig addresses of ours" by the Fjord.
Sablier streams can be cancelled but only by the address returned by getSender().
The stakeVested() function verifies the creator of the stream using Sablier getSender() function.
https://github.com/Cyfrin/2024-08-fjord/blob/main/src/FjordStaking.sol#L403-L405
The sponsor stated "We will only allow linear streams which are created by a set of authorised multisig addresses of ours."
However, the Sablier NFT sender can be set to an arbitrary address at creation which allows anyone to create their own stream and stake them in Fjord, effectively bypassing the intention of Fjord to only allow staking streams emitted by one of the multisig address.
The sablier createWithDurations() function responsible for the stream creation takes user supplied params meaning it can be set to any address (including one of the authorized multisig address):
https://github.com/sablier-labs/v2-core/blob/main/src/SablierV2LockupLinear.sol#L154-L164
Users are able to bypass the Fjord intention to only allow restricted Sablier streams to be staked in the contract.
Manual review
The nature of the emitter of a Sablier stream can't be verified easily.
However, an additional check can be implemented to only allow cancellable streams to be staked.
This way, if the described situation occurs, Fjord still has the ability to cancel the stream and enforce their restrictions.
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.