Автор Тема: Възможно ли е процес да тръшне цялата система  (Прочетена 7288 пъти)

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Сега въпросът звучи малоумно на пръв поглед, ама си е доста резонен '<img'>

Преди малко бях потресен от това колко е елементарно за реализиране върху x86 платформа, един процес да тръшне цялата операционна система. По един най-брутален начин, който ми разбива  фантазиите за защитения режим.

Разбира се, има немалко начини да се реализира - примерно можеш да malloc-ваш много памет, докато операционната система се тръшне, да хванеш да пишеш глупости в /dev/mem. Форкбомбите не се приемат, защото там дефакто много процеси тръшват машината.

И сега нещо като задача '<img'> За който му идва наум, най-малката програмка, която да тръшва системата. Може да се изпълнява и с root-ски привилегии, няма значение, въпросът е да не е kernel module, т.е да не се изпълнява в ring0, защото там е изключително лесно да тръшнеш машината.

Аз го реализирах с 5-6 реда на С '<img'> Ама няма да кажа как де '<img'>

Нямате право да форк-вате и изпълнявате други процеси. Идеята е машината да забие.

Айде да видим сега какво ще измислите '<img'>
Активен

"Knowledge is power" - France is Bacon

Ivshti

  • Напреднали
  • *****
  • Публикации: 322
  • Distribution: Linvo 2010.3
  • Window Manager: Gnome
    • Профил
    • WWW
Ми аз ползвах cat..
cat fail > /dev/mem '<img'>
Чудя се, какво ще стане от dd if=/dev/root of=/dev/mem '<img'> не ми се забива системата сега...
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Ще крашне '<img'>

Иначе това което ме стресна беше това:

...
iopl(3);
asm("cli");
...

Първото set-ва I/O привилегиите, второто изпълнява инструкцията CLI (която забранява прекъсванията).

По принцип CLI би следвало да може да се вика само в ring0 (kernel-mode). Използва се в критични секции от код (чието изпълнение не бива да се прекъсва), където случайно вдигане на прекъсване може да доведе до кофти проблеми. По този начин се забранява включително timer interrupt-a и следователно process scheduling-a не се случва. Дефакто cli превръща хубавата многозадачна система в нещо подобно на ДОС '<img'> Заради което кодът който се изпълнява между cli/sti трябва да се изпълнява максимално бързо и да е стабилен, защото забие ли, отнася го цялата система. И прост пример - например не искаш context switch-а да бъде прекъснат от току-що получен пакет от мрежовата карта, затова докато трае магията, прекъсванията се забраняват с cli после се разрешават с sti.

Дотук добре, ама се оказва че нещата били малко по-различни '<img'>

x86 архитектурата позволявала освен достъп до периферията (in/out), също така изпълняването на cli/sti инструкциите при условие че CPL<=IOPL. CPL не може да се промени, в линукс всички юзърски процеси имат cpl=3, демек работят в ring3.

IOPL....ами това се променя с iopl(). Ако I/O Privilege Level-a ти стане 3....тогава CPL=3, IOPL=3, CPL<=IOPL => имаш право да забраняваш прекъсванията в рамките на твоят процес!!!

Сега остава забавното, защо това е възможно в линукс.

Съществуването на iopl() е оправдано ЕДИНСТВЕНО заради някои определени X сървъри....както и заради особено великите модерни userspace драйвери.

В линукс съществуват само две положения....ring0 (CPL=0) - kernelspace....и ring3 (CPL=3) - userspace. Архитектурата позволява CPL=1 или 2, но линукс не се възползва от това. Доколкото съм чел обаче, уиндоус го прави.

Единственото хубаво нещо е че ядрото не ти позволява да си смениш IOPL ако не си привилегирован потребител (root).


Сега остават два въпроса:

1) Защо има ТОЛКОВА ОГРОМНО желание в линукс да се имплементират userspace драйвери, след като идейно нещата не са изчистени? Според мен може да се измисли един механизъм, в който въпросните драйвери да работят в ring1 и да има някакъв механизъм чрез който обикновен демон работещ в ring3 да ги изпълнява, да следи дали работят и да ги вдига ако паднат. Съответно да има някакъв механизъм чрез който авторизирани такива модули да могат да се зареждат.

2) Защо развиват теории според които юзърспейските драйвери са толкова стабилни и сигурни, след като един проблем в критична секция може отново да доведе до сриване на цялата система е отвъд моите разбирания.


П.П а ето и една миниатурна програма за крашване на линукс системи '<img'>


Примерен код

#include <sys/io.h>
void main() {
iopl(3);
asm("cli");
while (1) {}
}
Активен

"Knowledge is power" - France is Bacon

bulg

  • Напреднали
  • *****
  • Публикации: 916
  • Distribution: *bsd/linux
  • Животът е тръпка... иначе живот ли е това...
    • Профил
    • WWW
Цитат (gat3way @ Сеп. 19 2008,14:45)
Аз го реализирах с 5-6 реда на С '<img'> Ама няма да кажа как де '<img'>
....
Айде да видим сега какво ще измислите '<img'>

Mи кажи, де, щом знаеш. Искаш да 'земеш без да дадеш ... '<img'>

ред.: Ти вече си си каз`aл, докато съм пис`ал '<img'>



Активен

http://www.youtube.com/watch?v=9rX8Fn-YJpI
---------------------------------------------------------------------
http://cleargreen.com

Ivshti

  • Напреднали
  • *****
  • Публикации: 322
  • Distribution: Linvo 2010.3
  • Window Manager: Gnome
    • Профил
    • WWW
Уфф, за съжаление, работи. Под нормален акаунт прави Segfault, под руут крашва системата '<img'>
Сега ще го тествам на FreeBSD. Не разбирам много от такива I/O библиотеки и неща, тъй че не мога да преценя дали е Linux-only или се появява в други Unix-подобни системи.
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
FreeBSD може да се окаже по-нормална в това отношение и да ти откаже, ама знам ли и аз '<img'> Нямам грам идея там какво ще стане. Иначе доколкото имам идея и там има ring0/ring3, жалко, не са ги измислили да се възползват като хората от възможностите на архитектурата.

Ъъъ в оправдание на линукс, capability тъпотиите имали предвид iopl() следователно предполагам разните security frameworks там може и да го контролират. Нямам selinux вкъщи на десктопа да тествам, но може и с enforcing режима и дефолтското policy да те бие през ръцете, нямам идея.



Активен

"Knowledge is power" - France is Bacon

Ivshti

  • Напреднали
  • *****
  • Публикации: 322
  • Distribution: Linvo 2010.3
  • Window Manager: Gnome
    • Профил
    • WWW
FreeBSD се задържа, Segfault и под root и под нормален юзър '<img'>
Иначе някой с федора има ли да го тества (федора имаше selinux)?
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Брей, явно там деятелите на микроядрата не са успели да заразят системата с глупостите си за userspace драйвери'<img'>



Активен

"Knowledge is power" - France is Bacon

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Хах, имам един debian-ски image дето го гласих за следваща версия на хахорската игра, той със selinux, в enforced режим, там тия работи не стават, освен ако не ги набия да се изпълняват в някой инитскрипт (там е различен контекста де). Много, много забавно. Там има обаче и selinux policy src някакво и със сигурност съм пипал по него, така че не знам дали не се дължи на някоя моя намеса (което доста ме съмнява). Така че с някаква по-голяма вероятност мога да твърдя че selinux-ките дефолтски политики не позволяват такива глупости, стига да не са изтрщяни в permissive режим '<img'>
Активен

"Knowledge is power" - France is Bacon

Ivshti

  • Напреднали
  • *****
  • Публикации: 322
  • Distribution: Linvo 2010.3
  • Window Manager: Gnome
    • Профил
    • WWW
Микроядра? FreeBSD е с монолитно!
Иначе браво на SELinux ':p'



Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Ем то и линукс ядрото е монолитно, ама на ненормалници трудно може да се угоди '<img'>
Активен

"Knowledge is power" - France is Bacon

Ivshti

  • Напреднали
  • *****
  • Публикации: 322
  • Distribution: Linvo 2010.3
  • Window Manager: Gnome
    • Профил
    • WWW
Незнам какво всички нападате микроядрото '<img'>
Но всъщност монолитно е по-добро, спазват се kiss принципите.

Но предлагам да не спорим микроядро срещу монолотно ядро '<img'>
Активен

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
аз я привеждам в режим на безпомощност с
avidemux файл_8ГБ_НД_формат ....
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

spec1

  • Напреднали
  • *****
  • Публикации: 230
    • Профил
Там,където работя,търкаляме един OpenBSD сървър,
доколкото знам, там този номер с iopl(3) ... cli няма как да мине.
   Е ,не бих го пробвал  '<img'>
   Ако някой знае за  проблеми с OpenBSD ,да пише.
  Иначе gat3way е прав, в повечето случай Linux се крашва.
Активен

Mitaka

  • Гост
Вторник ще го тествам на SUN-a.
Просто не ми се пуска сега, поради простата причина, че не ми се ходи пак "на бургия" в офиса. А и си нямам идея дали ако забие ОС-а ще забие и ALOM-a, така, че няма да рискувам '<img'>
Активен