История изменений
Исправление 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). Несмотря даже на то, что это может сломать некоторые плохо написанные нормальные программы.