LINUX.ORG.RU

История изменений

Исправление eternal_sorrow, (текущая версия) :

только так!

Для security critical софта, такого как pkexec - согласен. Но вообще, необязательно. argv - NULL-терминированный массив. если его итерировать правильно, то нет нужды дополнительно проверять argc. В данном случае авторы pkexec зачем то вздумали не просто читать из этого массива, а писать в него, не проверяя при этом, существует такой элемент в нём вообще или нет. В этом суть уязвимости.

Всё осложняется тем, что при нормальном запуске программы argc не может быть равен нулю. Как минимум argv[0] всегда содержит имя исполняемого файла. Но execve в линуксе поволяет передать в эту переменную любое значение, в том числе пустой массив. Авторы pkexec этого не учли.

В опубликованном фиксе это учтено, а в LKML разработчики ядра вроде как пришли к консенсусу, что такие вызовы execve невалидны (как это сделано в OpenBSD). Несмотря даже на то, что это может сломать некоторые плохо написанные нормальные программы.

Исправление eternal_sorrow, :

только так!

Для security critical софта, такого как pkexec - согласен. Но вообще, необязательно. argv - NULL-терминированный массив. если его итерировать правильно, то нет нужды дополнительно проверять argc. В данном случае авторы зачем то вздумали не просто читать из этого массива, а писать в него, не проверяя, существует такой элемент в нём вообще или нет. В этом суть уязвимости.

Всё осложняется тем, что при нормальном запуске программы argc не может быть равен нулю. Как минимум argv[0] всегда содержит имя исполняемого файла. Но execve в линуксе поволяет передать в эту переменную любое значение, в том числе пустой массив. Авторы pkexec этого не учли.

В опубликованном фиксе это учтено, а в LKML разработчики ядра вроде как пришли к консенсусу, что такие вызовы execve невалидны (как это сделано в OpenBSD). Несмотря даже на то, что это может сломать некоторые плохо написанные нормальные программы.

Исправление eternal_sorrow, :

только так!

Для security critical софта, такого как pkexec - согласен. Но вообще, необязательно. argv - NULL-терминированный массив. если его итерировать правильно, то нет нужды дополнительно проверять argc. В данном случае авторы зачем то вздумали не просто читать из этого массива, а писать в него, не проверяя, существует такой элемент в нём вообще или нет. В этом суть уязвимости.

Всё осложняется тем, что при нормальном запуске программы argc не может быть равен нулю. Как минимум argv[0] всегда содержит имя исполняемого файла. Но execve в линуксе поволяет передать в эту переменную любое значение, в том числе пустой массив. Авторы pkexec этого не учли.

В опубликованном фиксе это учтено, а в LKML разработчики вроде как пришли к консенсусу, что такие вызовы execve невалидны (как это сделано в OpenBSD). Несмотря даже на то, что это может сломать некоторые плохо написанные нормальные программы.

Исходная версия eternal_sorrow, :

только так!

Для security critical софта, такого как pkexec - согласен. Но вообще, необязательно. argv - NULL-терминированный массив. если его итерировать правильно, то нет нужды дополнительно проверять argc. В данном случае авторы зачем то вздумали не просто читать из этого массива, а писать в него, не проверяя, существует такой элемент в нём вообще или нет. В этом суть уязвимости.

Всё осложняется тем, что при нормальном запуске программы argc не может быть равен нулю. Как минимум argc[0] содержит имя исполняемого файла. Но execve в линуксе поволяет передать в эту переменную любое значение, в том числе пустой массив. Авторы pkexec этого не учли.

В опубликованном фиксе это учтено, а в LKML разработчики вроде как пришли к консенсусу, что такие вызовы execve невалидны (как это сделано в OpenBSD). Несмотря даже на то, что это может сломать некоторые плохо написанные нормальные программы.