common/json_parse: json_to_bitcoin_amount fails to detect overflow and accepts negative/empty inputs
Maintainer thường phản hồi trong vòng 2 ngày
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 62/100
Hướng nghiên cứu
Lỗi nằm ở json_to_bitcoin_amount() trong common/json_parse.c, nơi kiểm tra tràn so sánh cùng một biểu thức đã bị wrap với chính nó, và việc phân tích số chấp nhận dấu '-' ở đầu cùng các token rỗng. Hãy bắt đầu bằng việc đọc hàm đó và lệnh gọi strtoul, sau đó tìm các test json_parse hiện có và thêm ba đầu vào đã được báo cáo làm test case. Hoàn thành khi cả ba đều trả về false và các số tiền hợp lệ vẫn được phân tích đúng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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)
- Ngôn ngữ chính
- C
- Star
- 3.1k
- Fork
- 1k
- Merge trung bình
- 3 ngày 6 giờ
- Pull request đã merge (30 ngày)
- 41
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của ElementsProject/lightning
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
ElementsProject/lightning#9616 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
ElementsProject/lightning#9593 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
ElementsProject/lightning#9322 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
ElementsProject/lightning#9206 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
ElementsProject/lightning#9187 · 1 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của ElementsProject/lightning
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 63/100
Xinyuan-LilyGO/T-Display-S3#352 · 3 bình luận ·
-
docs: AGENTS.md has no rule against running deploy scripts into the owner's game installCó thể đã có người làm @thesprockee đã nhận hôm nay. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
EchoTools/nevr-runtime#524 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 74/100
Genymobile/scrcpy#7097 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
-
type: feature
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 77/100