![]() |
|
Модераторы: feodorv |
![]()
|
|
| sena |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.11.2009 Репутация: нет Всего: нет |
У меня имеется клиент СУБД Postgresql на Windows, сервер на Red Hat. При обращении клиента с запросом select lpad('xxxxx',39842342929,'yyyyyyyyyyyyyyy'); происходит переполнение буфера и жёсткое зависание сервера.
Мне необходимо реализовать защиту от этой атаки. Я вижу выход в перехвате на стороне сервера системной функции recv(sock,char*buf,sizebuff,flags) которая содержит указатель на буфер данных *buf. Но так как функция recv это то же что и функция sys_socketcall(int call, unsigned long __user *args) , где call=10, а args является указателем на параметры recv: sock=args[0]; buf=&args[1]; и т.д. Начинаю перебором искать сочетание 'select lpad' но ничего не находит. Подскажите пожалуйста как можно найти это сочетание или вообще другие альтернативные пути решения |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
например, в recv лежат закодированные данные, поэтому нужный шаблон не находится
попробуйте протрассировать серверный процесс через strace -s 4096 (или больше) если select есть в "чистом" виде, он будет виден в логе -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| sena |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.11.2009 Репутация: нет Всего: нет |
трассировка выдаёт:
strace -p 1370 recv(10,"Q\0\0\0\35....select lpad(\'x\',5\,'y\');\0",8192,0)=29 и если посчитать все символы без слешей, то получается ровно 29 байт. Я даже не могу сделать вывод этого буфера символов в файл или на экран, использую для перехвата функций подгружаемые модули ядра LKM код такой:
и в итоге пишет что функции open write close не определены, хотя если написать отдельную программку:
то всё прекрасно выводится в файл Это сообщение отредактировал(а) Олег2005 - 10.5.2011, 00:22 |
||||
|
|||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
sena,
в check_buffer() вставляете проверку строки на нужный шаблон компилируете это все в .so файл и загружаете вместе с серверной программой через LD_PRELOAD -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| sena |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.11.2009 Репутация: нет Всего: нет |
Не могли бы вы пояснить немного? Я понял что эти три функции возвращают -1, т.е. имитация ошибки чтения, в моём случае это функция recv, тут понятно.
1.Но какую функциональную нагрузку несёт init_wrappers(), __attribute__((constructor)), void init() можно ли это прокомментировать? 2.А также какие библиотеки подключить чтобы были определены ssize_t, error, EPERM, dlsym, fprintf. 3.Как можно вставить проверку на шаблон в check_buffer(buf, len), если len - это длина? 4.Как загрузить my_file.so с программой, если программа запускается так: service postgresql start? 5. Я как понимаю это способ перехвата, не имеющий отношения к LKM? если да, то где можно об этом почитать? |
|||
|
||||
| MAKCim |
|
||||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
init_wrappers() получение адресов оригинальных функций init() вызывается при загрузке .so файла (атрибут constructor), чтобы вызвать init_wrappers()
sys/types.h sys/socket.h errno.h dlfcn.h stdio.h
точно так же, как и в LKM
посмотреть, какой бинарник вызывается из /etc/init.d/postgresql заменить его на скрипт с тем же именем, откуда вызывать оригинальную программу с LD_PRELOAD
не в курсе ;) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||||
|
|||||||||||||
| sena |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.11.2009 Репутация: нет Всего: нет |
при компиляции данного кода ( командой gcc -fPIC -c -Wall dll.c ) у меня ошибка:
dll.c: In function 'init_wrappers' : dll.c:91 'RTLD_NEXT' undeclared (first use in this function) dll.c:91 (Each undeclared identifier is reported only once dll.c:91 for each function it appears in.)
вроде необходимая библиотека подключена, почему он не видит RTLD_NEXT |
|||
|
||||
| sena |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 27.11.2009 Репутация: нет Всего: нет |
с ошибкой сам разобрался, откомпилировал вот этот код:
#gcc -fPIC -c dll.c #gcc -shared -o dll.so dll.o запускаю сервис командой: LD_PRELOAD=/root/dll.so exec /etc/init.d/postgresql после этого вылезает ошибка: id: symbol lookup error: /root/dll.so: undefined symbol: dlsym |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |