#43312 [BC-Medium] get_state_proof() is called with the current version leading to the epoch_changes of the StateProof always being empty
Description
Brief/Intro
Vulnerability Details
fn get_state_proof_with_ledger_info(
&self,
known_version: u64,
ledger_info_with_sigs: LedgerInfoWithSignatures,
) -> Result<StateProof> {
gauged_api("get_state_proof_with_ledger_info", || {
let ledger_info = ledger_info_with_sigs.ledger_info();
ensure!(
known_version <= ledger_info.version(),
"Client known_version {} larger than ledger version {}.",
known_version,
ledger_info.version(),
);
let known_epoch = self.ledger_db.metadata_db().get_epoch(known_version)?;
let end_epoch = ledger_info.next_block_epoch();
let epoch_change_proof = if known_epoch < end_epoch {
let (ledger_infos_with_sigs, more) =
self.get_epoch_ending_ledger_infos(known_epoch, end_epoch)?;
EpochChangeProof::new(ledger_infos_with_sigs, more)
@> } else {
EpochChangeProof::new(vec![], /* more = */ false)
};
Ok(StateProof::new(ledger_info_with_sigs, epoch_change_proof))
})
}Impact Details
References
Proof of Concept
Proof of Concept
Previous#43307 [BC-High] Not verifying the signatures upon execution leads to direct loss of fundsNext#43315 [BC-Critical] DA Light Node Can Be DoSed Due to Lack of Batch Validation
Was this helpful?