Prevent forged profile zap attacks
The fake note zap attack made me realize that there is a way to do fake profile zaps using a similar technique. Since damus only checks the first ptag if it is a profile zap, this means you could include multiple ptags, the first one being the fake profile with the fake zapper, and the second p tag as the real target. This would allow a fake zapper to create a fake a zap, while the zap notification would still appear for the second ptag because damus listens for zap events via #p, and that would match the second ptag. To fix this, ensure that zaps only have at most 1 ptag and 0 or 1 etag. my CLN zapper checks this but if we don't check this here as well then we run into fake zap issues. Changelog-Fixed: Fix potential fake profile zap attacks Cc: Tony Giorgio <tonygiorgio@protonmail.com> Cc: benthecarman <benthecarman@live.com> Cc: Vitor Pamplona <vitor@vitorpamplona.com>
This commit is contained in:
@@ -1242,10 +1242,20 @@ func get_zap_target_pubkey(ev: NostrEvent, events: EventCache) -> String? {
|
||||
let etags = ev.referenced_ids
|
||||
|
||||
if let etag = etags.first {
|
||||
// ensure that there is only 1 etag to stop fake note zap attacks
|
||||
guard etags.count == 1 else {
|
||||
return nil
|
||||
}
|
||||
// we can't trust the p tag on note zaps because they can be faked
|
||||
return events.lookup(etag.id)?.pubkey
|
||||
} else {
|
||||
let ptags = ev.referenced_pubkeys
|
||||
|
||||
// ensure that there is only 1 ptag to stop fake profile zap attacks
|
||||
guard ptags.count == 1 else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ptags.first?.id
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user