Кис Кук (Kees Cook), главный сисадмин kernel.org и лидер Ubuntu Security Team, предложил (http://lkml.org/lkml/2010/11/7/113) в списке рассылки разработчиков Linux-ядра с целью повышения безопасности расширить области использования в ядре страниц памяти, переведенных в режим "только чтение". Данная мера позволит реализовать упреждающую защиту от эксплуатации уязвимостей, связанных с возможностью перезаписи областей памяти ядра, вследствие ошибок.
Цель инициативы проста - перевести ядро насколько это возможно на работу с памятью в режиме только для чтения, особенно в местах в которых фигурируют указатели на функции и в точках возможного перехвата управления, которые являются главной мишенью атак злоумышленников, в случае обнаружения ошибок (http://lwn.net/Articles/410606/), приводящих к возможности записи в области памяти ядра.
В качестве базиса для реализации данной идеи предложено использовать ранее начатую в рамках проекта PaX работу по реорганизации таблиц указателей на ф...URL: http://lkml.org/lkml/2010/11/7/113
Новость: http://www.opennet.me/opennews/art.shtml?num=28587
а почему нельзя весь код сделать запрещённым для записи после инициализации (загрузил модуль и замок на него) а на все данные - запрет на исполнение ?
видимо потому, что бывает надо что-нибудь позаписывать
бывает иногда
> видимо потому, что бывает надо что-нибудь позаписывать
> бывает иногдаа что надо то позаписывать ? и почему позаписываемое требуется исполнять ??? это специально сделанная задняя калитка для хакеров ?
Это наследие костылей x86
если я ничего не забыл
из за языков высокого уровня компиляторы которых часто перемешивают области данных с областями кода. т.е. нет четкой разницы что обозначив эту страницу памяти только на чтение ты тем самым не поставишь только на чтение часть данных.поправьте меня если я подзабыл.
О чём вы говорите? Linux написан на сях и ассемблере.
если ты пытался указать на трамплины, то они только в стеке.
Остальные компиляторы уже давно не путают код и данные, особенно те которые с модификатором const или static.
И я не помню чтобы путали. Си[++] всегда рассовывал код и данные с разными типами хранения по соответствующим сегментам. Не знаю насчет старых версий Паскаля, но сейчас он, вроде бы, делает так же. Может быть, бейсики какие-нибудь валят код и данные в одну кучу?
Мешает отсутствие поддержки такого запрета на уровне процессора для многих архитектур (линукс не ограничивается работой только с современными CPU с поддержкой NX-бита, да).
NX-бит это "новость" конешно.. "The ARM architecture refers to the feature as XN for eXecute Never; it was introduced in ARM v6"
но со времён пентиумов (или даж 386, не помню) есть же это на x86 ???
http://fat-crocodile.narod.ru/protected/02_segments.html
Таблица 1. Формат дескриптора сегмента кода/данных.
3-й бит пятого байта Code/Data Если флаг установлен, дескриптор описывает сегмента кода, если сброшен – сегмент данных.
Свойства сегмента определяют его тип и правила использования (попытка использовать сегмент не по правилам обычно приводит к исключению #GP). Не вдаваясь в детали, можно выделить следующие типы сегментов:
* Сегмент кода (code segment). Допустимо исполнение, может быть разрешено чтение.
* Сегмент данных (data segment). Допустимо чтение, может быть разрешена запись.
используется в Глобальная таблица дескрипторов и заполняется при переходе в защищённый режим процессора, является одной из основ защищённого режимаможно же было для x86 почесаться, это же не один процессор и даже не несколько процессоров одной фирмы !
Кабы не соврать, но NX бит, случаем, не с четвертых пней (Prescott(?)) пошел? Если так, то раритетных компов еще слишком много.P.S. Мне так вспоминается, что поддержкой NX оффтопик во времена XP SP2 хвастаться начал. А это не так уж давно было.
> Кабы не соврать, но NX бит, случаем, не с четвертых пней (Prescott(?))
> пошел? Если так, то раритетных компов еще слишком много.
> P.S. Мне так вспоминается, что поддержкой NX оффтопик во времена XP SP2
> хвастаться начал. А это не так уж давно было.я скопипастил описание не NX-бита а механизм защиты памяти защищённого режима 386 процессоров (ну мб 486 или пентиумов), и работал я на 486 с 95 виндой...
почему сей механизм не используется на x86 компах ?
>> Кабы не соврать, но NX бит, случаем, не с четвертых пней (Prescott(?))
>> пошел? Если так, то раритетных компов еще слишком много.
>> P.S. Мне так вспоминается, что поддержкой NX оффтопик во времена XP SP2
>> хвастаться начал. А это не так уж давно было.
> я скопипастил описание не NX-бита а механизм защиты памяти защищённого режима 386
> процессоров (ну мб 486 или пентиумов), и работал я на 486
> с 95 виндой...
> почему сей механизм не используется на x86 компах ?в документации к pax и grsecurity все разжеванно
>>> Кабы не соврать, но NX бит, случаем, не с четвертых пней (Prescott(?))
>>> пошел? Если так, то раритетных компов еще слишком много.
>>> P.S. Мне так вспоминается, что поддержкой NX оффтопик во времена XP SP2
>>> хвастаться начал. А это не так уж давно было.
>> я скопипастил описание не NX-бита а механизм защиты памяти защищённого режима 386
>> процессоров (ну мб 486 или пентиумов), и работал я на 486
>> с 95 виндой...
>> почему сей механизм не используется на x86 компах ?
> в документации к pax и grsecurity все разжеванноможно ссылку ? боюсь я не смогу самостоятельно найти
http://en.wikipedia.org/wiki/PaX
http://pax.grsecurity.net/docs/
> http://en.wikipedia.org/wiki/PaX
> http://pax.grsecurity.net/docs/документацию я бы нашёл и сам, а вот где в ней про сложности с этим ?
> я скопипастил описание не NX-бита а механизм защиты памяти защищённого режима 386 процессоров (ну мб 486 или пентиумов)
> почему сей механизм не используется на x86 компах ?
Ограничение на запись на основе сегментов неудобно и неэффективно с точки зрения использования памяти, и AFAIK нигде не используется (для каждого типа сегментов в дескрипторах выделяется все адресное пространство, соответственно они пересекаются, и модифицировать код спокойно можно через дескриптор данных). Поэтому и придумали NX бит.
> Ограничение на запись на основе сегментов неудобно и неэффективно с точки зрения
> использования памяти, и AFAIK нигде не используется (для каждого типа сегментов
> в дескрипторах выделяется все адресное пространство, соответственно они пересекаются,
> и модифицировать код спокойно можно через дескриптор данных). Поэтому и придумали
> NX бит.зачем выделять для сегмента кода и сегмента данных всю память ? почему нельзя выделять именно столько сколько требуется ? контекстами щёлкают всё равно - при переключении задач
вобще сейчас принято использовать 1 общий сегмент для ядра и 1 общий сегмент для всего юзерспейса ?
>зачем выделять для сегмента кода и сегмента данных всю память ? почему нельзя выделять именно столько сколько требуется ?А сколько требуется?:) Почитайте про используемую по у молчанию в linux модель памяти.
Внизу заметили что PaX может использовать SEGMEXEC путем деления виртуальной памяти пополам, но в стандартное ядро он не принят.
>вобще сейчас принято использовать 1 общий сегмент для ядра и 1 общий сегмент для всего юзерспейса ?
Почему один? Что значит общий? Перекрывающиеся сегменты для каждого процесса со своим адресным пространством. На самом деле документации в сети по этому поводу навалом, поищите.
> Ограничение на запись на основе сегментов неудобно и неэффективно с точки зрения
> использования памяти, и AFAIK нигде не используется (для каждого типа сегментовВ PaX используется на процессорах без поддержки NX. Есть много задач, где сегментов по 1.5 ГБ более чем достаточно.
Вот ещё статья по схожей тематике: http://lwn.net/Articles/413213/
Мило. Только почему-то не упоминается, в результате всего этого счастья в некоторых случаях ядро будет падать при загрузке.>The reason the RO/NX patch from Siarhei Liakh is not upstream yet is rather mundane: it introduced regressions - it caused boot crashes on one of my testboxes.
Надеюсь, что эта инновация не пройдет в апстрим. Ну а в ubuntu она будет смотреться очень органично ;-)
врядли изза этого
просто пока пилили одно - отпилили что-то другое
так бывает
там речь о конкретном патче
"But there is no fundamental reason why it shouldnt be upstream. We can push it
upstream if the crashes are resolved"Там речь о конкретных багах.
> Мило. Только почему-то не упоминается, в результате всего этого счастья в некоторых
> случаях ядро будет падать при загрузке.
>>The reason the RO/NX patch from Siarhei Liakh is not upstream yet is rather mundane: it introduced regressions - it caused boot crashes on one of my testboxes.
> Надеюсь, что эта инновация не пройдет в апстрим. Ну а в ubuntu
> она будет смотреться очень органично ;-)Ну а фигли - пытаются ставить NX bit на стек, а gcc туда сует трамплины.. вот и получаем бяку..
Тогда было бы логично, если бы бяка случалась чуть чаще, чем "on one of testboxes"
>Ну а фигли - пытаются ставить NX bit на стек, а gcc туда сует трамплины.. вот и получаем бяку..Ещё пять лет назад были патчи на glibc, gcc и остальных, заменящие такой код.
существуют - только тогда прийдется отказываться от nested functions
http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html.что приводит к нарушению стандарта на язык C.
Во-первых, трамплины можно эмулировать: http://pax.grsecurity.net/docs/emutramp.txt
Во-вторых, вложенные функции для Си *не* стандартизированы и крайне редко встречаются. Но даже при отсутствии эмуляции код с вложенными функциями можно в порядке исключения (!) запускать на исполняемом стеке - paxctl и аналоги в помощь.
> Во-первых, трамплины можно эмулировать: http://pax.grsecurity.net/docs/emutramp.txt
> Во-вторых, вложенные функции для Си *не* стандартизированы и крайне редко встречаются.
> Но даже при отсутствии эмуляции код с вложенными функциями можно в
> порядке исключения (!) запускать на исполняемом стеке - paxctl и аналоги
> в помощь.или я не понимаю что такое трамплины или вот им замена в x86
http://stfw.ru/page.php?id=9905
Команды передачи управления
JMP target Имеет пять форм, различающихся расстоянием назначения от текущего адреса, и способом задания целевого адреса. При работе в Windows используется в основном внутрисегментный переход (NEAR) в пределах 32-битного сегмента. Адрес перехода может задаваться непосредственно (в программе это метка) или косвенно, т.е. содержаться в ячейке памяти или регистре (JMP [EAX]).тоесть можно осуществить переход по заданому в переменной (регистре) адресу, тоесть запись в сегмент кода не требуется !
Вообще PaX печально знаменит тем, что падает по поводу и без.Похоже, сотрудники Canonical решили защитить ядро по самой простой схеме: паникующее ядро нельзя взломать.
Унылый вброс. По делу: разработчики PaX и Grsecurity выпускают стабильные патчи на 2.6.32.х, а hardened-sources-2.6.32-rX в Hardened Gentoo проходят дополнительные этапы стабилизации (и могут использоваться в других дистрибутивах). Не скажу, что всё всегда гладко, но "падает по поводу и без" - явное преувеличение. Сам встречал панику только пару раз и только на этапе загрузки ядра. Если тестировать ядра перед запуском в продакшен, проблем практически нет.
>По делу: разработчики PaX и Grsecurity выпускают стабильные патчи на 2.6.32.х, а hardened-sources-2.6.32-rX в Hardened Gentoo проходят дополнительные этапы стабилизации (и могут использоваться в других дистрибутивах).То-то hardened-sources вечно замаскированы =)
> То-то hardened-sources вечно замаскированы =)В не-hardened профилях - конечно.
> Вообще PaX печально знаменит тем, что падает по поводу и без.
> Похоже, сотрудники Canonical решили защитить ядро по самой простой схеме: паникующее ядро
> нельзя взломать.pax то как раз не падает. Падают проги в которых активно используются "грязные хаки"
сисадмин kernel.org и лидер Ubuntu Security Team? Ничего себе... Убунтоиды делают что-то полезное!
I am a kernel.org admin, where I work on maintaining the mirror network for the Linux Kernel, as well as handling user accounts.https://wiki.ubuntu.com/KeesCook
То есть, его задача - поддержка сервера kernel.org и управление учетными записями пользователей, а вы что подумали?
Еще он прославился переводом серверов Linux Foundation с Red Hat на Ubuntu.
Cуровый убунтоид, однако. Под шапкой таки спокойнее, чем без нее. Зима, вон, впереди :-)
>Еще он прославился переводом серверов Linux Foundation с Red Hat на Ubuntu.kernel.org пока еще на федоре, так что всё хорошо.
А linux foundation нехай падает =)
А разве уже так не делается?...
[ 0.675209] lo: Disabled Privacy Extensions
[ 0.675346] Mobile IPv6
[ 0.675349] NET: Registered protocol family 17
[ 0.675407] PM: Resume from disk failed.
[ 0.675418] registered taskstats version 1
[ 0.675598] rtc_cmos 00:03: setting system clock to 2010-11-10 04:33:07 UTC (
1289363587)
[ 0.675620] Initalizing network drop monitor service
[ 0.675656] Freeing unused kernel memory: 600k freed
>>> [ 0.675773] Write protecting the kernel read-only data: 6144k[ 0.675897] Freeing unused kernel memory: 240k freed
[ 0.676015] Freeing unused kernel memory: 448k freed
[ 0.693243] udev[77]: starting version 163
[ 0.693392] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input0
[ 0.742266] Floppy drive(s): fd0 is 1.44M
...
> А разве уже так не делается?А читаем текст новостей по диагонали?
..._расширить_ области использования в ядре страниц памяти, переведенных в режим "только чтение"...
лучше бы перенесли не различные улучшения PaX и grsecurity, а все.
vm86 используется в линуксе?
Имя поправили, спасибо.
Я все-равно не понимаю, почему нельзя было изначально в ядре запретить писать в сегмент данных код и запускать код из сегмента данных. Такие ограничения поддерживал еще 80286!!
Трмаплины gcc для вложенных функций? Это единственная проблема?! Если да -- выжечь трамплины и приделать любой безопасный костыль.
Честно говоря не понимаю смысла NX-бита, если в 286 уже все было, только не на уровне страниц, а на уровне сегментов.
Припоминается одна ОС, у которой одной из основных задач при разработке ставилось организовать безопасную работу с ОЗУ. Всё разрабатывалась и разрабатывалась. А когда, наконец, было разработана, её потенциальный рынок давно завоевали другие ОС.Я сейчас про "OS/2" :)
Однако вашу мысль я поддерживаю, за такое кол-во времени было бы весьма неплохо всё-таки успеть разобраться с подобными проблемами :)