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.