
دو آسیبپذیری امنیتی در کتابخانه bitcoinjs-lib، که برای ساخت برنامههای بیتکوینی استفاده میشود، برطرف شده است؛ آسیبپذیریهایی که میتوانستند کارمزد واقعی یک تراکنش معتبر را بسیار کمتر از مقدار واقعی نشان دهند. در چنین شرایطی، اگر نرمافزار به محاسبه کارمزد یا سازوکار هشدار کارمزد غیرعادی این کتابخانه اعتماد میکرد، ممکن بود تراکنشی با کارمزد سنگین امضا و در شبکه پخش شود. با این حال، وقوع زیان واقعی تنها زمانی ممکن است که تراکنش معتبر و مجاز به شبکه ارسال شود و شبکه نیز آن را بپذیرد. این گزارش نخستینبار در CryptoSlate منتشر شده است.
مشکل در محاسبه ارزش ورودیها
bitcoinjs-lib مجموعهای از ابزارهای نرمافزاری برای ساخت و پردازش برنامههای بیتکوین است. این کتابخانه با قالبی به نام «تراکنش بیتکوینی با امضای ناقص» یا PSBT نیز کار میکند. طبق استاندارد BIP 174، PSBT روشی برای انتقال اطلاعات تراکنش و امضاها میان کلاینتهاست. در این فرایند، امضای ورودیها، ترکیب امضاها، نهاییسازی ورودیها و استخراج تراکنش نهایی میتوانند مراحل جداگانهای باشند؛ حتی اگر یک برنامه همه این کارها را انجام دهد.
کارمزد تراکنش بیتکوین از اختلاف ارزش مجموع ورودیها و خروجیها به دست میآید. بنابراین، اگر ارزش یکی از ورودیها کمتر از مقدار واقعی در نظر گرفته شود، نرمافزار ممکن است کارمزد را کمتر از واقعیت محاسبه کند. دو نقص برطرفشده در bitcoinjs-lib به همین بخش مربوط بودند و برای برنامههایی اهمیت داشتند که اطلاعات PSBT واردشده را بدون بررسی مستقل میپذیرند.
در نخستین نقص، مقداری که هنگام امضای تراکنش استفاده میشد میتوانست با مقداری که برای محاسبه کارمزد به کار میرفت متفاوت باشد. امضا بر اساس اطلاعات کامل تراکنش قبلی انجام میشد، اما ماژول محاسبه کارمزد ممکن بود یک رکورد متناقض با ارزش پایینتر را ترجیح دهد. در نتیجه، نرمافزار میتوانست تراکنش واقعی را بهدرستی امضا کند، اما هنگام ارزیابی هزینه، ارزش اشتباهی را مبنا قرار دهد.
نمونهای که در اطلاعیه امنیتی آمده، به نسخه 7.0.1 مربوط است. در این نمونه، کارمزد واقعی ۹۰۰ میلیون ساتوشی بود، اما کتابخانه آن را ۲۰۰ ساتوشی گزارش کرد. امضا معتبر بود و استخراج تراکنش نیز بدون فعال شدن هشدار پیشفرض مربوط به نرخ کارمزد بیشازحد انجام شد. ساتوشی کوچکترین واحد بیتکوین است و هر بیتکوین برابر با ۱۰۰ میلیون ساتوشی است.
نقص دوم و دامنه نسخههای آسیبپذیر
آسیبپذیری دوم به ورودیهای نهاییشدهای مربوط میشد که هر دو رکورد ارزش ورودی در آنها وجود نداشت. در این وضعیت، محاسبهگر ارزش چنین ورودیهایی را صفر در نظر میگرفت. یک PSBT که قبلاً توسط طرف دیگری امضا شده بود، میتوانست بدون نیاز به امضای دوباره وارد این محاسبه شود؛ بنابراین وجود امضای معتبر بهتنهایی نشان نمیداد که ارزش ورودی برای محاسبه کارمزد بهدرستی مشخص شده است.
در مثال فرضی اطلاعیه، کارمزد واقعی ۹۱ هزار ساتوشی بود، اما مقدار گزارششده هزار ساتوشی اعلام شد. اسکریپتها و امضاهای نهاییشده، بهتنهایی ارزش ورودیِ ثبتنشده را ثابت نمیکنند.
اطلاعیههای امنیتی منتشرشده در ۲۶ اکتبر، نسخههای اصلاحشده 5.2.2، 6.1.9 و 7.0.4 را برای شاخههای مربوط معرفی میکنند. دامنه نسخههای دارای نقص متقابل در ثبت ارزش، شامل نسخههای 5.2.0 تا 5.2.1، نسخههای 6.0.0 تا 6.1.8، از جمله 6.1.0-rc.0، و نسخههای 7.0.0-rc.0 تا 7.0.3 است. نقص مربوط به نبود رکورد ارزش، همین بازههای نسخههای ۶ و ۷ و همچنین نسخههای 5.1.0 تا 5.2.1 در شاخه ۵ را دربر میگرفت.
پیامد برای توسعهدهندگان برنامههای بیتکوینی
این نقصها بهخودیخود امضا تولید نمیکنند و امکان برداشت مستقیم از دارایی را ایجاد نمیکنند. همچنین زیان واقعی تنها در صورتی رخ میدهد که تراکنشی که مجوز معتبر دارد به شبکه ارسال و پذیرفته شود. اگر چنین تراکنشی با کارمزد اضافی استخراج شود، ارزش مازاد بهعنوان کارمزد به استخراجکننده میرسد.
اصلاحات انجامشده، روش مشترکی برای تعیین خروجیهای قبلی در اختیار بخش امضا و بخش حسابداری قرار میدهد. نسخههای اصلاحشده همچنین باید ارزش یا اسکریپتهای متناقض را رد کنند و برای محاسبه کارمزد، وجود مبلغ مربوط به هر ورودی را الزامی بدانند. پس از تغییر اطلاعات مرتبط یا ترکیب دادهها نیز کارمزدهای ذخیرهشده و تراکنشهای استخراجشده پاک میشوند تا نتیجه قدیمی دوباره استفاده نشود.
توسعهدهندگانی که امکان ارتقا ندارند، باید ارزش خروجیهای مرجع هر ورودی را بهطور مستقل بررسی کنند. همچنین لازم است رکوردهای متناقض پیش از امضا یا اعتماد به کارمزد رد شوند و مبلغ همه ورودیها پیش از استخراج تراکنش یا اتکا به نتیجه محاسبه کارمزد تأیید شود. این موضوع برای کیفپولها، ابزارهای امضای تراکنش و هر برنامهای که PSBT را از طرف دیگر دریافت میکند اهمیت دارد.
تصویر بازار بیتکوین
بر اساس دادههای بازار Moneyiar در ۲۵ اکتبر ۲۰۲۶ ساعت ۲۲:۳۹ به وقت +۰۳:۳۰، قیمت بیتکوین ۸۰٬۴۳۰٫۵۱ دلار بود. این دارایی در ۲۴ ساعت گذشته ۰٫۰۸ درصد و در بازه هفتروزه ۱٫۳۲ درصد کاهش داشت. این ارقام صرفاً تصویر قیمت و تغییرات بازار در زمان ثبت دادهها هستند و ارتباطی با میزان اثرگذاری آسیبپذیریهای bitcoinjs-lib بر تراکنشها ندارند.