The password-change endpoint on a rebooting LND node does not require a macaroon.
That single line, buried in BTCPay Server's September advisory, is the entire event. Everything downstream — the probing bots, the extracted funds, the 3 BTC bounty — is a consequence of an authentication gap that opens for a few minutes at a time, every time a node restarts. Attackers built automation around it. Operators did not.
BTCPay Server is a self-hosted, open-source Bitcoin payment processor. No token, no foundation sale, no venture narrative to defend. It sits between merchants and the Lightning Network and depends on LND — Lightning Labs' node implementation — for channel and wallet management. Reverse proxy in front. Docker underneath. Wallet behind.
It occupies the trust-critical node of the Bitcoin stack. Upstream it touches Bitcoin Core and LND. Downstream it holds real merchant funds. Its failures have spillover effects a normal open-source bug does not.
Two incidents, thirty days apart. August: an attacker reached a merchant node, obtained an admin macaroon, and moved funds. Standard on-chain wallets were untouched — that boundary matters. September: automated systems hammering the password-reset endpoint of exposed servers, specifically those where operators had manually restored LND access. BTCPay shipped 2.4.4 on September 7. Routing defaults closed on September 11.
This arrives in a bull market. Self-custody is being marketed harder than at any point since 2021 — hardware wallets, self-hosted nodes, sovereign payment stacks. The pitch is that removing custodians removes counterparty risk. It does. It also relocates that risk onto the operator, who is now responsible for authentication, patching, network exposure, and password hygiene. Most are not equipped for it. BTCPay's incident is a demonstration, not an exception.
The mechanism, step by step:
- LND restarts. Wallet locked. The
walletunlockerservice is live. - In that state, the password-change method requires no macaroon authorization.
- Legacy wallets ship with a shared default password.
- Attacker — or bot — races the operator. Submits a new password first.
- Requests an admin macaroon. Now controls the node.
That is a race condition welded to a weak default credential. Nothing here requires breaking encryption. The cryptography held. The authorization sequence did not.
LND's unlocker window is not an accident. It exists because a locked wallet on restart must be unlocked by someone, and the macaroon system requires the wallet to be running to issue credentials. The circularity is structural. Whoever reaches the unlocker first wins. In a single-operator deployment with a human at the keyboard, that is fine. In an internet-exposed deployment with a bot scanning the port range, it is a footrace the operator will lose.

An admin macaroon is not a session token. It is the node. Sign a request with it and the request executes with the full authority of the owner: spend channels, close channels, sweep balances. No second factor. No rate limit. No confirmation prompt. LND's permission model is binary by design, which makes securing that one credential the entire game.
The shared default password is the quieter failure. It came from early LND tooling, propagated into user deployments, and then sat there — unchanged — through years of upgrades. Configurations outlive the people who wrote them. A default credential is not a vulnerability in code. It is a vulnerability in habit, and habits do not patch.
Three things follow.
First: this is operations-layer failure, not protocol-layer failure. Bitcoin's base layer is intact. The Lightning protocol is intact. What failed is the timing of permission distribution on LND's unlock path. That distinction matters because the entire bull-market narrative around self-custody rests on protocol-layer guarantees. This event says nothing about those. It says something about deployment discipline.
Second, the bots. Automated systems calling the endpoint repeatedly, in BTCPay's own language. That is not a researcher. That is a weaponized toolkit in circulation. Someone holds a list of exposed nodes. Someone holds a database of shared default passwords. Scanning, exploitation, and monetization have separated into distinct functions — the signature of a mature attack market, not a lone actor.
Third, the fix. 2.4.4 does four things: unique random passwords, a migration trigger for legacy installs, reverse-proxy blocks on unauthenticated interfaces, and LND routes off by default. Defense-in-depth, not a point patch. It also reveals where the team believes the boundary sits — not around LND, but around the operator's deployment choices.
Here is the structural problem. Standard deployments are safe. Custom deployments are not. BTCPay can harden defaults. It cannot force an operator who wrote their own Nginx rules to follow them. The long tail of self-hosted merchants is the attack surface, and it is ungovernable by design.
I audited LND-adjacent deployment code in 2021 — different stack, identical pattern. The unlocker's pre-auth window is a known LND characteristic, not a BTCPay invention. Every piece of software that wraps LND inherits the exposure: node dashboards, cloud wallets, payment layers. Core Lightning's Docker image carries its own variant. This is the ecosystem's pattern, not one project's bug.
The bulls got one thing right, and it deserves conceding.
The response was competent. Disclosure August 7. Patch September 7. Routing hardening September 11. Coordinated chasing with exchanges, blockchain analytics firms, and law enforcement. The chain is complete and fast. Most projects that suffer a live fund-extraction event spend the first fortnight in legal review. BTCPay shipped.
But the bounty is where the bull case frays. Ten percent of recovered funds, capped at 3 BTC — roughly $190,000 — against a target whose per-node value is the merchant's entire operating balance. The bug bounty is priced below the exploit. That is not a rounding error. It is an incentive gradient pointing the wrong way. Professional white hats do not audit for less than the black market pays for the same finding.
And transparency has an unresolved cost. Publishing the exact failure mechanism — restart window, no macaroon, shared default — hands every operator with a stale node a map. The front-runner didn't need to reverse-engineer anything. They got a manual.
The second successful extraction is the signal that matters. Not this one. Funds moved in August. Bots are still probing. The question is not whether BTCPay hardened 2.4.4 — it did. The question is how many nodes were installed in 2022, still carry the shared default password, and will never see the migration notice.
A bug is just a feature that hasn't met the right operator yet. The protocol layer is fine. The humans running it are the vulnerability, and no patch repairs a deployment decision someone made three years ago and forgot.

So, for every self-hosted operator reading this: when did you last check what your reverse proxy actually exposes? If you cannot answer without opening a terminal, the answer is probably wrong.
