Malicious lockupLinear, lockupDynamic and lockupTranched contract addresses can be passed in SablierV2BatchLockup, SablierV2MerkleLT and SablierV2MerkleLL contract.
There are three additional instances of this bug beyond the one outlined in the Known Issues section of the documentation. These instances are as follows:
SablierV2BatchLockup: This contract permits any creator to input arbitrary contract addresses for lockupLinear, lockupDynamic, and lockupTranched. No checks are in place to verify whether these contract addresses point to the protocol's contracts or not.
SablierV2MerkleLT and SablierV2MerkleLL: Both of these contracts also enable any creator to input arbitrary contract addresses for lockupTranched and lockupLinear, respectively.
This loophole allows a malicious actor to inject malicious code into their version of Lockup contracts, which they can easily pass off as legitimate.
An attacker could substitute their own contract address for the protocol's lockup contracts, potentially inserting malicious code. This could deceive recipients into believing their lockup stream is legitimate, allowing the attacker to steal funds from unsuspecting recipients.
One such approach is as follows:
Attacker creates a malicious SablierV2LockupLinear contract containing a condition where recipients can only withdraw tokens if they approve the address for an equivalent amount of tokens.
Attacker can then steal some funds after a certain period.
Manual Review
The constructor arguments should include addresses for the lockupLinear, lockupDynamic, and lockupTranched contracts. Only admin should have access to change these contract addresses.
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.