common/amount: parse_amount_sat misparses sub-satoshi msat with leading zero and accepts invalid suffixes
メンテナーはふだん 2 日以内に返信
評価
調査の方向性
common/amount.c の parse_amount_sat() と parse_amount_msat() から始め、特に 249 行目付近の msat 分岐と memstarts_str を使った接尾辞チェックに注目してください。issue の 3 つのアサーションを最初の失敗ケースとして使い、次に 0500msat や 01msat のような先頭にゼロがある非ゼロの sub-satoshi 値が拒否され、0msat は引き続きゼロを返すことを確認してください。完了とは、両方の関数が satoshis のような無効な末尾接尾辞を拒否し、正確な単位接尾辞のみを受け入れることです。
索引モデルが issue の本文から書いたものです。
説明
Issue and Steps to Reproduce
In common/amount.c, parse_amount_sat() and parse_amount_msat() have two related parsing issues: sub-satoshi msat values formatted with leading zeroes are erroneously parsed as satoshis, and arbitrary trailing characters on amount suffixes are accepted.
1. Sub-satoshi msat values with leading zeroes are parsed as satoshis in parse_amount_sat
parse_amount_sat() parses amount strings into discrete satoshis. Per the function documentation:
/* Valid strings:
* [0-9]+ => satoshi.
* [0-9]+sat => satoshi.
* [0-9]+000msat => satoshi.
* 0msat => 0 satoshi
* [0-9]+.[0-9]{1,8}btc => satoshi.
*/
For msat inputs that do not end in "000", line 249 of common/amount.c checks:
if (!memends(s, whole_number_len, "000", strlen("000"))) {
if (memstarts_str(s, whole_number_len, "0"))
return from_number(&sat->satoshis, s,
whole_number_len, 0);
return false;
}
Because memstarts_str(s, whole_number_len, "0") tests if the whole-number string starts with '0', any non-zero millisatoshi amount with a leading zero and not ending in "000" (e.g. 01msat, 0500msat, 0999msat) satisfies the condition and is passed to from_number(&sat->satoshis, ...), treating the millisatoshi value directly as satoshis:
01msat(1 millisatoshi) is parsed as 1 satoshi (1,000 msat) instead of being rejected.0500msat(500 millisatoshis = 0.5 sat) is parsed as 500 satoshis (500,000 msat), causing a 1,000x error.0999msat(999 millisatoshis) is parsed as 999 satoshis (999,000 msat).
Only amounts whose numerical value is genuinely zero (such as 0msat, 00msat, 000msat) should evaluate to 0 satoshis; all non-zero sub-satoshi amounts should be rejected.
2. Unchecked trailing suffix characters in parse_amount_sat and parse_amount_msat
Both functions check unit suffixes using memstarts_str(suffix_ptr, suffix_len, "sat"), memstarts_str(..., "msat"), and memstarts_str(..., "btc"). Because memstarts_str only tests for a prefix match:
100satoshisis accepted and parsed as100sat(or100000msatinparse_amount_msat).- Strings such as
100sats,100msats, or1btcfooare accepted rather than rejected as invalid units.
Steps to Reproduce
struct amount_sat sat;
assert(!parse_amount_sat(&sat, "0500msat", strlen("0500msat"))); /* Currently fails assertion: parses as 500 satoshis */
assert(!parse_amount_sat(&sat, "01msat", strlen("01msat"))); /* Currently fails assertion: parses as 1 satoshi */
assert(!parse_amount_sat(&sat, "100satoshis", strlen("100satoshis"))); /* Currently fails assertion: accepted */
getinfo output
N/A (core parser logic in common/amount.c)
- 主要言語
- C
- スター
- 3.1k
- フォーク
- 1k
- 平均マージ
- 4日 13時間
- マージ済み PR(30日)
- 32
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
ElementsProject/lightning のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
ElementsProject/lightning#9673 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
ElementsProject/lightning#9671 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
ElementsProject/lightning#9634 ·
メンテナーはふだん 2 日以内に返信
-
plugins/recover: missing comma in nodes_for_gossip concatenates two bootstrap addresses into invalid address対応中かも @bhuvan-somisetty が 14 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
ElementsProject/lightning#9630 ·
メンテナーはふだん 2 日以内に返信
-
common/json_parse: json_to_bitcoin_amount fails to detect overflow and accepts negative/empty inputs対応中かも @bhuvan-somisetty が 18 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
ElementsProject/lightning#9617 ·
メンテナーはふだん 2 日以内に返信
ElementsProject/lightning の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
libsdl-org/SDL#16607 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
PowerShell/Win32-OpenSSH#2482 · リアクション 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
zephyrproject-rtos/zephyr#123881 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
メンテナーはふだん 1 日以内に返信