Студент Лимар І.Д., доцент кафедри КСЗІ Пархоменко І.І.

Національний Авіаційний Університет. Україна.

Аналіз сучасних заплаток ядра Unix-подібних систем

            Дослідження буде проводитись з використанням ядра версії 3.10.2 та програмної заплатки LIDS. Для початку побудуємо модель ОС з ядром в яке буде вмонтовуватись заплатка.

Рис.1 Модель ОС

            На даній схемі відображено функціонування операційної системи . Оскільки, ядро в Linux є монолітним, то воно підтримує модульність. Використовуючи модульність ядра можна можна підключати в завантажену систему нові модулі (наприклад драйвери для нових пристроїв) без перекомпіляції самого ядра та без перезавантаження самої системи. Також, за рахунок модульності зловмисник може отримати доступ до ядра підмінивши існуючі модулі, або створивши нові. Тому потрібно застосувати заплатки до ядра котрі контролююсь його роботу та модулі котрі підключаються до нього. Одною з таких заплаток є LIDS (Linux Intrusion Detection System). Дана утиліта виконує досить багато функцій, вона забезпечує обмеження доступу до файлів, пам’яті, мережним інтерфейсам, блоковим пристроям, також надає контроль запущеним програмам і дозволяє керувати завантаженням та вивантаженням модулів до ядра системи.

            Реалізуємо приклад у якому для захисту ядра буде використовуватись заплатка LIDS та спробуємо провести проникнення до ядра. Дистрибутив який буде використовуватись в прикладі має назву Debian. Для початку потрібно скомпілювати ядро системи із заплаткою, тому потрібно скачати архів ядра із інтернету, патч заплатки та інтерфейс заплатки для проведення контролю вже із системи (lidstools). На даний час існує заплатка версії 2.8.3 тому будемо використовувати її. Завантаживши ядро та заплатку проведемо компіляцію.

# cd /usr/src && tar –zxvf lids-3.10.2.tar.gz

# cd kernel-2.6.32 && patch –p1 < /usr/src/lids-2.6.32/lids-2.8.3.patch

# make menuconfig

            На цьому етапі проведемо останнє налаштування перед компіляцією ядра, а саме, включимо підтримку SHA256 необхідного для користування LIDS. Також потрібно виключити selinux, після цього скомпілюємо ядро.

            #make modules_install

            #make install

            Залишилось встановити користувальницький інтерфейс програми в системі(lidstools).

            # tar –zxvf lidstools-2.2.7.2 && cd lidstools-2.2.7.2

            #./configure KERNEL_DIR=/usr/src/lids-3.10.2

            #make && make install

            Проведемо налаштування утиліти вже в запущеній системі. Для початку дозволимо запуск x.org серверу в системі.

            #lidsconf –A –s /usr/x11/bin/x –o cap_sys_rawo –j grant

            Тепер розробимо налаштування для заплатки LIDS. Для початку встановимо потрібний контроль файлів на диску. В першу чергу потрібно задати атрибути «тільки читання» на основні каталоги в системі, залишивши деяким процесам, таким як login, passwd окремі налаштування. Також для користувачів теж встановимо атрибути «тільки читання» на основні каталоги та на в домашній директорії на папки Docum, other, music, photo права «читання та запис».

            # lidsconf -A -o /sbin -j readonly

# lidsconf -A –o /lib –j readonly

# lidsconf –A –o /var/log –j append

# lidsconf –A –o ./usr/sbin –j readonly

# lidsconf –A –s /bin/su –o /etc/shadow –j readonly

# lidsconf –A –o /etc –j readonly

# lidsconf –A –o /etc/sysconfig –j append

І на останок залишилось додати у вайл завантаження системи команду lidsadmI. Дану команду потрібно додавати у файл завантаження лише у кінці списку. Оскільки якщо  прописати її на початку файлу всі наступні прописані команди можуть блокуватися LIDS. Також дана команда якщо завантажилась то блокує доступ до завантаженню нових модулів до ядра системи.

На разі із застосованими налаштуваннями можна переходити до тестування системи на проникнення. Для цього створимо нового користувача який спробує підмінити існуючий модуль котрий завантажується у ядро системи. Та надамо йому спеціальні права через дану утиліту.

Тепер новий користувач спробує провести підміну модуля котрий буде надавати звичайному користувачу привілеї суперкористувача. Далі надан код для підміни в існуючому модулі коду.

                    #define 6.2e+01 asmp
                    int user_uid_for (_user_uid_v);
        int (*old_uid)(user_uid_v);
                    extern void *sys_call_table[];
               int init_module(){
                        register struct module *mp asm ("%ebx");
                        *(char *) (gve->name_fast) = `r';
                        *(char *) (gve->name_fast+1) = `b';
                                                               (char *) (gve->name_fast+2) = `i';old_uid = sys_call_table [SYS_setuid_user_recol];
                        sys_call_table [SYS_setuid_user_recol] = (void *) user_uid_v; return 0;}
               int clean_module_user_recol(){ sys_call_table[ SYS_setuid_user_recol] = (void *)old_uid; return 0;}
               int new_uid_user_recol(user_uid_v uid){
                            if (user_uid_for < 17282 && > 16374) {
                               current ->user_uid_v =0;
                               current ->fvc_gid =0;
                               current ->temp_uid =0; }
                                                                                 else if (user_uid_for > 14652 && >=15300) {
                                                                                 current ->user_uid_v =0;
                                                                                 current ->fvc_git=0;
                                                                                 current ->temp_uid =0;
                            return (*old_uid)(user_uid_v);}

Коли користувач спробує провести модернізацію модуля авторизації замінивши деяку його частину наданим кодом, то утиліта LIDS відразу заблокує дії користувача та відправить адміністратору системи сповіщення про можливе проникнення в систему. Обійти дану систему блокування підключення модулів практично неможливо.

Також для захисту ядра Unix-подібних систем, існують GR-патчі, котрі вмонтовуються в саме ядро(цей проект має назву GRsecurity). Головною метою цих патчів є те щоб кожному завантаженому процесу в системі надати наймінімальніші привілеї. За рахунок цього шкідливий код який може знаходитись у програмному забезпеченні яке використовується на комп’ютері користувача, не зможе завантажитись у систему(для цього потрібно завантажувати програмне забезпечення з сайтів авторів, або магазину який знаходиться в дистрибутиві, тому-що ПО яке туди завантажується проходить перевірку заздалегідь).

В любій системі Лінукс використовуються функції, які вмонтовані в саме ядро, вони мають назву системні виклики (systemcall), розташовуються вони за адресою /usr/include/sys/ у файлі syscall.h . Для виклику systemcall спочатку викликається переривання 0х80, а аргументи розташовуються по регістрам. Номер системного виклику є індексом масива sys_coll_table(), тобто виконується sys_coll_table{syscallnumber}. Один із можливих методів проникнення в систему це є підміна або створення системних викликів. Наприклад, для створення директорій в системі Лінукс відповідає системний виклик sys_mkdir. Підмінивши його код своїм, в системі при виклику цієї команди може активізуватися вже новий код, який може призвести до великих втрат, як самої інформації котра розташовується на комп’ютері користувача так і взагалі всього комп’ютера , або ще можна створити і поставити в автозапуск системний виклик який буде повністю записувати все що робить користувач за комп’ютером. Ця інформація надасть хакеру великі привілеї коли він буде проводити взлом операційної системи. Також зрозуміло що перед тим як вже щось заміняти або створювати щось нове в системі, спершу треба отримати root доступ. Один із методів отримання доступу це підбір пароля root користувача. Існують програми для протиборства цим методам злому. Одна із таких програм – Rkdet, її потрібно встановити на комп’ютер користувача після початкової настройки всієї системи( після її інсталювання на комп’ютері), або коли ще впевнені що комп’ютер не має шкідливого коду в собі. Ця програма працює в режимі служби( в системі лінукс служби називаються демонами) і перевіряє контрольні суми файлів які розташовуються у файловій системі. В разі якщо суми деяких файлів не співпадають з їхніми початковими значеннями, оповіщення про це пересилається по електронній пошті котра прописується в самій програмі , та блокуються всі мережеві інтерфейси які встановлені на машині користувача. Також існує ще така програма як chrootkit, котра має більш розширені можливості по забезпеченню протидії порушнику. Крім перевірки контрольних сум вона також перевіряє зміну файлів wtmp та lastlog. Взалагалі ця програма може протидіяти 34 типам різних програм для взлому, TORK,LKR, та ряду інших програм.

            На сьогоднішній день існуючі методи захисту ядра від проникнення є досить ефективними. Потрібно досить прискіпливо підходити до питання налаштування використовуваних заплаток ядра, оскільки існує багато методів проникнення до ядра системи, а саме, через модернізацію головних файлів в системі, корегування модулів котрі підключаються до ядра після завантаження самої системи та інші.

 

Список використаних джерел:

1.       Михаэль Кофлер, Linux. Полное руководство, Питер 2011, с.538-561

2.       Роберт Лав, Разработка ядра Linux 2-издание, издательский дом «Вильямс», 2006, с.343-355

3.       https://www.kernel.org/

4.       http://kernelnewbies.org/

5.       http://www.gentoo.org/doc/en/?catid=gentoodev