Я недавно натолкнулся на статью Microsoft, которая рекламировала новые "защитные улучшения" Windows 7. Конкретно:
Статья продолжила, что "... часть этой обороноспособности находится в базовой операционной системе, и компилятор Microsoft Visual C++ предлагает другим", но не объяснил, как эти стратегии на самом деле увеличат безопасность.
Кто-либо знает почему повышение безопасности системы рандомизации памяти, если вообще? Другие платформы и компиляторы используют подобные стратегии?
Это повышает безопасность, затрудняя прогнозирование того, где что-то будет в памяти. Довольно много эксплойтов переполнения буфера работают, помещая (например) адрес известной подпрограммы в стек, а затем возвращаясь к нему. Это гораздо труднее сделать, не зная адреса соответствующей процедуры.
Насколько мне известно, OpenBSD была первой, кто сделал это, по крайней мере, среди достаточно известных операционных систем для ПК.
Путем рандомизации стека вы совершаете атаки переполнения ванильного буфера, такие как Алеф Один разбить стопку ради забавы невозможно. Причина в том, что атака основана на размещении небольшого количества исполняемого кода, называемого шеллкодом , в предсказуемое место в памяти. Фрейм стека функций поврежден, а его адрес возврата перезаписан значением, выбранным злоумышленником. Когда поврежденная функция возвращает, поток выполнения переходит к шеллкоду злоумышленника. Традиционно этот адрес памяти настолько предсказуем, что он будет одинаковым на всех машинах, на которых работает одна и та же версия программного обеспечения.
Несмотря на расширенную защиту памяти, реализованную в Windows 7, удаленное выполнение кода все еще возможно. Недавно на CanSecWest машина под управлением Windows 7 и IE 8 была взломана в считанные секунды. Вот техническое описание современной атаки с повреждением памяти, использующей висящий указатель в сочетании с переполнением кучи.
Это значительно усложняет атаки типа на libc (или возврат в буфер данных, предоставленный пользователем в случае последних двух). И да, он доступен в Linux, BSD и Mac OS. Как и следовало ожидать, детали зависят от ОС. См. Википедию для введения .