Когда и как использовать функцию защиты стека GCC?

StackOverflow https://stackoverflow.com/questions/1629685

  •  06-07-2019
  •  | 
  •  

Вопрос

Я включил предупреждение -Wstack-protector при компиляции проекта, над которым я работаю (коммерческий многоплатформенный игровой движок C ++, компиляция в Mac OS X 10.6 с GCC 4.2). Этот флаг предупреждает о функциях, которые не будут защищены от разрушения стека, даже если -fstack-protector включен. GCC выдает некоторые предупреждения при сборке проекта:

  

не защищающая функция: нет буфера длиной не менее 8 байт
  не защищает локальные переменные: буфер переменной длины

Для первого предупреждения я обнаружил, что можно настроить минимальный размер, который должен иметь буфер при использовании в функции, для защиты этой функции от разрушения стека: - param ssp-buffer-size = X , где X по умолчанию равно 8 и может быть всего 1.

Во втором предупреждении я не могу подавить его появление, если я не перестану использовать -Wstack-protector .

<Ол>
  • Когда следует использовать -fstack-protector ? (как, например, все время во время разработки или просто при отслеживании ошибок?)
  • Когда следует использовать -fstack-protector-all ?
  • Что мне говорит -Wstack-protector ? Предлагает ли я уменьшить минимальный размер буфера?
  • Если да, то есть ли недостатки при установке размера в 1?
  • Похоже, что -Wstack-protector не тот тип флага, который вы всегда хотите включить, если вы хотите сборку без предупреждений. Это правильно?
  • Это было полезно?

    Решение

    Защита стека - это стратегия защиты, а не стратегия отладки. Если ваша игра работает в сети или содержит данные, поступающие из неконтролируемого источника, включите ее. Если данные не поступают из-под контроля, не включайте их.

    Вот как это работает: если у вас есть ошибка и вы меняете буфер, основываясь на том, что злоумышленник может контролировать, этот злоумышленник может перезаписать адрес возврата или аналогичные части стека, чтобы заставить его выполнить свой код вместо вашего код. Защита стека прервет вашу программу, если обнаружит это. Ваши пользователи не будут счастливы, но они также не будут взломаны. Это не тот тип взлома, который связан с мошенничеством в игре, это тип взлома, когда кто-то использует уязвимость в вашем коде для создания эксплойта, который потенциально может заразить вашего пользователя.

    Для решений, ориентированных на отладку, посмотрите на такие вещи, как mudflap.

    Что касается ваших конкретных вопросов:

    <Ол>
  • Используйте средство защиты стека, если вы получаете данные из неконтролируемых источников. Ответ на это, вероятно, да. Так что используйте это. Даже если у вас нет данных из неконтролируемых источников, вы, вероятно, в конечном итоге или уже будете иметь и не осознавать это.
  • Можно использовать защиту стека для всех буферов, если вы хотите дополнительную защиту в обмен на некоторое снижение производительности. Из руководства gcc4.4.2 :

      
        
          

    -fstack-протектор

                 

    Создайте дополнительный код для проверки переполнения буфера, такого как атаки с разбивкой стека. Это делается путем добавления переменной защиты к функциям с уязвимыми объектами Это включает в себя функции, которые вызывают alloca, и функции с буферами, размер которых превышает 8 байтов. Защитные устройства инициализируются при входе в функцию, а затем проверяются при выходе из функции. Если контрольная проверка не пройдена, выдается сообщение об ошибке и программа завершается.

                 

    -fstack-протектор-все

                 

    Как -fstack-protector, за исключением того, что все функции защищены.     

      
  • В предупреждениях указано, какие буферы не может защитить защита стека.

  • Это не обязательно означает уменьшение минимального размера буфера, а при размере 0/1 он такой же, как и для stack-protector-all. Он только указывает вам на это, чтобы вы могли, если вы решите изменить код, чтобы буфер был защищен.
  • Нет, эти предупреждения не представляют проблем, они просто указывают вам информацию. Не используйте их регулярно.
  • Другие советы

    Вы действительно не должны заботиться о предупреждении для нормальных сборок. Это действительно больше информационное сообщение. Я надеюсь, что очевидно, что у вас есть внутренняя проблема безопасности с буферами переменного размера в стеке; неправильно вычислите размер, и вы открываете большую дыру.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top