Разработчики bitcoinjs-lib 26 октября раскрыли две уязвимости высокой опасности в расчёте комиссий частично подписанных биткоин-транзакций — PSBT. В демонстрации одной из ошибок библиотека показала комиссию 200 сатоши, хотя действительная комиссия корректно подписанной транзакции составляла 900 млн сатоши, или 9 BTC. Приложение, доверившееся этому расчёту, могло пропустить предупреждение о чрезмерной комиссии.

PSBT хранит саму транзакцию и служебные данные о расходуемых выходах. В первом случае пакет мог содержать две противоречащие друг другу записи об одном выходе: код подписи проверял полную предыдущую транзакцию, а счётчик комиссии брал меньшее ложное значение из другой записи. Встроенная проверка максимальной комиссии использовала тот же заниженный результат.

Во второй уязвимости bitcoinjs-lib принимала финализированный вход без данных о стоимости расходуемого выхода и считала его вклад равным нулю. В примере разработчиков реальная комиссия в 91 тыс. сатоши отображалась как 1 тыс. Обе ошибки не позволяют создать подпись без ключа и сами по себе не переводят деньги автору вредоносного PSBT: лишняя сумма становится комиссией майнеру. Для потери средств приложение должно принять такие данные, не проверить выходы самостоятельно, а затем отправить действительную транзакцию в сеть. На 28 октября разработчики не сообщали о подтверждённых атаках, потерях или конкретных затронутых кошельках.

Исправления вышли в bitcoinjs-lib 5.2.2, 6.1.9 и 7.0.4. Тем, кто пока не может обновиться, разработчики советуют самостоятельно сверять каждый расходуемый выход и отклонять расхождения до подписи или извлечения транзакции. Масштаб потенциальной цепочки зависимостей заметный: на странице npm 28 октября у пакета было указано около 295 тыс. загрузок за неделю, но число загрузок не показывает, сколько приложений использовали уязвимый код именно для приёма чужих PSBT.