There are 3 owner functions within the `InheritanceManager.sol` contract that break the core invariant - "EVERY transaction the owner does with this contract must reset the 90 days timer ". This results in an incorrect deadline being set even though the owner is active and funds being inheritable incorrectly.
The Protocol declares that one of the core invariant's is “ EVERY transaction the owner does with this contract must reset the 90 days timer”. This core invariant is broken by the following 3 functions in InheritanceManager.sol
contractInteractions(): L120
createEstateNFT(): L143
removeBeneficiary(): L163
When any of the above functions are called by the owner, they do not reset the 90 day timer. If an owner, only interacts with any of these 3 functions - which are very important - the deadline will never be correctly set and even though they are active, the funds/assets will become inheritable to beneficiaries therefore breaking the contracts functionality.
The impact of this bug is High because it breaks the core invariant of the Protocol. Furthermore, if the owner does not interact with any functions that correctly reset the timer, then beneficiaries will be able to “inherit” funds while an owner is still active further breaking the contracts logic and purpose.
I have outlined the code for one of the functions that have been correctly implemented - addBeneficiery
- and compared it to the 3 functions that break the core invariant due to missing the _setDeadline()
function call.
A Correct implementation of
addBeneficiery
owner function implemented correctly with the_setDeadline()
Incorrect implementation of
contractInteractions
owner function
Incorrect implementation of
createEstateNFT
owner function
Incorrect implementation of
removeBeneficiary
owner function
This vulnerability was found using:
Manual Code Review
The recommend mitigation to fix this issue is to implement the function call to the internal function _setDeadline()
within the 3 vulnerable functions
createEstateNFT
contractInteractions
removeBeneficiary
Using removeBeneficiary()
as an example
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.