-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replay attack to suddenly offboard the re-onboarded lending term #1147
Comments
The issue is well demonstrated, properly formatted, contains a coded POC. |
0xSorryNotSorry marked the issue as high quality report |
0xSorryNotSorry marked the issue as primary issue |
I think this is a duplicate of #1141, pasting my comment from there :
|
eswak (sponsor) confirmed |
eswak marked the issue as disagree with severity |
Trumpero marked the issue as duplicate of #1141 |
Trumpero marked the issue as satisfactory |
Trumpero changed the severity to 2 (Med Risk) |
Dear @Trumpero, As the sponsor said,
And what the judge said in #1141's comment,
I disagree with the sponsor's and judge's statements. Point #1 - - argument about: "I think this is a duplicate of #1141"Note that I wrote both issues #1147 (this report) and #1141. And they have different attack scenarios. The issue #1141 explains the attack steps to re-trigger the Whereas the issue #1147 (this issue) explains another attack scenario in which the target term has been off-boarded but never been explicitly terminated by the Hence, fixing either issue may not fix another issue because they have different attack initiation scenarios and attack vectors (different root causes). For this reason, #1147 (the root cause resides in the Point #2 - argument about: "the unlikely situation of re-onboarding a term that just has been offboarded"The attack scenario described in this report does not rely on the situation that "the term must be re-onboarded within only a few days after it has been offboarded". Specifically, after the term is offboarded, there will be a time gap waiting for all loans to be called and closed in order to explicitly terminate the term via the This time gap can be a long period (e.g., a couple of weeks/months). Before all loans are closed, the term can be proposed and granted for re-onboarding (the Then, the attacker can wait for a long period (e.g., a couple of months) before attacking. The coded PoC proves that the target term can be re-onboarded after being offboarded for 10 days (or even later), and the attacker can launch the attack operation (immediately offboard the target term) after the target term has re-onboarded for 30 days (or even later). Please consider the following excerpt from the
Point #3 - argument about: "no user funds are at risk"The attacker can wait for a long period before attacking (e.g., a couple of months -- please thoroughly consider the coded PoC for the proof.). In the meantime, after the target term has been re-onboarded, several GUILD holders can vote for it, and then the term can re-issue new loans. Once the attacker launches the attack operation, the target term will be forced to immediately offboard, bypassing the DAO vote offboarding. Please consider the following excerpt from the
Clearly, the loan borrowers' funds and the stakers' funds are at risk. In other words, the attack will impact both borrowers (whose loans are forced to be called and closed maliciously) and stakers (who vote for the term via the The vulnerability also impacts the protocol by breaking the governance decision, which is a core feature of the protocol. For this reason, the HIGH severity is proper for this report. |
@serial-coder I agree this issue is different from #1141, and should be a primary issue among the duplicates with the same root cause: missing updates of states for re-onboarded terms. However, I still believe its severity is medium, since the attacker still needs enough votes for re-onboarding before cleanup(). This malicious action is still preventable, by vetoing the onboarding proposal. Therefore, it should be considered as low likelihood with high cost. |
Trumpero marked the issue as selected for report |
@eswak I believe they should be treated separately as they involve different vulnerabilities in LendingTermOffboarding and different exploits. The root cause of #1141 is that |
Lines of code
https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/governance/LendingTermOffboarding.sol#L138-L140
https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/governance/LendingTermOffboarding.sol#L154
https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/governance/LendingTermOffboarding.sol#L177-L180
https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/loan/LendingTerm.sol#L797
https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/loan/SurplusGuildMinter.sol#L228-L231
Vulnerability details
The
LendingTermOffboarding
contract allows guild holders to poll to remove a lending term. If the voting weight is enough, the lending term can be offboarded without delay. Further, the offboarded term can be re-onboarded to become an active term through theLendingTermOnboarding::proposeOnboard()
following up with the voting mechanism.The following briefly describes the steps for offboarding the lending term through the
LendingTermOffboarding
contract:proposeOffboard()
to create a poll for offboarding the term. The poll has an age of ~7 days.supportOffboard()
.canOffboard[term]
flag will be set.canOffboard[term]
flag is set; anyone can execute theoffboard()
to offboard the term.cleanup()
can be invoked to explicitly terminate the term and reset thecanOffboard[term]
flag.The following roughly describes the steps for re-onboarding the offboarded lending term through the
LendingTermOnboarding
contract:proposeOnboard()
.Vulnerability Details
This report describes the vulnerability in the
LendingTermOffboarding
contract, allowing an attacker to force the re-onboarded lending term to offboard by overriding the DAO vote offboarding mechanism. In other words, the attacker is not required to create an offboarding poll and wait for the vote to succeed in offboarding the target term. Furthermore, the attacker is not required to possess any guild tokens.The following explains the attack steps:
canOffboard[term]
flag will be set by thesupportOffboard()
, and the lending term will be offboarded via theoffboard()
.cleanup()
), all loans issued must be called and closed. Therefore, there will be a time gap waiting for all loans to be closed in this step.cleanup()
. Thus, thecanOffboard[term]
flag is still active.offboard()
to force offboarding the re-onboarded term, overriding the DAO vote offboarding mechanism (since thecanOffboard[term]
flag is still active).The attacker can suddenly offboard the re-onboarded term whenever they will, regardless of how long the target term has been re-onboarded, how long the offboarding poll has expired, or how long the
canOffboard[term]
flag has been activated (please refer to theProof of Concept
section for the coded PoC).Furthermore, the attacker does not need to hold guild tokens to exploit this vulnerability.
@1 -- Once the voting weight is enough, the canOffboard[term] flag will be set
: https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/governance/LendingTermOffboarding.sol#L138-L140@2 -- If the canOffboard[term] flag is set, the term can be offboarded
: https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/governance/LendingTermOffboarding.sol#L154@3 -- To clean up the term, all its loans must be closed
: https://github.com/code-423n4/2023-12-ethereumcreditguild/blob/2376d9af792584e3d15ec9c32578daa33bb56b43/src/governance/LendingTermOffboarding.sol#L177-L180Impact
The active re-onboarded lending term can be forced to immediately offboard, bypassing the DAO vote offboarding, which is the protocol's core mechanism. Subsequently, the attacked lending term will block all new loans from being issued and prevent guild holders from voting for the term.
Moreover, all loans previously issued by the attacked term can be called putting the loans for bidding silently (since the attacker bypasses the DAO vote offboarding mechanism). If one of the loans fails on bidding to fill up the loan's principal, the term's loss will be notified. As a result, all users who stake credit tokens through the
SurplusGuildMinter
contract to vote for the attacked term will be slashed with all their credit principal and guild rewards.Proof of Concept
This section provides a coded PoC.
Place the
testPoCReplayOffboarding()
in the.test/unit/governance/LendingTermOffboarding.t.sol
file and run the test using theforge test --match-test testPoCReplayOffboarding -vvv
command.The PoC explains the attack steps described in the
Vulnerability Details
section.Tools Used
Manual Review
Recommended Mitigation Steps
Implement a proper mechanism for resetting the
canOffboard[term]
flag once the associated lending term has been re-onboarded.It is worth noting that the
canOffboard[term]
flag should be reset after the term re-onboarding operation has successfully been executed by Timelock (when the term is already active) to prevent other security issues.Assessed type
Other
The text was updated successfully, but these errors were encountered: