Начало истории: https://blog.handydev.com/admin/edit-content/compiling-apps-in-protected-mode
Эльбрус в защищённом режиме всё-таки выявил настоящую уязвимость в программе tar c доступом в неинициализированную область памяти! Поиск и исправление занял не очень много времени, т.к. сбойнул лишь один тест, а программа компактная.
Не проходил тест, добавленный этим комитом: https://git.savannah.gnu.org/cgit/tar.git/commit/?id=336519aa4f81415a34064d3342ce1d984be5f290
Но напрямую проблема не была связана с изменениями, связанными с ним; однако, вызывалась уязвимость именно файлом архива нулевого размера, открываемым в процессе работы с некорректным файлом, на самом деле не являющимся архивом tar.
Как несложно убедиться в файле buffer.c, метод gnu_flush_read читает входной файл блоками размером с record_size, но не переживает, если прочитано на самом деле меньше. Ну а далее, разумеется, все эти 10240 байт случайной памяти попадают на вход других методов, понятно, что это плохо.
Исправление было несложным.
if(status < record_size)
{
//We didn't read the entire buffer, so we need to fill it with zeroes
size_t unreadSize = record_size - status;
memset(record_start->buffer + status, 0, unreadSize);
}
После строки 1522 закрывают уязвимость. Теперь пропатченный tar проходит все тесты в защищённом режиме!
## ------------- ##
## Test results. ##
## ------------- ##
219 tests were successful.
19 tests were skipped.
Патч отправлен: https://savannah.gnu.org/patch/index.php?10081