Thu, Jul 02, 2015 at 13:41:33, alex wrote about "[uanog] Лиукс как "огромная дыра"?":
Есть такая таблица- GDT - которая и распределяет все привелегии. Линуховоды считают что она дана богом. Как есть. А обычные системщики знают, что эта таблица создается необычной для линуха програмкой. Необычной в том смысле, что она на ассемблере. И создается она когда нет никаких пользоваттелей и рутов. Сам процессор ее и создает.
Ну правильно - её создаёт загрузчик ядра, в типичных современных системах это ещё часть grub'а, но может и соответствующий код в ядре (при запуске из чего-то более экзотического, вроде NUNI).
Если внимательно почитать тот код с wasm.ru то там как раз и показано, что проц может создать сам себе таблицу GDT, назначить себе права и делать все что угодно.
Ну, не только. GDT создаётся для выхода в защищённый режим, в котором удобно грузить всё остальное (ядро, модули, initrd и тому подобное), но можно обойтись и без этого. И создать таблицу GDT (как структуру в памяти) может любой, а вот её активация как действующей возможна только при CPL==0, то есть в режиме ядра. Обычный процесс даже с рутом работает под CPL==3, и заменить GDT он может только если доберётся до ядра.
Как известно в процессоре каждый сегментный регистр имеет скрытые или теневые (shadow parts) части в которых в защищенном режиме кэшируется дескриптор сегмента, для программиста они невидимы. В защищенном режиме эти части обновляются всякий раз когда в сегментный регистр загружается новое значение, в реальном же режиме обновляются только поля базового адреса сегмента. Если в защищенном режиме создать сегмент с лимитом в 4Гб и загрузить в сегментный регистр такой селектор, после чего переключиться в реальный режим, и, не следуя рекомендациям интел, оставить предел равным 4Гб – значение лимита сегмента сохранится позволяя использовать 32-битные смещения.
Да, "unreal mode" - штука известная. Intel его отказывается документировать, но поддерживает начиная с i386(!) и многие BIOS его используют(!)
Кусок 3................. ... Когда ядро запускает процесс, оно контролирует его полностью. Шаг влево-шаг вправо- побег , расстрел на меcте. Поэтому делают по другому. Этот процесс должен породить дочерний- его система уже не контролирует, только знает о нем и контролировать его должен родитель.
Вот тут начинается бред. Система контролирует _все_ процессы. Рядом коллеги уже объяснили.
А дочерний процесс порождает внучатый- про него уже и система не знает ничего.
Знает. Учитывает, управляет, шедулит...
После этого дочерний должен убить папу, убиться сам, и остается внучок- демон, про который система не знает и не контролирует-
Знает - осиротевший процесс получает init (pid=1) в качестве родителя. В простейшем случае init действует по принципу "такого не знаю => забыть", но изредка вводятся другие полиси.
вот он уже может делать что хочет. Даже весь линух можно прибить, а он останется в памяти работать. пока питание есть. ..................
Вот честно - на OS/360 я ещё помню такие штуки. Систему останавливали, а игра продолжала работать. Далее, можно, да, убить все системные процессы (включая init - не помню, какие настройки для этого нужны, чтобы она не ушла в panic), оставить один (или ни одного! так строили тупые раутеры со статическими таблицами). Оставить, может, один. Но что останется работать и насколько, уже зависит. Сейчас в userland некоторые важные вещи вроде регулятора распределения прерываний по ядрам, или udevd... Далее, чтобы этот процесс "мог делать всё, что хочет", он должен иметь полного рута. И кто ему такое даст? В общем, какая-то дурная адова страшилка для начальной школы. -netch-