mirror of
https://github.com/waku-org/nwaku.git
synced 2025-01-14 00:46:44 +00:00
fix(rln): nullifierlog vulnerability (#2855)
This commit is contained in:
parent
7b97c8003c
commit
dad054d6b3
@ -279,8 +279,10 @@ proc validateMessageAndUpdateLog*(
|
||||
if proofMetadataRes.isErr():
|
||||
return MessageValidationResult.Invalid
|
||||
|
||||
# insert the message to the log (never errors)
|
||||
discard rlnPeer.updateLog(msgProof.epoch, proofMetadataRes.get())
|
||||
# insert the message to the log (never errors) only if the
|
||||
# message is valid.
|
||||
if isValidMessage == MessageValidationResult.Valid:
|
||||
discard rlnPeer.updateLog(msgProof.epoch, proofMetadataRes.get())
|
||||
|
||||
return isValidMessage
|
||||
|
||||
@ -308,22 +310,25 @@ proc appendRLNProof*(
|
||||
let proof = rlnPeer.groupManager.generateProof(input, epoch, nonce).valueOr:
|
||||
return err("could not generate rln-v2 proof: " & $error)
|
||||
|
||||
|
||||
msg.proof = proof.encode().buffer
|
||||
return ok()
|
||||
|
||||
proc clearNullifierLog*(rlnPeer: WakuRlnRelay) =
|
||||
# clear the first MaxEpochGap epochs of the nullifer log
|
||||
# if more than MaxEpochGap epochs are in the log
|
||||
# note: the epochs are ordered ascendingly
|
||||
if rlnPeer.nullifierLog.len().uint <= rlnPeer.rlnMaxEpochGap:
|
||||
return
|
||||
let currentEpoch = fromEpoch(rlnPeer.getCurrentEpoch())
|
||||
|
||||
let countToClear = rlnPeer.nullifierLog.len().uint - rlnPeer.rlnMaxEpochGap
|
||||
trace "clearing epochs from the nullifier log", count = countToClear
|
||||
let epochsToClear = rlnPeer.nullifierLog.keys().toSeq()[0 ..< countToClear]
|
||||
for epoch in epochsToClear:
|
||||
rlnPeer.nullifierLog.del(epoch)
|
||||
var epochsToRemove: seq[Epoch] = @[]
|
||||
for epoch in rlnPeer.nullifierLog.keys():
|
||||
let epochInt = fromEpoch(epoch)
|
||||
|
||||
# clean all epochs that are +- rlnMaxEpochGap from the current epoch
|
||||
if (currentEpoch+rlnPeer.rlnMaxEpochGap) <= epochInt or epochInt <= (currentEpoch-rlnPeer.rlnMaxEpochGap):
|
||||
epochsToRemove.add(epoch)
|
||||
|
||||
for epochRemove in epochsToRemove:
|
||||
trace "clearing epochs from the nullifier log", currentEpoch = currentEpoch, cleanedEpoch = fromEpoch(epochRemove)
|
||||
rlnPeer.nullifierLog.del(epochRemove)
|
||||
|
||||
proc generateRlnValidator*(
|
||||
wakuRlnRelay: WakuRLNRelay, spamHandler = none(SpamHandler)
|
||||
|
Loading…
x
Reference in New Issue
Block a user