2017-02-23

waqur: (Default)
Одна вещь, которую я никогда не понимал в контексте теории борьбы с эксплоитами, основанными на stack corruption в коде, написанном на C/C++ и других небезопасных языках — это почему не используется расщепление стека надвое:

1. Доверенный стек: там обязательно должны быть адреса возврата из функций, параметры вызываемых функций; а также там могут быть локальные переменные, на которые не берётся указатель.

2. Недоверенный стек: там обязательно должны быть все локальные переменные, на которые берётся указатель — и далее либо ускользает из локального контекста, либо используется таким образом, что компилятор не может статическим анализом доказать нахождение индекса в безопасных границах. Недоверенный стек, в отличие от доверенного, мог бы расти в виртуальной памяти снизу вверх, чтобы разного рода эксплоиты упирались либо в неотображённые страницы, либо перезаписывали мусорные данные в свободной области недоверенного стека.

Не хватает регистров? Но мы ведь уже давно пишем не для 8-битных микроконтроллеров: в процессорной архитектуре x86-64 вдвое больше регистров, чем в x86, а ещё они вдвое шире. "Второй RSP" отлично поместился бы в каком-нибудь R13. Доверенный стек может быть исполняемым, недоверенный — всегда нет. Это бы решило проблемы несовместимости DEP (Data Execution Prevention) с GCC Nested Functions и всякими прочими closures из других языков. Очевидно, что глобальная оптимизация (которая называется в разных компиляторах по-разному: LTO, LTCG, IPO) могла бы существенно сократить количество случаев, когда нужен недоверенный стек.

Компиляторы и операционные системы могли бы поддерживать разные уровни параноидальности в реализации недоверенного стека:
* просто обычный стек
* стек со вставкой канареек в фрейм каждой функции
* стек со вставкой канареек после каждого объекта
* стек с чередованием отображённых и неотображённых страниц и с таким выравниванием каждого объекта, чтобы на следующем байте начиналась неотображённая страница
* полный запрет на существование недоверенного стека — подходящее решение для аэрокосмической/автомобильной/военной промышленности и медицины

Вместо этого индустрия вот уже лет десять или двадцать полагается на благие пожелания в вольной художественной форме, такие как MISRA C, или городит какие-то ASLR (которые не всегда работают), W^X, DEP, разные попытки противодействия ROP (например G-free и CFG), принудительные автоматические обновления, Rust и прочие глупости, которые проблему в общем-то и не решают, а так, царапают по поверхности.

September 2017

S M T W T F S
     12
34567 89
10111213141516
17181920212223
24252627282930

На этой странице

Автор стиля

Развернуть

No cut tags
Page generated 2017-09-21 03:25 am
Powered by Dreamwidth Studios