Как Эльбрус помог исправить уязвимость в tar

Начало истории: 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