Тео Де Раадт плановете за укрепване на механизма за защита на паметта W^X (Запис XOR Изпълнение). Същността на механизма е, че страниците памет на процеса не могат да бъдат достъпни едновременно за запис и изпълнение. По този начин, кодът може да бъде изпълнен само след забрана на записа, а записът в страницата памет е възможен само след забрана на изпълнението. Механизмът W^X помага да се защитят приложенията в потребителското пространство от типични атаки, извършвани чрез преливане на буфер, включително от преливания на стека и е активен в OpenBSD. .
От самото начало на работата по W^X беше ясно, че това е дълъг път, тъй като съществува значително количество приложения, използващи JIT. Реализациите на JIT могат да бъдат разделени на три категории:
- Превключващи паметта между състояния W и X, примирявайки се с "цената" на системния повик. .
- Създаващи псевдоними между двойка W и X отразявания на същата памет.
- Най-"мързеливият" вариант — изискващи модел на памет W|X, допускащ едновременно извършване на запис и изпълнение.
В момента значително по-малко програми използват третия вариант и повече използват първия и втория. Все пак, тъй като беше необходимо да се стартират и програми с W|X JIT (в предимно Chromium и Iridum), беше добавена опция за монтиране на файловата система "wxallowed", която позволяваше използване на паметта едновременно и за запис, и за изпълнение, в случай че изпълняваният ELF файл е маркиран с маркер "wxneeded", а самите приложения допълнително се защитават, използвайки механизмите и за ограничаване на списъка на използваните системни повиквания и достъпните за приложението части от файловата система съответно.
За допълнително усложняване на експлоатацията на уязвимости в подобни приложения е предложено допълнение на механизма , което проверява дали системният повик се извършва от достъпна за запис страница памет. Ако страницата е достъпна за запис, процесът бива принудително завършван. По този начин, злонамереният нападател не може да използва системни повиквания и ще трябва да се опита да намери нужните геджети в реализацията на JIT или дори да извърши по-трудната задача на откритие на блокировки на системни повиквания непосредствено в .
Процесите Chrome/Iridium са достатъчно защитени чрез pledge и unveil, но ограничаването на възможността да се използва, например, системния повик write(2), очевидно има предимства, тъй като създава допълнителни затруднения за атакуващия. Въпреки това, затруднения могат да възникнат и в случаите, когато реализирането на JIT използва нативни системни повици от W|X памет. Въпреки това, има основания да се вярва, че с подобно нещо не ще се сблъскаме, тъй като ABI многократно е променяно, но никога не е докладвано за проблеми.
Промените вече са налични в редовните снимки на клона OpenBSD-CURRENT, всички заинтересовани са поканени да тестват.
Отделен коментар от Тео заслужиха свързаните новини относно появата в Chrome/Iridium на режим . От гледна точка на Тео, това е приемливо за някои модели на употреба, обаче вероятно не за всички, тъй като в този режим очевидно ще се увеличи натоварването на процесора. В момента Chrome ще функционира основно, ако се деактивира 'wxallowed' за /usr/local, въпреки че са вероятни проблеми с някои разширения (например ghostery). Както и да е, Тео се надява, че пълната функционалност в JITless режима ще бъде доведена до напълно работно състояние в близко бъдеще.
Източник: opennet.ru
