#39882 [BC-Insight] data unsubscribe same node replay
#39882 [BC-Insight] Data unsubscribe same node replay
Description
Description
network.registerExternalPost('requestdata', (req, res) => {
let err = validateTypes(req, { body: 'o' })
if (err) {
/* prettier-ignore */ if (logFlags.error) warn(`requestdata: bad req ${err}`)
res.json({ success: false, error: err })
return
}
err = validateTypes(req.body, {
tag: 's',
})
if (err) {
/* prettier-ignore */ if (logFlags.error) warn(`requestdata: bad req.body ${err}`)
res.json({ success: false, error: err })
return
}
const dataRequest = req.body
if (logFlags.p2pNonFatal) info('dataRequest received', Utils.safeStringify(dataRequest))
const foundArchiver = archivers.get(dataRequest.publicKey)
if (!foundArchiver) {
const archiverNotFoundErr = 'Archiver not found in list'
/* prettier-ignore */ if (logFlags.error) warn(archiverNotFoundErr)
res.json({ success: false, error: archiverNotFoundErr })
return
}
const invalidTagErr = 'Tag is invalid'
const archiverCurvePk = crypto.convertPublicKeyToCurve(foundArchiver.publicKey)
if (!crypto.authenticate(dataRequest, archiverCurvePk)) {
/* prettier-ignore */ if (logFlags.error) warn(invalidTagErr)
res.json({ success: false, error: invalidTagErr })
return
}
/* prettier-ignore */ if (logFlags.p2pNonFatal) info('Tag in data request is valid')
if (config.p2p.experimentalSnapshot && config.features.archiverDataSubscriptionsUpdate) {
if (dataRequest.dataRequestType === DataRequestTypes.SUBSCRIBE) {
// if the archiver is already in the recipients list, remove it first
if (dataRequest.nodeInfo && recipients.has(dataRequest.nodeInfo.publicKey)) {
removeArchiverConnection(dataRequest.nodeInfo.publicKey)
recipients.delete(dataRequest.nodeInfo.publicKey)
}
if (recipients.size >= config.p2p.maxArchiversSubscriptionPerNode) {
const maxArchiversSupportErr = 'Max archivers support reached'
warn(maxArchiversSupportErr)
res.json({ success: false, error: maxArchiversSupportErr })
return
}
addDataRecipient(dataRequest.nodeInfo, dataRequest)
}
if (dataRequest.dataRequestType === DataRequestTypes.UNSUBSCRIBE) {
removeDataRecipient(dataRequest.publicKey)
removeArchiverConnection(dataRequest.publicKey)
}
res.json({ success: true })
return
}
delete dataRequest.publicKey
delete dataRequest.tag
const dataRequestCycle = dataRequest.dataRequestCycle
const dataRequestStateMetaData = dataRequest.dataRequestStateMetaData
const dataRequests = []
if (dataRequestCycle) {
dataRequests.push(dataRequestCycle)
}
if (dataRequestStateMetaData) {
dataRequests.push(dataRequestStateMetaData)
}
if (dataRequests.length > 0) {
addDataRecipient(dataRequest.nodeInfo, dataRequests)
}
res.json({ success: true })
})
Proof of Concept
Proof of Concept
Impact
Previous#39364 [BC-Critical] Trusting heavily on "appData" enables infinite SHM duplication through double-spend exploitNext#39812 [BC-Critical] Bypass `SetCertTime` transaction signature check #1
Was this helpful?