Skip to content

[bug]: BOLT 11 Compliance: Invoice r field don't reject empty routing hints #9915

Description

@erickcestari

Background

After doing some differential fuzzing between CLN, rust-lightning and LND using bitcoinfuzz I noticed that LND currently accepts bolt11 invoices with empty routing hints in the r field, while CLN and rust-lightning rejects. This violates BOLT 11 specification requirements.

BOLT 11 Requirements:

  • r field "MUST contain one or more ordered entries, indicating the forward route from a public node to the final destination"
  • Each hop must contain exactly 51 bytes (pubkey: 33B, short_channel_id: 8B, fee_base_msat: 4B, fee_proportional_millionths: 4B, cltv_expiry_delta: 2B)

Current Behavior: The parseRouteHint function returns an empty slice without error when base256Data length is 0, since 0 % 51 = 0 passes the modulo check and the parsing loop never executes.

Expected Behavior: Reject invoices with empty r fields.

Impact:

  • Spec non-compliance
  • Inconsistent behavior between Lightning implementations

Proposed Fix: Add empty data check in parseRouteHint after bech32 conversion:

// Check for empty route hint
if len(base256Data) == 0 {
    return nil, fmt.Errorf("r field contains no hop data")
}

Example invoice:

lnbc1p5q54jjpp5fe0dhqdt4m97psq0fv3wjlk95cclnatvuvq49xtnc8rzrp0dysusdqqcqzzsxqrrs0fppqy6uew5229e67r9xzzm9mjyfwseclstdgsp5rnanj9x5rnanj9xnq28hhgd6c7yxlmh6lta047h6lqqqqqqqqqqqrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq6qqqqqqqqqqqqqqqqqqq9kvnknh7ug5mttnqqqqqqqqq8849gwfhvnp9rqpe0cy97

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugUnintended code behaviourinvoices

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions