CLN Binary Signature Check

CLN Binary Signature Check

The CLN emergency fix ships as unreproducible binary. I traced all 4 release signatures through keyservers, repo history, and Bitcoin Core's key registries.

On 26-08-2026 I saw a post by calle informing of an urgent critical vulnerability with Core Lightning (CLN) for which users are recommended to turn their nodes offline (with --offline) and updating to a binary for which the source patches are under 14 day embargo (kept private).

Post by Calle - https://x.com/callebtc/status/2092683963366064550

This release ships binaries only, the source is embargoed until 2026-09-11. Given it's not possible to build the release yourself I strongly recommend that you run in offline mode (--offline)

I wouldn't update to unreproducible binaries as an emergency fix - a project maintainer's github/signing accounts could be compromised and you end up installing malware.

Given this, I wanted to verify who had signed off on the v26.06.7 release (published 2026-08-28 by @nGoline). The release has four signatures on SHA256SUMS-v26.06.7 - we can check that the signatures are genuine, then we can check that the keys genuinely belong to the people purported to sign, finally we should check with those people that they were the individuals who signed (and not someone who had a copy of their key).

Checking typical release signature policy

CLN has no fixed release-signing policy, looking at the past releases we see a range of signers.

Release Manifest signed by Σ
v23.02 Decker, Myers 2
v23.02.1 — no manifest asset found
v23.02.2 Decker, Myers, Russell 3
v23.05 Decker, Myers, Neuroth, Farooqui 4
v23.05.1 Decker, Myers, Neuroth, Russell, Farooqui 5
v23.05.2 Decker, Russell 2
v23.08 Myers, Farooqui, Russell 3
v23.08.1 Decker, Myers, Farooqui, Neuroth, Russell 5
v23.11 Decker, Myers, Farooqui, Neuroth 4
v23.11.1 Decker 1
v23.11.2 Decker, Myers 2
v24.02 Decker 1
v24.02.1 Neuroth 1
v24.02.2 Decker 1
v24.05 Myers, Farooqui, Russell 3
v24.08 Myers, Farooqui 2
v24.08.1 Farooqui 1
v24.08.2 Myers, Farooqui 2
v24.11 Russell [1] 1
v24.11.1 Russell 1
v24.11.2 Myers, Farooqui 2
v25.02 Project key, Myers, Farooqui 3
v25.05 Myers, Farooqui 2
v25.09 Project key [2] 1
v25.12 Project key, Paech, Chaudhuri, Farooqui, Russell 5
v25.12.1 Project key, Farooqui 2
v26.04 Project key, Chaudhuri 2
v26.04.1 Project key, Chaudhuri 2
v26.06 Paech 1
v26.06.1 Decker, nGoline, daywalker90, Lagrang3 4
v26.06.2 Paech 1
v26.06.3–.5 — releases deleted (pypi failures); no manifests
v26.06.6 Project key, daywalker90, Lagrang3, Andezion [3] 4
v26.06.7 Decker, Neuroth, daywalker90, nGoline [4] 4

[1] signature asset misnamed SHA256SUMS.ascD9200E6CD1ADB8F1.
[2] machine key only, no human signature.
[3] Andezion's key created the day of signing, never added to contrib/keys.
[4] binary-only release, source embargoed to 2026-09-11.

Notes

  • "Farooqui" spans three successive keys
  • "Project key" is cln@blockstream.com
  • Extracted from each release's SHA256SUMS*.asc with gpg --list-packets, 2026-08-29.

If at all possible projects should have a consistent signing policy. Because this is not the case for CLN it is difficult to know what to expect from a legitimate emergency binary release.

Checking the manifest signatures

We check the release manifest against the in-tree keys by running this following command which clones the repository, imports the GPG keys and checks the signatures.

git clone --depth 1 https://github.com/ElementsProject/lightning
for k in lightning/contrib/keys/*.txt; do gpg --import "$k"; done
curl -LO https://github.com/ElementsProject/lightning/releases/download/v26.06.7/SHA256SUMS-v26.06.7
curl -LO https://github.com/ElementsProject/lightning/releases/download/v26.06.7/SHA256SUMS-v26.06.7.asc
gpg --verify SHA256SUMS-v26.06.7.asc SHA256SUMS-v26.06.7

Code to clone the repo and import the keys

Screenshot of the 4 'Good Signature' messages (note, not certified with trusted sig).

We check when each of these keys were added to the contrib/keys/ folder.

Signer Signing key used Key added to contrib/keys/ Signed (UTC)
Christian Decker subkey B7C4 BE81 184F C203 D52C 35C5 1416 D83D C4F0 E86D of B731 AAC5 21B0 1385 9313 F674 A26D 6D9F E088 ED58 2021-07-14 (updated 2022-12-03) Aug 28 15:07
Peter Neuroth 653B 19F3 3DF7 EFF3 E9D1 C94C C3F2 1EE3 87FF 4CD2 2023-11-29 Aug 28 14:55
daywalker90 8A07 9421 A871 D0B1 0835 1193 7AB4 802E D5A6 39F3 2026-06-04 ⚠️ Aug 27 18:12
nGoline subkey 4E4A 142F 8BD3 C38A 56B3 62ED 578C AC08 4725 45C5 of A576 56F8 004F 6FD6 8ED9 9C85 BE27 7A87 802A 6F08 2026-06-05 ⚠️ Aug 28 05:00

Christian Decker's key has been present since 2021, and Peter Neuroth's key since 2023. The other keys were added within the last 3 months - while not an outright issue we should take care to carefully review these keys as they could have been added by a malicious party in anticipation of releasing a malicious binary with their signatures.

Next up, can must verify whether the keys belong to the people they claim to (and could those keys have been substituted recently).

Verifying Decker's key

Decker's key (B731 AAC5 21B0 1385 9313 F674 A26D 6D9F E088 ED58) was created 2015-11-20. The subkey that signed v26.06.7 also signed CLN commits from November 2016 through June 2018 (5 commits).

The key carries 38 third-party certifications. Fetching each certifier key from public keyservers and running gpg --check-sigs gives 31 VALID certifications. The dates cluster around real events (the 2018-03-07 to 03-13 block is the CoreDev Tokyo keysigning).

Keyservers are unauthenticated, so a valid certification only proves that a key labeled "Pieter Wuille" signed Decker's key. To reduce the risk of these keys being fake we need to cross verify these keys too. We can compare the certifier fingerprints against key registries maintained by a different project with different maintainers:

Eleven certifier keys are a match:

Certifier Matched registry
Ava Chow gitian + trusted-keys + guix.sigs
Hennadii Stepanov gitian + trusted-keys + guix.sigs
Wladimir van der Laan gitian + guix.sigs
Pieter Wuille gitian + guix.sigs
Sjors Provoost gitian + guix.sigs
Marco Falke gitian
Peter Todd gitian
Matt Corallo gitian
Karl-Johan Alm gitian
MeshCollider gitian
Decker's older key (which cross-signed this one) gitian

Forging this chain would require compromising bitcoin/bitcoin's git history plus roughly a dozen Bitcoin Core developers' keys, years before this release existed.

Decker's signature on v26.06.7 is therefore established independently of anything that happened in 2026 and independently of the ElementsProject GitHub org.

However, we can not rule out the possibility that Decker's computer was compromised, and his key was stolen and used by a malicious party to push a malicious binary signed with his genuine key. This is why it's important to check additional keys.

The other three keys

Peter Neuroth

His key dates from August 2021 and he committed it to contrib/keys himself in November 2023. Matching copies sit on his GitHub account and keyserver.ubuntu.com. The key signed five release manifests between v23.05 and v24.02.1 (on the latter it was the only signature) then produced nothing observable for 29 months - none of the twelve intervening manifests, and no signed commits in either lightning or greenlight (he doesn't sign commits, his 391 across both repos are all unsigned).

daywalker90

Daywalker90 has years of CLN commits and a well-known plugin catalogue but the key signing this release was created on 2026-06-04 and added to contrib/keys the same day, by him. The key has only self-signatures. It signed the v26.06.1 and v26.06.6 manifests and one commit in July, and copies match on his GitHub account and keyserver.ubuntu.com. An attacker who took over this account in June could have manufactured the above evidence.

nGoline

First contributed in May 2026 and joined the core team with v26.06; his key predates that (June 2025), and its signing subkey signed nine CLN commits from 2026-05-12 and the v26.06.1 manifest before being added to contrib/keys on 2026-06-05. It's on keys.openpgp.org with a verified email. Its one third-party certification (present only in the copy he uploaded to his own GitHub account) was made the day the key was created, by a key absent from both major keyservers, so it can't be verified or attributed. The copy in the repo has an expired signing subkey (the refreshed copy on his GitHub account runs to 2027). Same manufacturability window as daywalker90.

Other Notes

  • The v26.06 through .2 tags carried Blockstream's Madeline Paech signature, whereas the v26.06.7 git tag is lightweight commit unsigned.
  • The v26.06.6 manifest carries a signature from Vladyslav Doronchenkov (@Andezion), a first-time contributor whose key was created and used the same day and was never added to contrib/keys .

What the signatures do not cover

Assuming the signatures are authentic this says nothing about the build machine, the toolchain, or the contents of the withheld diff. Nobody outside the team can review the code during the embargo and the binaries cannot be reproduced today. They may be possible to reproduce when the embargo is lifted on 2026-09-11.

Also, note that the release notes state that the binaries were not built with default optimisation settings, so build parameters will also be needed.

The signed manifest does include a sha256 checksum commitment (b313d207e53f1e2dbf9fbac79d5af48c352e874a653390bddb81b52795a153dc) for the future source archive (clightning-v26.06.7.zip), which will allow after-the-fact verification that the published source matches what was committed to now.

Conclusion

Of the four signatures

  • Decker's key has longstanding provenance since 2015
  • Neuroth's key had been dormant for 29 months before this release, but has existed since 2021 with five release signatures in 2023–24)
  • Daywalker90 & nGoline have only recently been active (the last 3 months).

As such, the release's authenticity rests primarily on Decker's key. We should seek confirmation from Decker that he made his signature. While an in person verification would be preferable, we have a verification from an x post.

Decker confirms via X post - https://x.com/Snyke/status/2093731798396112950?s=20

Trust

Remember, the verification performed here was of the signatures only. For a binary-only, source-embargoed, currently-irreproducible release, you are fully trusting the team and their build infrastructure.

Appendix A: certification audit of Decker's key

Status per certifier after importing all certifier keys from keyserver.ubuntu.com and keys.openpgp.org. VALID means gpg --check-sigs verified the certification cryptographically.

Status Date Certifier
VALID 2016-03-23 Jonathan Cross
VALID 2016-10-21 Corn Plooy
VALID 2017-01-13 Matt Corallo
VALID 2017-01-13 Christian Decker (older key)
VALID 2017-01-17 Christopher Allen (x2 keys)
VALID 2017-02-26 Riccardo Casatta
VALID 2018-03-07 Sjors Provoost
VALID 2018-03-07 Peter Todd
VALID 2018-03-08 Ava Chow
VALID 2018-03-08 Karl-Johan Alm
VALID 2018-03-11 Bryan Bishop
VALID 2018-03-12 Russell Yanofsky
VALID 2018-03-13 Evan Klitzke
VALID 2018-03-13 Suhas Daftuar
VALID 2018-03-13 Pieter Wuille
VALID 2018-03-19 Jim Posen
VALID 2018-03-26 Murch
VALID 2018-03-29 Wladimir J. van der Laan
VALID 2018-04-01 Marco Falke
VALID 2018-09-18 Steven Roose
VALID 2018-09-19 Jeffri H Frontz
VALID 2018-09-21 Lisa Neigut
VALID 2018-09-25 Valerio Vaccaro
VALID 2018-09-27 Glenn Willen
VALID 2019-02-28 Muharem Hrnjadovic (x2 keys)
VALID 2019-02-28 Dario Duran
VALID 2019-03-01 Fredrik Roubert
VALID 2019-03-03 Lukas Zeller
VALID 2019-04-15 Dimitris Apostolou
VALID 2019-06-07 Hennadii Stepanov
VALID 2019-06-15 Tim Ruffing

Appendix B: reproducing the checks

# Key provenance inside the repo (needs full history)
git -C lightning fetch --unshallow --filter=blob:none
git -C lightning log --follow -- contrib/keys/pneuroth.txt      # added 2023-11-29
git -C lightning log --author=Decker --format='%H %GK %ad' | awk '$2!=""'  # signed since 2016

# Prior-release continuity
curl -L https://github.com/ElementsProject/lightning/releases/download/v26.06.1/SHA256SUMS-v26.06.1.asc \
  | gpg --list-packets | grep "issuer key ID"

# Audit certifications on Decker's key
gpg --list-sigs --with-colons B731AAC521B013859313F674A26D6D9FE088ED58 \
  | awk -F: '$1=="sig"{print $5}' | sort -u | while read k; do
    curl -s "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x$k" | gpg --import
    curl -s "https://keys.openpgp.org/vks/v1/by-keyid/$k" | gpg --import
  done
gpg --check-sigs B731AAC521B013859313F674A26D6D9FE088ED58

# Cross-match certifier fingerprints against Bitcoin Core registries
curl -sO https://raw.githubusercontent.com/bitcoin/bitcoin/v0.21.0/contrib/gitian-keys/keys.txt
curl -sO https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/verify-commits/trusted-keys
git clone --depth 1 https://github.com/bitcoin-core/guix.sigs
# then compare full 40-hex fingerprints from `gpg --list-keys --with-colons`