Bitcoin Core lehnt Descriptor-Bereiche bis 2^31-1 ab, die den Knoten abstürzen lassen konnten
Bitcoin Core hat am 8. Oktober Pull Request 35989 in den Master-Branch übernommen: einen Wallet-Fix für einen Absturz, der über den RPC importdescriptors erreichbar war. Die Änderung ist klein – sieben Dateien, rund sechzig geänderte Zeilen inklusive Tests –, verändert aber, was die Wallet annimmt, und kommt deshalb mit einer Release Note.
Der Fehler. Ein Descriptor mit Bereich sagt der Wallet, welche Indizes von Kindschlüsseln sie ableiten soll. Intern speichert WalletDescriptor das exklusive Ende dieses Bereichs in einer vorzeichenbehafteten 32-Bit-Zahl. Importiert jemand den Bereich [2147483647, 2147483647] – den größten 32-Bit-Index, 2^31-1 –, ergibt sich ein exklusives Ende von 2^31. Das passt nicht hinein, wird negativ und bricht den Knoten ab, sobald die Wallet ihren Keypool auffüllt. Ein Import ohne ausdrücklichen Bereich konnte dasselbe auslösen, wenn -keypool über 2147483647 lag, weil dann die Keypool-Größe als Bereichsende dient.
Der Fix in drei Teilen. Erstens wird das exklusive Ende vor dem Anlegen des Wallet-Descriptors geprüft, für ausdrückliche wie für Standardbereiche. Die Release Note formuliert es aus Nutzersicht: importdescriptors lehnt jetzt Bereiche mit Ende 2147483647 ab, ebenso Importe ohne Bereich bei -keypool über diesem Wert, weil die Wallet sie nicht speichern kann. Zweitens wird der Endpunkt beim Auffüllen des Keypools in 64 Bit berechnet, bevor seine Grenze geprüft wird – das schließt einen Überlauf, der über keypoolrefill mit dem Maximalwert nach einem fortgeschrittenen Descriptor erreichbar war. Drittens lehnt CheckDescriptorRangeBounds umgekehrte Bereiche ab, bevor es das untere vom oberen Ende abzieht; diesen Überlauf hatte Rob1Ham gemeldet.
Die Grenze gilt bewusst nur für die Wallet: Scan-RPCs wie scantxoutset und scanblocks akzeptieren 2^31-1 weiterhin als inklusiven Endpunkt, weil sie den Bereich nicht speichern müssen.

Wen es betrifft. Niemand importiert versehentlich einen Descriptor bis Index 2.147.483.647; die meisten Wallets werden diesem Fehler nie begegnen. Relevant ist er für Software, die importdescriptors-Aufrufe automatisch erzeugt – Wallet-Backends, Watch-only-Dienste, Werkzeuge, die Bereiche oder -keypool aus Konfiguration setzen –, wo ein ungeprüfter Wert einen Knoten lahmlegen konnte. Nach der Änderung kommt stattdessen ein Fehler zurück.
Der Ablauf. Autor shuv-amp eröffnete den PR am 16. August; Rob1Ham meldete den Überlauf bei umgekehrten Bereichen (polespinasa verknüpfte ihn mit dem PR), der als eigener Commit mit Regressionstest dazukam. Reviewer polespinasa wies darauf hin, dass das Ablehnen bisher akzeptierter Bereiche eine Verhaltensänderung ist, und bat um eine Release Note, die ergänzt wurde. Die letzten ACKs kamen von molnard und achow101, der auch mergte. Getestet hat der Autor nach eigenen Angaben unter UndefinedBehaviorSanitizer mit 34 gezielten Unit-Fällen und den einschlägigen Funktionstests.
Als Merge in den Master-Branch geht die Änderung in das nächste Major-Release; ob sie zurückportiert wird, sagt der PR nicht.
Quellen: Bitcoin Core PR 35989, gemergt am 8. Oktober 2026 — https://github.com/bitcoin/bitcoin/pull/35989 ; Release Note — https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes-35989.md