Hi Rusty, I actually think I answered most of these questions in my previous post.
- We do remember everything about the invoice in the db. - We check where it is going (internal or external). - We can't meaningfully check the signature (we don't know "our" pubkey, LNbits supports many different LN backends, some without that info). - The problem is we index invoices by preimage_hash and assume it commits to payment details. This is not a super-weird setup, I've contacted multiple service providers before posting and most do the same thing. Those that were safe were using the mitigation steps I outlined in my OP. Happy to expand on this in more detail if needed. Best Calle ------- Original Message ------- On Thursday, July 6th, 2023 at 09:10, Rusty Russell <ru...@rustcorp.com.au> wrote: > Um, this is a super-weird setup AFAICT. > > You generate an invoice, but you don't remember anything about it? Um, > OK, stateless invoices are a thing, but there's a metadata field for > that? > > Someone pays an invoice, you don't check the place it's going (which, > y'know, signed it), you check some other field? > > I've never used lnbits and I'm clearly missing something... > > Thanks! > Rusty. > > callebtc via Lightning-dev lightning-dev@lists.linuxfoundation.org > > writes: > > > Dear list, > > > > earlier last month, our team at LNbits discovered a rather interesting > > exploit which wich would enable an attacker to create balances out of thin > > air by abusing a quirk in how invoices are handled internally. We've > > patched this in LNbits version 0.10.5 and urge anyone to update ASAP if you > > haven't done so already. I want to describe the attack here, since my gut > > feeling is that carrying out the same exploit is possible in other > > Lightning applications. If you're working on custodial wallets, payment > > processors, account management software, etc. you probably want to read > > this. > > > > In short, the attacker was able to insert a bolt-11 payment hash of payment > > A into a different payment, creating a malicious invoice B that can trick > > the backend into believing that B == A. > > > > Here is how it goes: > > > > - Attacker creates invoice A of amount 1000 sat in LNbits > > - Attacker creates invoice B' of amount 1 sat on her own node > > - Attacker deserializes B', inserts payment_hash(A) into payment_hash(B), > > re-signs the invoice, and serializes it again, producing malicious invoice B > > - Attacker creates a new account in LNbits and pays B > > > > - LNbits backend uses payment_hash(B) to check whether this is an internal > > payment or a payment via LN > > - Backend finds A in its database since we implicitly assume that > > payment_hash(A) commits to A > > > > ** This is the critical part! Payment hashes do NOT commit to any payment > > details (like amount) but only to the preimage! ** > > > > - Backend settles payment internally by crediting A debiting B > > - Attacker has "created" 999 sats > > > > Mitigation: > > > > The mitigation is quite simple. Backends should either use self-generated > > unique "checking id's" for looking up internal payments or use additional > > checks to make sure that the invoice details have not been messed around > > with (e.g., asserting amount(A) == amount(B)). > > > > Lessons: > > > > I think there are two lessons here. First, it's good to realize the level > > of sophistication of LN-savvy attackers. This attack clearly involves a > > fundamental understanding of bolt-11 and requires custom tooling to produce > > the malicious invoice. > > > > The second lesson is more valuable: The "payment hash" of an invoice is not > > a "payment" hash but merely a "preimage" hash – and nothing else. Naming > > this field as such increases the chance of developers implicitly assuming > > that the hash commits to payment details like amount, pubkey, etc. I will > > from now on call this simply the "preimage hash" and invite you to do so > > too. > > > > Best > > > > Calle > > _______________________________________________ > > Lightning-dev mailing list > > Lightning-dev@lists.linuxfoundation.org > > https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev _______________________________________________ Lightning-dev mailing list Lightning-dev@lists.linuxfoundation.org https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev