Snipe-IT 8.6.3 и более ранние версии (и разработка предварительных коммитов до исправления) содержат состояние гонки в путях извлечения ресурсов. Api\AssetsController::checkout() и Assets\AssetCheckoutController::store() вызывают Asset::availableForCheckout() вне пути мутации, а затем вызывают Asset::checkOut() без блокировки строки или повторной проверки доступности, поэтому два одновременных запроса на получение одного и того же доступного актива могут одновременно обнаружить его как доступный и оба зафиксировать. Это создает дублирующиеся строки истории проверок, удвоенный checkout_counter и два события CheckoutableCheckedOut для актива с одним назначением, что нарушает контрольный журнал и отчеты об использовании/сверке; Последнее назначение_to актива остается единственным, поэтому видимое назначение остается нетронутым.
Для эксплуатации требуется аутентифицированный сеанс, имеющий разрешение assets.checkout (или суперпользователя) и точное время одновременной работы. Исправлено в 8.7.0.
Показать оригинальное описание (EN)
Snipe-IT 8.6.3 and earlier (and develop pre-release commits prior to the fix) contain a race condition in the asset checkout paths. Api\AssetsController::checkout() and Assets\AssetCheckoutController::store() call Asset::availableForCheckout() outside the mutation path and then invoke Asset::checkOut() without taking a row lock or re-checking availability, so two concurrent checkout requests for the same available asset can both observe it as available and both commit. This produces duplicate checkout-history rows, a doubled checkout_counter, and two CheckoutableCheckedOut events for a single-assignment asset, corrupting the audit trail and utilization/reconciliation reporting; the asset's final assigned_to remains singular, so the visible assignment stays intact. Exploitation requires an authenticated session holding the assets.checkout permission (or superuser) and precise concurrent timing. Fixed in 8.7.0.
Характеристики атаки
Последствия
Строка CVSS v4.0