- From: William Casarin <jb55@jb55.com>
- Date: Sat, 8 Jul 2023 22:57:08 -0700
- To: patches@damus.io
- Cc: dev@damus.io, nostr-protocol@googlegroups.com, public-nostr@w3.org, William Casarin <jb55@jb55.com>, Tony Giorgio <tonygiorgio@protonmail.com>, benthecarman <benthecarman@live.com>, Vitor Pamplona <vitor@vitorpamplona.com>, Kieran <kieran@harkin.me>, Jonathan Staab <shtaab@gmail.com>, Mike Dilger <mike@mikedilger.com>
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>
Cc: Kieran <kieran@harkin.me>
Cc: Jonathan Staab <shtaab@gmail.com>
Cc: Mike Dilger <mike@mikedilger.com>
Signed-off-by: William Casarin <jb55@jb55.com>
---
damus/Models/HomeModel.swift | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/damus/Models/HomeModel.swift b/damus/Models/HomeModel.swift
index e727c9c1..b52a0d23 100644
--- a/damus/Models/HomeModel.swift
+++ b/damus/Models/HomeModel.swift
@@ -1239,11 +1239,24 @@ enum ProcessZapResult {
// securely get the zap target's pubkey. this can be faked so we need to be
// careful
func get_zap_target_pubkey(ev: NostrEvent, events: EventCache) -> String? {
- if let etag = event_tag(ev, name: "e") {
+ 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 damus_state.events.lookup(etag)?.pubkey
} else {
- return event_tag(ev, name: "p")
+ 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
}
}
--
2.39.2 (Apple Git-143)
Received on Sunday, 9 July 2023 06:14:58 UTC