Network not being able to confirm new transactions (total network shutdown)
Description
Impact
Bypass the signature of SetCertTime transaction, which allows for draining any validators balance.
Note: same impact as report 33750 but a different root cause.
Root Cause
There is an inconsistency between the function isSetCertTimeTx and the function isInternalTx, specifically with regards to .tx.isInternalTx. This makes it so that SetCertTime transactions with .tx.isInternalTx = true don't undergo SetCertTime validation.
Attack Flow
A malicious user submits a SetCertTime transaction on behalf of someone else (nominator == victim), causing a fee to be deducted from their account. The malicious user can then continue doing so until the node is kicked / drained.
isSetCertTimeTx returns false if tx.isInternalTx isn't set to true, even if tx.internalTXType === InternalTXType.SetCertTime:
When applying a SetCertTime transaction, the check is:
in order to call applySetCertTimeTx even if tx.isInternalTx isn't set to true, as long as isInternalTx returns true, which can happen if tx.tx.isInternalTx is true: