Атаки и взлом IRC-сетей KZer-Za Xakep, номер #067, стр. 067-046-2 Крутые повороты Большая часть багов в ircd - ошибки работы с памятью, связанные с недоработками в коде: появление указателей на нераспределенные участки, выделение лишней памяти и т.д. При грамотном подходе взломщиков это может вызвать серьезные проблемы, в том числе падение всего процесса ircd. Представь себе, каково уронить десяток серверов с пятьюстами пользователей на каждом! Самый неприятный баг из ранних версий ircd (chimera) - так называемый pirch bug. Используя IRC-клиент pirch, можно было указать ник юзера, уже присутствовавшего на сервере, после чего pirch в диалоговом окошке вполне корректно просил ввести другое прозвище - ведь указанное занято. У пользователя было два варианта: ввести другой ник и начать общение, либо нажать кнопку Cancel и получить на сервере ник нулевой длины. Если клиент выбирал второе, то за ним оставался его уникальный ID, а ник не регистрировался ни в одной системной таблице. Он мог спокойно общаться на каналах, его невозможно было ни забанить, ни применить к нему команду kill. Когда подобный клиент покидал сервер, ircd падал в core из-за разрушения таблиц ников и двойного освобождения памяти. Ошибка крылась в модуле m_nick, который отвечал за регистрацию пользователя на сервере. Оператор на халяву Вторая неприятная ошибка, связанная с кривизной рук программистов, заключалась в том, что пользователь мог незаконно получать флаг +o (IRC-оператор), проставляя себе при помощи команды /mode флаг +R (зарегистрированный в сервисах пользователь). Задумывался этот флаг для будущих версий ircd chimera, чтобы сервисы могли ставить его, если пользователь аутентифицируется в NickServ командой identify. Но этот флаг, во-первых, можно проставить кому угодно вручную, а во-вторых: #define FLAG_OPER 0x20000 ... #define FLAG_REGNICK 0x20000 Любой пользователь теперь мог дать команду /mode nick +iwR и получить себе в довесок еще и флаг +o (IRC-оператор). Особых гадостей такой иркоп сделать не мог, потому что имел всего лишь один бит в структуре сервера, прикрепленной к его текущему соединению. Но в итоге суммарное количество IRC-операторов в сети могло равняться количеству пользователей :). Кроме того, в сети достаточно было иметь хотя бы один уязвимый сервер, на котором вместе с +R выдавался бы +o. Всю остальную работу по разнесению подобной заразы вполне законно брали на себя хабы :). Еще одна ошибка приводила к полному падению сервера. Заключалась она в использовании команды knock, которая позволяла пользователю постучаться в канал, на котором стоит режим +i ("только по приглашению"). Даже когда в конфиге ircd стояло ключевое слово "use_knock = no;", модуль команды knock, тем не менее, грузился, если вместо названия канала взломщик указывал ник другого пользователя. Таким образом, безобидная команда /knock nickname валила сервер наповал. |