<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://security.lightning.engineering/feed.xml" rel="self" type="application/atom+xml" /><link href="https://security.lightning.engineering/" rel="alternate" type="text/html" /><updated>2026-08-14T18:10:41+00:00</updated><id>https://security.lightning.engineering/feed.xml</id><title type="html">Lightning Labs Security Advisories</title><subtitle>These are the security advisories for Lightning Labs products. Please report any security issues to security@lightning.engineering</subtitle><entry><title type="html">LND ChannelReestablish Message Queue Out-of-Memory</title><link href="https://security.lightning.engineering/2026/08/11/lnd-channel-reestablish-oom.html" rel="alternate" type="text/html" title="LND ChannelReestablish Message Queue Out-of-Memory" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-channel-reestablish-oom</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-channel-reestablish-oom.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>A peer with pending channels open against a victim lnd node could exhaust the
node’s heap memory by spamming <code class="language-plaintext highlighter-rouge">channel_reestablish</code> messages. Each
connection’s <code class="language-plaintext highlighter-rouge">chanMsgStream</code> holds up to 1,000 queued messages; pending
channels do not drain that stream until the link becomes active. A single
attacker connection could therefore accumulate approximately 20 MB of heap.
Scaled across the maximum permitted number of pending channels, an attacker
could force the victim to allocate approximately 20 GB of heap memory,
OOM-killing the process.</p>

<p>There is no fund-loss path. The node restarts cleanly, but the attack can be
resumed as long as the pending channel relationships remain.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>OOM crash. The node restarts cleanly; no fund-loss path and no sustained liveness invalidation.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can initiate the channel openings needed to reach the affected queue; no funded channel or prior trust relationship is required.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>Saturating a single connection’s queue is trivial; scaling to the pending-channel limit is feasible for a motivated attacker.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. The attacker must have pending channels in place for each target; the attack does not propagate automatically.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>
by capping the <code class="language-plaintext highlighter-rouge">chanMsgStream</code> queue size and reducing the global
pending-channel limit from 1,000 to 50. Users should update to
v0.19.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Identified internally by the Lightning Labs security team.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND Gossip Query Denial of Service</title><link href="https://security.lightning.engineering/2026/08/11/lnd-gossip-queries-dos.html" rel="alternate" type="text/html" title="LND Gossip Query Denial of Service" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-gossip-queries-dos</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-gossip-queries-dos.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>A peer could render a victim lnd node unresponsive by sending a large volume of
gossip query messages. Without per-peer connection limits or bytes-based rate
limiting on gossip query processing, a sustained query stream from a single
peer could exhaust node resources and cause a denial of service.</p>

<p>There is no fund-loss path. The node restarts cleanly, but the attack can be
repeated.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>Transient denial of service. The node restarts cleanly; no fund-loss path and no sustained liveness invalidation.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can send gossip query messages with no prior channel relationship.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>Sending gossip query messages requires no special capability; flooding is straightforward on a default configuration.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. The attacker must establish a direct connection to each target; the attack does not self-propagate.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>
by the combination of two changes: the global inbound non-channel peer
connection limit (also cited on the <a href="/2026/08/11/lnd-p2p-connection-flooding.html">P2P connection
flooding</a> advisory),
and <a href="https://github.com/lightningnetwork/lnd/pull/9607">lnd #9607</a>
(“discovery: unify rate.Limiter across all gossip peers”), which replaces
the previous message-count rate limit with a byte-rate limit on outbound
gossip traffic and exposes it as two new configuration flags
(<code class="language-plaintext highlighter-rouge">--gossip.msg-rate-bytes</code> and <code class="language-plaintext highlighter-rouge">--gossip.msg-burst-bytes</code>). Together these
bound both how many peers can query in parallel and how much serialized
gossip data any one peer can extract per second. Users should update to
v0.19.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Reported to Lightning Labs by Matt Morehouse on 2023-09-15.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>

<h2 id="credit">Credit</h2>

<p>Reported by Matt Morehouse.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND gossip_timestamp_filter Goroutine Exhaustion DoS</title><link href="https://security.lightning.engineering/2026/08/11/lnd-gossip-timestamp-filter-dos.html" rel="alternate" type="text/html" title="LND gossip_timestamp_filter Goroutine Exhaustion DoS" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-gossip-timestamp-filter-dos</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-gossip-timestamp-filter-dos.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>Any peer, with no prior channel relationship, could crash a victim lnd node by repeatedly sending
<code class="language-plaintext highlighter-rouge">gossip_timestamp_filter</code> messages. When lnd receives a
<code class="language-plaintext highlighter-rouge">gossip_timestamp_filter</code>, it creates in-memory copies of all channel
announcements, channel updates, and node announcements whose timestamps fall
within the requested range — potentially more than 200,000 messages for a node
with a complete view of the network graph — and spawns a goroutine to deliver
them one-by-one to the requesting peer. Because lnd continued processing
incoming messages from the same peer while those goroutines were active, an
attacker could send additional <code class="language-plaintext highlighter-rouge">gossip_timestamp_filter</code> messages before the
first batch was delivered, spawning more goroutines and creating additional
in-memory copies of the full announcement set. Repeating this rapidly exhausted
available memory and crashed the node.</p>

<p>There is no fund-loss path. The node restarts cleanly, but the attack can be
repeated.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>OOM crash. The node restarts cleanly; no fund-loss path and no sustained liveness invalidation.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can send <code class="language-plaintext highlighter-rouge">gossip_timestamp_filter</code> messages with no prior channel relationship.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>Trivially executable; repeated filter messages rapidly exhaust memory on any victim with a non-trivial routing graph.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. Each target requires a direct peer connection from the attacker; the attack does not propagate through the network.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High. A reachable non-viral crash-DoS is T3 regardless of how trivially it
triggers.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.18.3-beta">v0.18.3-beta</a>
by <a href="https://github.com/lightningnetwork/lnd/pull/9009">lnd #9009</a> —
specifically commit
<a href="https://github.com/lightningnetwork/lnd/commit/013452cff0788289aae3aa296242c698c9beff9d"><code class="language-plaintext highlighter-rouge">013452c</code></a>,
which replaces the per-syncer gossip-filter semaphore with a single global
one shared across all syncers, bounding total concurrent backlog-send
goroutines regardless of the number of connected peers. (The PR’s title
refers only to its channel-announcement banning changes; the semaphore
refactor rides alongside in the same commit.) Users should update to
v0.18.3-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Reported to Lightning Labs by Matt Morehouse.</li>
  <li>Uptake of the fixed release monitored before public disclosure.</li>
  <li>Matt Morehouse published an independent disclosure: <a href="https://delvingbitcoin.org/t/disclosure-lnd-gossip-timestamp-filter-dos/1859">Disclosure: LND
gossip_timestamp_filter
DoS</a>.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>

<h2 id="credit">Credit</h2>

<p>Reported by Matt Morehouse.</p>

<h2 id="references">References</h2>

<ul>
  <li>Reporter’s disclosure: <a href="https://delvingbitcoin.org/t/disclosure-lnd-gossip-timestamp-filter-dos/1859">Disclosure: LND gossip_timestamp_filter
DoS</a></li>
  <li>Fix: commit <a href="https://github.com/lightningnetwork/lnd/commit/013452cff0788289aae3aa296242c698c9beff9d"><code class="language-plaintext highlighter-rouge">013452c</code></a> in <a href="https://github.com/lightningnetwork/lnd/pull/9009">lnd #9009</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND Gossip ChannelUpdate Suppression via Validation Barrier Poisoning</title><link href="https://security.lightning.engineering/2026/08/11/lnd-gossip-update-suppression.html" rel="alternate" type="text/html" title="LND Gossip ChannelUpdate Suppression via Validation Barrier Poisoning" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-gossip-update-suppression</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-gossip-update-suppression.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>Any peer, with no prior channel relationship, could suppress a victim lnd node’s processing of
<code class="language-plaintext highlighter-rouge">channel_update</code> or <code class="language-plaintext highlighter-rouge">node_announcement</code> messages for a targeted short channel
ID (SCID). The gossiper’s validation barrier gates child messages on the
successful completion of their parent <code class="language-plaintext highlighter-rouge">channel_announcement</code> validation. An
attacker sends many <code class="language-plaintext highlighter-rouge">channel_announcement</code> messages carrying the target SCID
but an incorrect <code class="language-plaintext highlighter-rouge">chain_hash</code>; sending each from a different peer bypasses the
<code class="language-plaintext highlighter-rouge">recentRejects</code> cache, and every such announcement fails validation. Any
legitimate <code class="language-plaintext highlighter-rouge">channel_update</code> for that SCID that arrives while the poisoned
announcements are in flight is bound to the failing parent and is discarded.
Whether a specific legitimate update is caught in that window depends on
timing, so the attack succeeds probabilistically rather than deterministically;
the sustained spam is also observable as a broader gossip DoS.</p>

<p>The victim will see elevated error-log volume in the gossiper. There is no
fund-loss path; affected routing-table entries degrade gracefully when stale,
and routing failures are the worst observable outcome.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>Degraded gossip accuracy for targeted SCIDs. Routing failures may increase, but there is no fund-loss path and the node continues operating normally.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can send <code class="language-plaintext highlighter-rouge">channel_announcement</code> messages with no prior channel relationship.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>Med</td>
      <td>Probabilistic. Flooding is reliable, but whether a specific legitimate <code class="language-plaintext highlighter-rouge">channel_update</code> is caught in the failing-parent window depends on timing. Running the spam at scale hits a non-trivial fraction of updates.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-SCID, per-victim effort. The attack does not propagate through the network.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>.
Users should update to v0.19.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Identified internally by the Lightning Labs security team.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND HTLC First-Stage Sweep Failure Due to Wallet Budget Constraint</title><link href="https://security.lightning.engineering/2026/08/11/lnd-htlc-sweep-budget-failure.html" rel="alternate" type="text/html" title="LND HTLC First-Stage Sweep Failure Due to Wallet Budget Constraint" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-htlc-sweep-budget-failure</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-htlc-sweep-budget-failure.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>An anchor-channel peer could prevent a victim lnd node from recovering the
value of outgoing HTLCs after a force close.</p>

<p>For anchor channels, the first-stage HTLC sweep transaction cannot be funded
from the HTLC output itself; lnd must contribute internal-wallet inputs to pay
for the sweep. To guard against fee-estimate uncertainty, lnd required at
minimum twice the HTLC amount to be available in the internal wallet before
attempting the sweep. Because lnd’s default configuration holds only the anchor
reserve (up to 100,000 sats) in the internal wallet, any outgoing HTLC above
approximately 50,000 sats could go unswept when a channel force-closes — the
budget check fails and no sweep is attempted.</p>

<p>Two failure modes follow from this:</p>

<ul>
  <li>For small HTLCs near the dust limit, the 2× budget guard has no useful
protective effect. These HTLCs cannot be resolved on-chain at all, but lnd
nevertheless left them in place across the commitment confirmation, causing
the incoming channel to force-close as a cascading side effect.</li>
  <li>For larger HTLCs above the wallet-budget threshold, the sweep is skipped. An
attacker who routes a large HTLC onto a victim’s channel and force-closes
can wait for the HTLC to time out on-chain and claim its value via the
timeout path.</li>
</ul>

<p>The organic (non-adversarial) version of this bug was also observed in the
wild: eventual sweeps at very high fee rates once wallet balance became
available, and force closes of incoming channels as a downstream consequence.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Med</td>
      <td>Per-victim fund loss when triggered adversarially. Excessive on-chain sweep fees and cascading incoming-channel force closes when triggered organically — observed in production.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>Med</td>
      <td>Channel partner. The attacker must have an active channel with the victim to route HTLCs through it.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>Med</td>
      <td>The 100k-sat default anchor reserve makes a non-trivial fraction of lnd nodes vulnerable; an attacker running the exploit at scale will successfully hit a meaningful fraction of targets.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. Each attack requires specific HTLC routing on a dedicated channel; the technique does not propagate automatically.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T1.</strong> Rule 2 (Impact = Med, base T1). No promotion (Vector ≠ High). No
demotion (Exploitability ≠ Low; not both Vector and Virality are Low).</p>

<h2 id="patches">Patches</h2>

<p>The two failure modes were addressed by separate changes, all landing in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>:</p>

<ul>
  <li><a href="https://github.com/lightningnetwork/lnd/pull/9068">lnd #9068</a> (“Cancel back
outgoing dust HTLCs before commitment is confirmed”) cancels outgoing dust
HTLCs upstream as soon as the local commitment transaction is broadcast,
rather than waiting for confirmation. This eliminates the cascading
incoming-channel force close for the dust case.</li>
  <li><a href="https://github.com/lightningnetwork/lnd/pull/9274">lnd #9274</a> removes the
hardcoded 2× budget requirement in the first-stage HTLC sweep and routes it
through the configurable <code class="language-plaintext highlighter-rouge">DeadlineHTLCRatio</code> sweeper parameter (default
0.5). Under the new default, the sweep is self-funded from the HTLC output
itself and no longer waits on internal-wallet top-up, closing the fund-loss
path for larger HTLCs.</li>
  <li><a href="https://github.com/lightningnetwork/lnd/pull/9627">lnd #9627</a> (“Sweep
inputs even the budget cannot be covered”) is related hardening: the
sweeper now attempts the sweep even when only part of the budget is
covered by wallet inputs, rather than deferring until more UTXOs are
available.</li>
</ul>

<p>Users should update to v0.19.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Identified internally by the Lightning Labs security team.</li>
  <li>Organic (non-adversarial) manifestations of the bug observed in the wild.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND P2P Connection Flooding File-Descriptor Exhaustion</title><link href="https://security.lightning.engineering/2026/08/11/lnd-p2p-connection-flooding.html" rel="alternate" type="text/html" title="LND P2P Connection Flooding File-Descriptor Exhaustion" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-p2p-connection-flooding</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-p2p-connection-flooding.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>An attacker could exhaust a victim lnd node’s available file descriptors by
opening a large number of inbound connections that do not correspond to any
shared channel. Because lnd imposed no limit on concurrent non-channel peer
connections, an attacker could hold many connections open indefinitely. Once
the file-descriptor limit was reached, the node could no longer open files,
accept or initiate connections, or perform other file-system operations,
rendering it effectively non-functional until restarted.</p>

<p>There is no fund-loss path. Restarting the node clears the excess connections,
but the attack can be immediately resumed.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>File-descriptor exhaustion and associated service unavailability. The node restarts cleanly; no fund-loss path.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can initiate inbound TCP connections with no prior relationship or shared channel.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>Opening TCP connections requires no special capability; saturating the OS file-descriptor limit is straightforward.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. The attacker must establish and hold connections to each target; the attack does not propagate through the network.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>
by introducing a global limit on inbound non-channel peer connections. Users
should update to v0.19.0-beta or later to be protected. Node operators running
large routing nodes are also recommended to set their OS-level open-file limit
(<code class="language-plaintext highlighter-rouge">ulimit -n</code>) appropriate to their expected peer count.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Identified internally by the Lightning Labs security team.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND Pending Commitment Excessive HTLC Failback Exploit</title><link href="https://security.lightning.engineering/2026/08/11/lnd-pending-commitment-failback-exploit.html" rel="alternate" type="text/html" title="LND Pending Commitment Excessive HTLC Failback Exploit" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-pending-commitment-failback-exploit</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-pending-commitment-failback-exploit.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>An attacker with a direct channel to a victim lnd node could steal the value of
one or more in-flight HTLCs by combining an available denial-of-service vector
with a race condition in lnd’s handling of pending commitment transactions.</p>

<p>A channel peer can hold two valid commitment transactions at a time: a
to-be-revoked commitment and a pending commitment. When the remote party’s
pending commitment confirms, lnd fails back all HTLCs that were present on the
to-be-revoked commitment but are absent from the pending commitment, on the
assumption that those HTLCs’ outcomes have already been forwarded upstream.
Under normal conditions this is safe. The race condition arises when the victim
node is crashed at a precise moment — after the preimage for an outgoing HTLC
becomes known but before that result has propagated to the upstream node. An
attacker who controls both the crash timing (using an available unpatched DoS
vector) and the confirming commitment can then claim the outgoing HTLC via the
preimage path while the victim’s node, upon restart, fails back the incoming
HTLC — capturing the value from both ends.</p>

<p>The attack requires the attacker to have at least one direct channel with the
victim and access to an unpatched denial-of-service vector to control crash
timing. Under those conditions it can be carried out in 10–20 minutes.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Med</td>
      <td>Per-victim fund loss; the value of one or more HTLCs can be stolen.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>Med</td>
      <td>Channel partner. The attacker must have at least one direct channel with the victim and be able to route HTLCs through it.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>Med</td>
      <td>Requires specific conditions — a direct channel and an available DoS vector to control crash timing — but is reliably executable when those conditions are met. Without a DoS vector the race window is extremely narrow and very unlikely to trigger in practice.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. Each attack requires dedicated channel setup and per-victim coordination; the technique does not propagate automatically.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T1.</strong> Rule 2 (Impact = Med, base T1). No promotion (Vector ≠ High). No
demotion (Exploitability ≠ Low; not both Vector and Virality are Low).</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.18.0-beta">v0.18.0-beta</a>
by <a href="https://github.com/lightningnetwork/lnd/pull/8667">lnd #8667</a> (“Merge new
sweeper branch to master”), which brought
<a href="https://github.com/lightningnetwork/lnd/pull/8514">lnd #8514</a> into master
along with its <code class="language-plaintext highlighter-rouge">isPreimageAvailable</code> guard on the fail-back path (commit
<a href="https://github.com/lightningnetwork/lnd/commit/6f0c2b5bab68c156262c1e8e2286f9a6b36bbbd7"><code class="language-plaintext highlighter-rouge">6f0c2b5</code></a>).
The guard causes <code class="language-plaintext highlighter-rouge">checkRemoteDiffActions</code> to skip failing back an outgoing
HTLC that is present on the to-be-revoked commitment but absent from the
pending commitment when the preimage is already known, eliminating the race
window. Users should update to v0.18.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Reported to Lightning Labs by Matt Morehouse as part of a broader
contractcourt and sweeper security audit.</li>
  <li>Fix merged and released in lnd v0.18.0-beta.</li>
  <li>Matt Morehouse requested public disclosure after the v0.19.0-beta release.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>

<h2 id="credit">Credit</h2>

<p>Reported by Matt Morehouse.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND query_short_chan_ids Gossip Queue Out-of-Memory</title><link href="https://security.lightning.engineering/2026/08/11/lnd-query-short-chan-ids-oom.html" rel="alternate" type="text/html" title="LND query_short_chan_ids Gossip Queue Out-of-Memory" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-query-short-chan-ids-oom</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-query-short-chan-ids-oom.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>Any peer, with no prior channel relationship, could exhaust a victim lnd node’s memory by sending a
flood of <code class="language-plaintext highlighter-rouge">query_short_chan_ids</code> gossip messages. Two compounding buffers amplify
the attack: the gossiper’s per-peer message stream holds up to 1,000 queued
messages, and each <code class="language-plaintext highlighter-rouge">GossipSyncer</code> maintains an additional 100-message buffer.
Each deserialized <code class="language-plaintext highlighter-rouge">query_short_chan_ids</code> message can be up to 128 KB (larger
when zlib-encoded). A single peer can therefore force the victim to allocate
approximately 140 MB of heap; repeated across multiple peers the node quickly
runs out of memory and the process is OOM-killed.</p>

<p>There is no fund-loss path. The node restarts cleanly, but the attack can be
repeated.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>OOM crash. The node restarts cleanly; no fund-loss path and no sustained liveness invalidation.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can send gossip messages with no prior channel relationship.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>Flooding the buffers requires only repeated message sends; the stacked per-peer and per-syncer buffers make this reliably achievable.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. Each target requires a direct peer connection from the attacker; the attack does not propagate automatically.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>.
The connection limit introduced to address the P2P connection-flooding issue
also caps the per-peer memory exposure from this attack. Users should update to
v0.19.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Reported to Lightning Labs by Matt Morehouse.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>

<h2 id="credit">Credit</h2>

<p>Reported by Matt Morehouse.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND update_fee Breach Fee-Burn Exploit</title><link href="https://security.lightning.engineering/2026/08/11/lnd-update-fee-breach-exploit.html" rel="alternate" type="text/html" title="LND update_fee Breach Fee-Burn Exploit" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-update-fee-breach-exploit</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-update-fee-breach-exploit.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>A channel initiator could cause a victim to recover little or nothing from a
breach transaction by manipulating <code class="language-plaintext highlighter-rouge">update_fee</code> immediately before executing a
fraudulent close.</p>

<p>The attack proceeds in five steps. Alice (the channel initiator) sends Bob an
<code class="language-plaintext highlighter-rouge">update_fee</code> setting the fee rate high enough to burn the majority of the
channel balance to transaction fees, completing a full commitment exchange. She
then sends a second <code class="language-plaintext highlighter-rouge">update_fee</code> returning the fee rate to a normal level,
completing another full exchange. At this point Alice’s node holds a revoked
high-fee commitment. Alice performs a circular rebalance to empty the channel
into another of her channels, then broadcasts the revoked high-fee commitment.
Bob’s breach-remedy transaction successfully spends the breach output, but the
fee rate in that commitment consumes nearly the entire channel balance — leaving
Bob with at most the channel reserve.</p>

<p>Two variants exist. In the griefing variant Alice simply destroys the channel
balance at a cost to herself of the reserve (approximately 1% of capacity). In
the profit-seeking variant Alice colludes with a miner to capture the burned
fees, netting approximately 97% of the channel balance at a reserve cost of 1%.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Med</td>
      <td>Per-victim fund loss. The victim’s breach-remedy transaction is valid, but the channel balance has been burned to fees. Loss is bounded by the affected channel; each additional victim requires the attacker to fund a new channel (capital lock, on-chain cost), so damage is not disproportionate to attacker effort.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>Med</td>
      <td>Channel partner only. The attacker must be the channel initiator in a funded channel with the victim.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>The griefing variant is reliable against any channel partner. The profit-seeking variant requires miner collusion and is harder. The dominant variant drives the score.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Med</td>
      <td>Replayable template. The same attack can be applied to any channel Alice has initiated, but each attempt requires a separately funded, capital-locked channel — so the marginal cost per victim is real, not near-zero, and virality is Med rather than High.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T1.</strong> Rule 2 (Impact = Med, base T1). No promotion (Vector ≠ High). No
demotion (Exploitability ≠ Low; not both Vector and Virality are Low).</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.18.3-beta">v0.18.3-beta</a>
by <a href="https://github.com/lightningnetwork/lnd/pull/8824">lnd #8824</a> (“multi:
include commitment fees in dust calculation”, commit
<a href="https://github.com/lightningnetwork/lnd/commit/ac4ef289260cb5c21ab2c87b53b9e5285b73ab7d"><code class="language-plaintext highlighter-rouge">ac4ef28</code></a>).
On receiving an <code class="language-plaintext highlighter-rouge">update_fee</code>, the recipient now computes the proposed
feerate’s total commitment-fee-plus-dust exposure on both commitments; if
either would exceed the configurable <code class="language-plaintext highlighter-rouge">MaxFeeExposure</code> limit (default 500,000
sats), the update is rejected and the channel link fails. The same limit is
applied on HTLC adds so that an attacker cannot bypass it by stuffing HTLCs
to inflate commitment weight past the cap. Users should update to
v0.18.3-beta or later to be protected.</p>

<p>Note: <code class="language-plaintext highlighter-rouge">MaxFeeExposure</code> is an absolute cap, not a fraction of channel
capacity. On channels well above ~500,000 sats total balance the burn is
bounded by the cap; on smaller channels a malicious initiator can still
burn a significant fraction of the balance within it.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Reported to Lightning Labs by David Harding.</li>
  <li>Fix merged and released in lnd v0.18.3-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>

<h2 id="credit">Credit</h2>

<p>Reported by David Harding.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry><entry><title type="html">LND Validation Barrier Map Leak via ChannelAnnouncement Spam</title><link href="https://security.lightning.engineering/2026/08/11/lnd-validation-barrier-oom.html" rel="alternate" type="text/html" title="LND Validation Barrier Map Leak via ChannelAnnouncement Spam" /><published>2026-08-11T09:00:00+00:00</published><updated>2026-08-11T09:00:00+00:00</updated><id>https://security.lightning.engineering/2026/08/11/lnd-validation-barrier-oom</id><content type="html" xml:base="https://security.lightning.engineering/2026/08/11/lnd-validation-barrier-oom.html"><![CDATA[<h2 id="impact">Impact</h2>

<p>Any peer, with no prior channel relationship, could exhaust a victim lnd node’s memory by spamming
<code class="language-plaintext highlighter-rouge">channel_announcement</code> messages. The gossiper’s validation barrier initializes
internal dependency maps (<code class="language-plaintext highlighter-rouge">nodeAnnDependencies</code>, <code class="language-plaintext highlighter-rouge">chanEdgeDependencies</code>) for
each incoming announcement but failed to clean those maps up after processing.
An attacker that sends a continuous stream of <code class="language-plaintext highlighter-rouge">channel_announcement</code> messages
fills the maps without bound, eventually OOM-killing the process.</p>

<p>There is no fund-loss path. The node restarts cleanly once the attacker
disconnects, but the attack can be repeated.</p>

<h2 id="severity">Severity</h2>

<p>Scored against the <a href="/severity/">Lightning Labs severity
taxonomy</a> (4-dimension rubric):</p>

<table>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Score</th>
      <th>Reasoning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Impact</td>
      <td>Low</td>
      <td>OOM crash. The node restarts cleanly when the attacker disconnects; no fund-loss path and no sustained liveness invalidation.</td>
    </tr>
    <tr>
      <td>Attack Vector</td>
      <td>High</td>
      <td>Network. Any peer can send <code class="language-plaintext highlighter-rouge">channel_announcement</code> messages with no prior channel relationship.</td>
    </tr>
    <tr>
      <td>Exploitability</td>
      <td>High</td>
      <td>Trivially executable; a continuous stream of announcements saturates the maps on a default configuration.</td>
    </tr>
    <tr>
      <td>Virality</td>
      <td>Low</td>
      <td>Per-victim. The attacker must hold a connection to each target; the attack does not propagate through the network.</td>
    </tr>
  </tbody>
</table>

<p><strong>Result: T3.</strong> Rule 3 (Impact = Low, base T3); no promotion because Virality is
not High. A reachable non-viral crash-DoS is T3 regardless of how trivially it
triggers.</p>

<h2 id="patches">Patches</h2>

<p>The issue was fixed in lnd
<a href="https://github.com/lightningnetwork/lnd/releases/tag/v0.19.0-beta">v0.19.0-beta</a>.
Users should update to v0.19.0-beta or later to be protected.</p>

<h2 id="disclosure-timeline">Disclosure timeline</h2>

<ul>
  <li>Identified internally by the Lightning Labs security team.</li>
  <li>Fix merged and released in lnd v0.19.0-beta.</li>
  <li>Public disclosure: 2026-08-11.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Impact]]></summary></entry></feed>