Практический способ реализации предотвращения IP-спуфинга
Я студент бакалавриата по информатике и надеялся получить некоторые знания о способах предотвращения подмены IP-адресов, но все ресурсы, которые я опробовал, развивают эту концепцию теоретическим путем. Я хочу попробовать свои силы в одном из методов, таких как:
http://en.wikipedia.org/wiki/Port_knocking
http://en.wikipedia.org/wiki/SYN_cookies
How do I simulate this whole situation in my own system were I myself am the attacker and I myself have to defend it? And once I have gained an understanding of it, then how do I start translating that into programming terms?
1 ответ
Первое, что вам нужно сделать, это понять, какие виды атак вы хотите защитить. Я не думаю, что что-то может дать вам лучшее понимание атак, чем написание кода для выполнения атак.
Я знаю три типа атак, связанных с подменой IP:
- Потребление ресурсов на сервере
- Отражение атаки
- Нападения на подотчетность
Я опишу каждый из них более подробно. Класс атак на потребление ресурсов означает, что сервер будет получать поток пакетов, большинство из которых имеют поддельные IP-адреса источника. Так как подделанные IP-адреса могут иметь любое распределение, выбранное злоумышленником, невозможно сказать поддельные пакеты из допустимых пакетов. Сервер имеет ресурсы только для обработки некоторого количества этих пакетов, чем больше пакетов отправляет злоумышленник, тем меньшая доля законных пакетов может быть обработана сервером.
Типичная атака в этом классе - это SYN-поток, который был новостью десятилетия назад. Ресурс, который он потребляет на сервере, в основном является памятью для поддержания состояния каждого TCP-соединения.
Файлы cookie SYN предназначены для защиты именно от этой атаки. Они берут понятие куки и втискивают его в рукопожатие TCP. Cookie - это короткое значение, которое сервер отправляет клиенту с единственной целью, чтобы клиент мог отправить его обратно на сервер. Это доказывает, что клиент получил cookie. Обычный сценарий подмены позволяет злоумышленнику отправлять пакеты только с поддельного IP-адреса, а не принимать пакеты, отправленные сервером на этот IP-адрес.
Файлы cookie SYN немного теряют функциональность в TCP. Это было следствием необходимости быть совместимым с существующими TCP-клиентами и в то же время не использовать память на сервере, пока клиентская задница не подтвердила IP-адрес, возвращая cookie.
Стук порта не выполняется в обеих упомянутых выше целях проектирования. Это совсем не прозрачно для клиента. Кроме того, требуется также сохранение состояния даже после того, как первый (стучащий) пакет был отправлен на сервер. Стук портов просто не предназначен для уменьшения подделки IP-адресов, он предназначен для совершенно другой цели. Если вам нужна эффективная защита от подделки IP-адресов и вам требуется обновление программного обеспечения на клиенте, есть гораздо более эффективные подходы.
Атаки на отражение направлены на использование пропускной способности сети, а не ресурсов на самом сервере. Такие атаки помещают IP-адрес жертвы в IP-адрес источника и любой подходящий сервер в IP-адрес назначения. Как только сервер получит запрос, он ответит поддельному источнику ответом, который может быть намного больше, чем запрос. Это позволяет злоумышленнику затопить жертву гораздо большим трафиком, чем он сам отправляет.
В этом классе атак могут использоваться несколько служб на основе UDP. DNS и NTP являются хорошо известными службами, которые при получении небольшого запроса могут отправить большой ответ.
Наиболее эффективный способ защиты от атак отражения состоит в том, что сервер никогда не отправляет более одного пакета в ответ на запрос с IP-адреса, который ранее не был подтвержден, и этот ответ не должен содержать больше байтов, чем запрос., TCP обычно считается невосприимчивым к атакам отражения, но службы на основе UDP могут быть уязвимы.
Третий класс атак - это те, в которых вы совершаете полную транзакцию на сервере, используя один поддельный IP на протяжении всего сеанса связи. Все журналы на сервере будут указывать, что эта транзакция была выполнена подделанным IP. Обычно это считается чисто теоретической атакой.
Обычно связь, где это действительно важно, осуществляется через TCP. Атакующий должен угадать 32-битный порядковый номер, чтобы даже установить соединение. Злоумышленнику также может понадобиться угадать размер каждого ответа от сервера. И если используется шифрование, злоумышленнику может даже понадобиться угадать часть содержимого. Более того, злоумышленник должен завершить транзакцию до того, как подделанный хост успеет отправить сообщение об ошибке на сервер, который закроет соединение.
Как проверить атаки
Устанавливая небольшую сеть компьютеров, нетрудно подделать IP-адрес любого хоста в Интернете и отправлять пакеты с этого IP-адреса на ваш собственный сервер. В то же время вы можете организовать, чтобы таблица маршрутизации направляла ответы тем, кто направляется в Интернет. С этой настройкой у вас есть реалистичная сеть для тестирования IP-спуфинга. Не забудьте только подделывать IP-адреса, которые не разрешено объявлять через BGP, чтобы у вас не возникало проблем с кем-то с отраженными пакетами.
Когда у вас есть готовые настройки, достаточно обычного TCP или DNS-клиента для отправки поддельных пакетов на сервер. Реальное наводнение потребует немного больше усилий для настройки, но это не сложно.
Как защитить DNS от спуфинга
Прежде всего, если у вас есть DNS-сервер, вы можете обнаружить, что он используется в отражательной атаке. Атака с отражением вызовет ошибку ICMP после того, как сервер отправит ответ на поддельный IP.
Что вы можете сделать, чтобы смягчить атаку? Прежде всего, вы можете отслеживать проверенные IP-адреса клиентов и поддельные IP-адреса. Очевидно, что большинство IP-адресов будут в категории не знаю. Когда вы получаете ошибку ICMP в ответ на ответ DNS, IP-адрес помещается в категорию поддельных IP-адресов. Когда IP-адрес введен, должны быть введены в действие меры по снижению риска.
Чтобы смягчить атаку, DNS-сервер отправляет ответ, содержащий только запрос, но без реального ответа. Дополнительно должен быть установлен усеченный бит. Это скажет клиенту повторить запрос, используя TCP. Успешный запрос по TCP докажет, что это IP-адрес реального клиента, и переместит IP-адрес на набор проверенных IP-адресов.
Если набор известных поддельных IP-адресов станет больше, чем вы хотите отслеживать, вы просто перестанете отслеживать его и переключитесь на использование мер защиты даже на IP-адресах, где подмененное состояние неизвестно.
Как защитить все протоколы от подмены
Написание кода для каждой службы, работающей по протоколу UDP, не является правильным способом защиты от спуфинга. Должен существовать независимый от службы способ защиты от спуфинга.
Я не думаю, что вы можете сделать это полностью обратно совместимым способом. Но давайте предположим, что мы могли бы поместить что-то новое между уровнем IP и транспортным уровнем, которое помогло бы противодействовать спуфингу, и давайте предположим, что достаточно спуфинга проблемы для развертывания такой защиты, тогда как может выглядеть такая защита?
У меня есть идея, основанная на расширении заголовка IPv6 для достижения этой цели. Я разработал некоторые подробности несколько месяцев назад. Если вы решите реализовать его в стеке IPv6 с открытым исходным кодом, то я с удовольствием переведу свой черновик на английский.