Tento týden varujeme před závažnou zranitelností v nástroji Libbitcoinu Bitcoin Explorer (bx), přinášíme souhrn diskuze o návrhu ochrany před odepřením služby, oznámení plánu na testování a sběr dat HTLC atestací a popis dvou navrhovaných změn pravidel přeposílání transakcí v Bitcoin Core. Též nechybí naše pravidelné rubriky se souhrnem sezení Bitcoin Core PR Review Club, oznámeními o nových verzích a popisem významných změn v populárních bitcoinových páteřních projektech.

Upozornění

  • Závažná zranitelnost v Libbitcoin Bitcoin Explorer: pokud jste pomocí příkazu bx seed vytvořili BIP32 seed, tajný seznam slov podle BIP39, soukromé klíče či jiné bezpečnostní kódy, zvažte okamžité přesunutí prostředků na jinou, bezpečnou adresu. V rubrice Novinky uvádíme další podrobnosti.

Novinky

  • Testování a sběr dat HTLC atestací: Carla Kirk-Cohen a Clara Shikhelman zaslaly do emailové skupiny Lightning-Dev příspěvek s oznámením, že vývojáři spříznění s Eclairem, Core Lightningem a LND pracují na implementaci části protokolu HTLC atestací („HTLC endorsement”), aby mohli začít sbírat relevantní data. Navrhli též soubor dat, jehož sběr testovacími uzly by byl pro výzkum užitečný. Mnoho položek bude obsahovat náhodná data, aby nemohlo dojít k úniku soukromých informací. Testování má proběhnout v několika fázích, v každé se budou účastnící se uzly chovat jiným způsobem.

  • Odhalení bezpečnostní zranitelnosti v Libbitcoin Bitcoin Explorer: několik bezpečnostních výzkumníků vyšetřujících nedávnou ztrátu bitcoinů mezi uživateli Libbitcoin zjistilo, že příkaz seed Bitcoin Exploreru (bx) v rámci tohoto programu generuje pouze zhruba čtyři miliardy jedinečných hodnot. Útočník, který předpokládal, že byl tento program použit pro tvorbu soukromých klíčů nebo peněženek s určitou derivační cestou (např. BIP39), mohl potenciálně během jediného dne na běžném počítači prohledat všechny možné peněženky a tím ukrást prostředky na ně přijaté. Jedna taková krádež se pravděpodobně udála 12. července 2023 se ztrátou téměř 30 BTC (v té době zhruba 19 miliónů korun).

    Několik postupů podobných výše uvedenému bylo nalezeno v knize Mastering Bitcoin, na domovské stránce dokumentace Bitcoin Exploreru a mnoha dalších místech dokumentace (např. 1, 2, 3). Nikde v této dokumentaci nebylo jasné varování o nebezpečnosti kromě online dokumentace příkazu seed.

    Doporučujeme, aby každý, kdo mohl použít bx seed ke generování peněženek nebo adres, navštívil stránku s popisem zranitelnosti a zvážil použití jejich služby k otestování hashů zranitelných seedů. Pokud jste použili shodný postup jako útočník, vaše bitcoiny byly již zřejmě ukradené. S variacemi postupu však máte ještě šanci přesunout bitcoiny do bezpečí. Pokud se domníváte, že vaše peněženka používá Libbitcoin, informujte prosím vývojáře o této zranitelnosti a požádejte je o prošetření.

    Děkujeme výzkumníkům za úsilí vynaložené na přípravu zodpovědného zveřejnění zranitelnosti CVE-2023-39910.

Bitcoin Core PR Review Club

V této měsíční rubrice shrnujeme nedávné sezení Bitcoin Core PR Review Club a vyzdvihujeme některé z důležitých otázek a odpovědí. Klikněte na otázku a odpověď se vám odhalí.

Tiché platby: naimplentuj BIP352 je PR od uživatele josibake, které podniká první kroky v přidání tichých plateb („silent payments”) do peněženky Bitcoin Core. Toto PR implementuje pouze logiku z BIP352 a nepřináší žádné změny peněženky.

  • Proč PR přidává vlastní ECDH hashovací funkci a nepoužívá tu poskytovanou secp256k1?

    Ve skutečnosti nechceme hashovat výsledek ECDH; vlastní funkce neaplikuje sha256 na výsledek ECDH operace. To je potřeba, pokud tvůrce transakce nemá pod kontrolou všechny její vstupy. Absence hashování výsledku během ECDH umožňuje jednotlivým účastníkům provést ECDH pouze s jejich soukromým klíčem a předat částečné ECDH dále. Výsledky částečných ECDH mohou být sečteny a poté lze provést zbytek protokolu. 

  • PR přidává funkce pro kódování a dekódování adres tichých plateb. Proč nemůžeme jednoduše přidat adresy tichých plateb jako další variantu CTxDestination a použít existující třídy a funkce?

    Adresa tiché platby totiž nekóduje žádný konkrétní výstupový skript (není to scriptPubKey). Kóduje namísto toho veřejné klíče potřebné k odvození skutečného výstupového skriptu, který také závisí na vstupech vaší transakce tiché platby. Tedy namísto poskytování scriptPubKey pro přijetí platby (tradiční adresy) vám tichá platba dá veřejné klíče pro ECDH a protokol promění tento sdílený tajný kód v scriptPubKey, který příjemce detekuje a později z něj utratí. 

  • BIP352 odkazuje na verzování a dopřednou kompatibilitu. Co je dopředná kompatibilita a proč je důležitá?

    Umožňuje (například) peněžence verze 0 dekódovat a poslat prostředky na adresu tiché platby peněženky verze 1 (a verze 2 atd.), i když není peněženka schopna vygenerovat adresu verze 1. Je to důležité, protože peněženky nemusí upgradovat hned, jakmile se objeví nová verze. 

  • A co kdyby nová verze chtěla záměrně porušit kompatibilitu?

    Verze 31 je vyhraněna pro upgrade, který by kompatibilitu narušil. 

  • Proč stačí vyhradit pouze jednu verzi (31) pro narušení kompatibility?

    Můžeme odložit na později definici nových pravidel, jak by se mělo nakládat s verzemi po této narušující změně. 

  • DecodeSilentAddress obsahuje kontrolu verze a velikosti dat. Co tato kontrola dělá a proč je důležitá?

    Přinese-li nová verze do adresy větší množství dat, musíme mít způsob, jak obdržet pouze dopředně kompatibilní části. Jinými slovy musíme se omezit na parsování první 66 bytů (formát verze 0). Je to důležité pro dopřednou kompatibilitu. 

  • Nový kód tichých plateb je umístěn v adresáři peněženky v src/wallet/silentpayments.cpp. Je to dobré místo? Dokážete vymyslet situaci, kdy bychom chtěli použít kód tichých plateb mimo kontext peněženky?

    Není to nejlepší, pokud by někdo chtěl naimplementovat server bez peněženek, který by detekoval tiché platby (či prováděl relevantní výpočty) pro lehčí peněženky. Lze si představit situaci, kdy plný uzel indexuje tweaky transakcí a umožňuje lehkým klientům mezi nimi vyhledávat nebo poskytovat tato data pomocí filtru podobného BIP158. Avšak dokud tato situace nenastane, kód v src/wallet je lépe organizován. 

  • Třída Recipient je v PR inicializována se dvěma soukromými klíči: klíčem pro utracení a klíčem pro prohledávání. Jsou oba tyto klíče pro prohledávání potřebné?

    Ne, pouze klíč pro prohledávání je potřebný. Schopnost prohledávat tiché platby bez klíče pro utracení může být implementována v budoucnosti. 

Vydání nových verzí

Vydání nových verzí oblíbených páteřních bitcoinových projektů. Prosíme, zvažte upgrade či pomoc s testováním.

  • BDK 0.28.1 je vydáním této oblíbené knihovny pro budování peněženek. Obsahuje opravy chyb a přidává šablonu pro odvozování cest dle BIP86 pro P2TR v deskriptorech .

Významné změny v kódu a dokumentaci

Významné změny z tohoto týdne v Bitcoin Core, Core Lightning, Eclair, LDK, LND, libsecp256k1, Hardware Wallet Interface (HWI), Rust Bitcoin, BTCPay Server, BDK, Bitcoin Improvement Proposals (BIPs), Lightning BOLTs a Bitcoin Inquisition.

  • Bitcoin Core #27746 zjednodušuje vztah mezi úložištěm bloků a chainstate objekty tím, že přemisťuje rozhodování, zda uložit blok na disk, do validační logiky, která je na aktuálním chainstate nezávislá. Rozhodnutí, zda uložit blok na disk, souvisí s validačními pravidly, která nevyžadují přístup ke stavu UTXO. V předchozích verzích používal Bitcoin Core z anti-DoS důvodů heuristiku pro konkrétní chainstate, ale s assumeUTXO a možností existence dvou chainstate najednou byl tento mechanismus přepracován, aby mohl být rozdělen.

  • Core Lightning #6376 a #6475 implementují plugin nazývaný renepay, který používá Pickhardtovy platby pro vytváření optimálních plateb s více cestami (viz zpravodaj č. 192, angl.). Pickhardtovy platby předpokládají, že likvidita v každém kanálu je ve směru toku náhodně rozdělena mezi 0 a plnou kapacitou. Platby vysokých částek mohou selhat, protože cesta nemusí poskytovat dostatečnou likviditu nebo protože rozdělení platby do mnoha částí násobí pravděpodobnost selhání. Platba je poté namodelována jako tok v lightningové síti mající za cíl nalézt střední cestu mezi počtem částí platby a částkami jednotlivých částí. Díky tomuto přístupu nacházejí Pickhardtovy platby optimální tok, který splňuje omezení daná kapacitami a zůstatky a zároveň maximalizuje pravděpodobnost úspěchu. Odpovědi nedokončených plateb jsou použity pro aktualizaci předpokládané distribuce likvidity všech zúčastněných kanálů. Jelikož by použití základních poplatků dle BOLT7 bylo výpočetně náročné (viz zpravodaj č. 163, angl.), budou uzly používající renepay nadhodnocovat relativní poplatek u kanálů s nenulovým základním poplatkem. Onion balíčky zkonstruované pro doručení platby používají skutečné poplatky.

  • Core Lightning #6466 a #6473 přidávají podporu pro zálohu a obnovu hlavního tajného kódu peněženky ve formátu codex32 dle BIP93.

  • Core Lightning #6253 a #5675 přidávají experimentální implementaci splicingu dle návrhu specifikace z BOLTs #863. Pokud obě strany kanálu podporují splicing, mohou přidat prostředky do kanálu pomocí onchain transakce (splice-in) nebo odebrat prostředky z kanálu platbou onchain (splice-out). Ani jedna z těchto operací nevyžaduje uzavření kanálu a během čekání na potvrzení onchain splicingové transakce může kanál pokračovat ve své obvyklé činnosti. Klíčovou výhodou splicingu je možnost LN peněženek držet většinu prostředků offchain a utrácet tyto prostředky onchain podle potřeby. Díky tomu mohou peněženky ukazovat uživateli jediný zůstatek (a ne offchain a onchain zůstatky zvlášť).

  • Rust Bitcoin #1945 upravuje pravidla projektu stanovující minimální počet schválení PR v případě pouhého refaktorování. Jiné projekty potýkající se s problémem schvalování malých změn dle stejných standardů jako ostatní PR mohou prozkoumat nová pravidla Rust Bitcoin.

  • BOLTs #759 přidává do specifikace LN podporu onion zpráv. Onion zprávy umožňují jednosměrné poslání zprávy napříč celou sítí. Podobně jako platby (HTLC) používají i tyto zprávy onion šifrování, takže každý přeposílající uzel ví pouze, odkud zprávu obdržel a kam má zprávu poslat dále. Obsah zprávy je také šifrován, pouze konečný příjemce ji může přečíst. Na rozdíl od přeposílaných HTLC, které jsou obousměrné (commitment proudí směrem k příjemci a předobraz potřebný k nárokování platby teče opačným směrem k odesílateli), nemusí být onion zprávy díky své jednosměrné povaze ukládány, ač některá navrhovaná opatření proti DoS závisí na držení malého množství agregovaných informací (viz zpravodaj č. 207, angl.). Obousměrného posílání lze dosáhnout přilepením zpáteční cesty ke zprávě. Onion zprávy používají zaslepené cesty, které byly přidány do specifikace před několika měsíci (viz zpravodaj č. 245), a jsou také využívány vyvíjeným protokolem nabídek.