common/json_parse: json_to_bitcoin_amount fails to detect overflow and accepts negative/empty inputs
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 62/100
Direzione di ricerca
Il bug è in json_to_bitcoin_amount() in common/json_parse.c, dove il controllo di overflow confronta la stessa espressione con overflow con se stessa, e il parsing dei numeri accetta un '-' iniziale e token vuoti. Inizia leggendo quella funzione e la chiamata a strtoul, poi trova i test json_parse esistenti e aggiungi i tre input segnalati come casi. È completato quando tutti e tre restituiscono false e gli importi validi continuano a essere analizzati correttamente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Issue and Steps to Reproduce
json_to_bitcoin_amount() in common/json_parse.c has multiple parsing and overflow validation flaws:
-
Tautological overflow check:
*satoshi = btc * (uint64_t)100000000 + sat; if (*satoshi != btc * (uint64_t)100000000 + sat) return false;Both sides of
*satoshi != btc * (uint64_t)100000000 + satevaluate the exact sameuint64_twrapped value after an overflow. Whenbtcis large (e.g.184467440738),btc * 100000000overflowsuint64_tand wraps around, but the check evaluateswrapped_val != wrapped_val(which isfalse), returningtruewith a corrupted satoshi value. -
Negative numbers & signs accepted:
strtoulaccepts leading'-'and converts negative values (such as"-1.00000000"or"-0.00000001") into large unsigned values (e.g.ULONG_MAX), wrapping around during multiplication and returningtrue. -
Empty tokens:
An empty token (tok->start == tok->end) is parsed as0satoshis and returnstrueinstead of returningfalse.
Steps to reproduce
Call json_to_bitcoin_amount() with:
"184467440738.00000000": returnstruewith wrapped amount90448385instead offalse."-1.00000000": returnstruewith corrupted amount instead offalse."": returnstruewith0satoshis instead offalse.
getinfo output
N/A (C unit parsing logic in common/json_parse.c)
- Lingua principale
- C
- Stelle
- 3.1k
- Fork
- 1k
- Merge medio
- 3g 7h
- PR unite (30g)
- 42
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ElementsProject/lightning
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
ElementsProject/lightning#9616 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
ElementsProject/lightning#9593 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
ElementsProject/lightning#9322 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
ElementsProject/lightning#9206 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
ElementsProject/lightning#9187 · 1 commento · 1 reazione ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di ElementsProject/lightning
Issue simili
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 76/100
SteamGridDB/SGDBoop#147 ·
-
Doc: insert executor and incremental consolidation leave sorted runs, not globally sorted headsAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 83/100
semantic-reasoning/wirelog#2133 ·
I maintainer di solito rispondono entro 1 giorno
-
backlog
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
EchoTools/nevr-runtime#454 ·
I maintainer di solito rispondono entro 1 giorno
-
initramfs: -type f (#18686) skips the libcurl.so.4 symlink, libcurl no longer copied into initramfsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno