آسیبپذیری در کتابخانه Bitcoinjs-lib: خطر پرداخت کارمزدهای هنگفت برای کاربران بیتکوین
دو نقص امنیتی در کتابخانه محبوب `bitcoinjs-lib` کشف شده که میتواند باعث محاسبه اشتباه و بسیار کمتر از واقع کارمزد تراکنشهای بیتکوین شود. این امر کاربران را در معرض خطر پرداخت ناخواسته کارمزدهای بسیار بالا قرار میدهد.

دو نقص در کتابخانه bitcoinjs-lib میتواند منجر به پنهان شدن کارمزدهای هنگفت ماینرها شود و به تراکنشهای معتبر اجازه دهد تا بررسیهای ایمنی را دور بزنند. هشدارهای منتشر شده در ۲۶ اکتبر برای این کتابخانه، به اصلاحات مربوط به محاسبه کارمزد در نسخههای 5.2.2، 6.1.9 و 7.0.4 اشاره دارد.
کتابخانه bitcoinjs-lib که برای ساخت اپلیکیشنهای بیتکوین استفاده میشود، دو باگ را اصلاح کرده است که میتوانست باعث شود نرمافزار، کارمزد ماینری که یک تراکنش معتبر در صورت پخش و پذیرش پرداخت میکند را بسیار کمتر از مقدار واقعی تخمین بزند.
وجود رکوردهای متناقض یا ناموجود برای مقادیر ورودی میتواند کارمزد ماینر را کمتر از حد واقعی نشان دهد و هنگامی که اپلیکیشنها به حسابداری این کتابخانه آسیبپذیر اعتماد میکنند، تدابیر امنیتی را بیاثر سازد. برای وقوع ضرر واقعی، لازم است یک تراکنش مجاز و معتبر پخش و پذیرفته شود. به توسعهدهندگان توصیه میشود کتابخانه خود را ارتقا داده یا مقادیر ورودی را به طور مستقل تأیید کنند.
فرمت تحت تأثیر این آسیبپذیری، تراکنش نیمهامضاشده بیتکوین (PSBT) است. استاندارد BIP 174 آن را به عنوان روشی برای انتقال اطلاعات تراکنش و امضاها بین کلاینتها تعریف میکند. توابع امضا، ترکیب امضاها، نهاییسازی ورودیها و استخراج تراکنش، همگی مجزا هستند، حتی اگر یک اپلیکیشن چندین مورد از آنها را انجام دهد.
ریسک اصلی متوجه اپلیکیشنهایی است که این بستهها را وارد کرده و به محاسبه کارمزد یا مکانیزم محافظت در برابر کارمزد بیش از حد bitcoinjs-lib بدون بررسی مستقل خروجیهای در حال خرج شدن، اعتماد میکنند. توسعهدهندگان باید نسخه وابستگی (dependency) خود و نحوه اعتبارسنجی PSBTهای وارداتی را بازبینی کنند.
چرا امضاهای معتبر میتوانند با کارمزدهای گمراهکننده همراه شوند؟
کارمزد یک تراکنش بیتکوین تفاوت بین ارزش ورودیها و خروجیهای آن است، بنابراین کمتر نشان دادن ارزش یک ورودی باعث میشود کارمزد محاسبهشده کوچکتر به نظر برسد.
در نقص اول، فرآیند امضا و محاسبه کارمزد میتوانند از مقادیر متفاوتی برای یک ورودی استفاده کنند. امضا از تراکنش کامل قبلی استفاده میکند، در حالی که محاسبه کارمزد، رکوردی متناقض با ارزش کمتر را ترجیح میدهد. در نتیجه، نرمافزار آسیبپذیر میتواند تراکنش واقعی را مجاز بداند در حالی که کارمزد اشتباهی را ارزیابی میکند.
در هشدار مربوطه، یک نمونه نمایشی روی نسخه 7.0.1 کتابخانه bitcoinjs-lib توصیف شده که در آن کارمزد واقعی ۹۰۰,۰۰۰,۰۰۰ ساتوشی بوده، اما کتابخانه آن را ۲۰۰ ساتوشی گزارش کرده است. امضا تأیید شده و استخراج تراکنش بدون هشدار پیشفرض نرخ کارمزد انجام شده است.
هشدار دوم به ورودیهای نهاییشدهای اشاره دارد که هر دو رکورد ارزش ورودی آنها موجود نیست. ماشینحساب این ورودیها را صفر در نظر میگیرد و یک PSBT از قبل امضاشده که از طرف دیگری وارد شده، میتواند بدون نیاز به عملیات امضای مجدد، به این محاسبه برسد.
در مثال فرضی آن، کارمزد واقعی ۹۱,۰۰۰ ساتوشی است اما کارمزد گزارششده ۱,۰۰۰ ساتوشی است. اسکریپتها و امضاهای نهاییشده به تنهایی ارزش ورودی ناموجود را مشخص نمیکنند.
برای وقوع ضرر واقعی، لازم است یک تراکنش مجاز و معتبر در شبکه پخش و پذیرفته شود. این نقصها امضا ایجاد نمیکنند و ارزش اضافی به کارمزد ماینر تبدیل میشود.
برای مشکل رکوردهای متناقض، نسخههای تحت تأثیر عبارتند از 5.2.0 تا 5.2.1، 6.0.0 تا 6.1.8 و 7.0.0-rc.0 تا 7.0.3. نقص مربوط به رکوردهای ناموجود نیز بر همین بازههای نسخههای ۶ و ۷ و همچنین نسخههای 5.1.0 تا 5.2.1 در خط نسخه ۵ تأثیر میگذارد.
راهکار ارائهشده، یک متد مشترک برای حل و فصل خروجیهای قبلی به فرآیندهای امضا و حسابداری میدهد، مقادیر یا اسکریپتهای متناقض را رد میکند و برای محاسبه کارمزد، وجود مقدار برای هر ورودی را الزامی میسازد. همچنین پس از تغییرات یا ترکیب فرادادههای مرتبط، کارمزدهای ذخیرهشده و تراکنشهای استخراجشده را پاک میکند.
توسعهدهندگانی که قادر به ارتقا نیستند، باید به طور مستقل مقادیر خروجیهای ارجاعشده را تأیید کنند. آنها باید رکوردهای متناقض را قبل از امضا یا اعتماد به کارمزدها رد کرده و ارزش هر ورودی را قبل از اعتماد به کارمزدها یا استخراج تراکنش، تأیید نمایند.



