Java. Каковы уязвимости программы прослушивания портов?

Недавно я создал довольно простой IRC-клиент и сервер на Java, но чтобы сделать его полностью функциональным, мне пришлось перенести его вперед. Мне пришло в голову, что, вероятно, были некоторые проблемы с безопасностью при открытии портов, поэтому я провел небольшое исследование. Везде я встречал людей, говорящих, что «самая большая уязвимость — это программа, прослушивающая порт».

Итак, мои вопросы:

  1. Что именно можно использовать в Java-программе, которая слушает порт и записывает входящие данные в строку?

  2. Как разработчик программного обеспечения могу предотвратить эти уязвимости?


person user1248420    schedule 05.03.2012    source источник
comment
+1 за желание избежать уязвимостей   -  person Jim Garrison    schedule 05.03.2012


Ответы (4)


Существует множество способов, которыми злоумышленник может воспользоваться известным открытым портом, начиная от использования ошибок в реализации TCP и вызывая отказ в обслуживании, заставляя ваш сервер выполнять дорогостоящие вычисления (вспомните недавний 2.2250738585072012e-308 ошибка?), что приводит к сбою вашей программы из-за переполнения буфера или даже выполнить произвольный код.

Безопасность платформы

В реализации TCP в некоторых операционных системах было несколько уязвимостей, в которых злоумышленник полагался на знание открытого порта на целевом хосте, например. атака SYN-флуда. Они были в значительной степени смягчены во всех основных операционных системах, но тот, кто отвечает за безопасность вашего хоста, должен постоянно следить за последними проблемами безопасности на платформе.

Безопасность сервера

Помимо уязвимостей в ОС и реализации TCP, существуют также потенциальные проблемы, связанные с самим сервером. Если ваш сервер может выполнять важные для безопасности операции в ответ на получаемые им запросы, злоумышленник может воспользоваться этим. К ним относятся чтение и запись файлов, выделение больших кусков памяти, отправка запросов к базам данных и т. д.

С точки зрения разработчика

Убедитесь, что ваш сервер может работать с низкими привилегиями и низкими ресурсами, что он проверяет все входные данные, полученные от пользователя, и экранирует все выходные данные, которые он отправляет в другие системы, и что он не выполняет никаких ненужных действий, связанных с безопасностью, — это первые шаги к тому, чтобы сделать его безопасный. Если вам нужно выполнять операции, связанные с безопасностью, вы можете инкапсулировать их в отдельный процесс и использовать IPC. Всестороннее тестирование вашей программы очень сложно, но также критично для ее безопасности.

С точки зрения администратора

Критические точки — убедиться, что последние обновления безопасности в ОС были применены, что ваш сервер действительно работает с самыми низкими возможными привилегиями и что он не может исчерпать критически важные системные ресурсы (например, ЦП, ОЗУ, открытые файловые дескрипторы, открытые TCP-соединения и т. д.) .

person Adam Zalcman    schedule 05.03.2012
comment
Лучший и самый полный ответ на высоте, но вы не получите правильный ответ / голосование, потому что у вас нет более 20 тысяч представителей ... ТАК на работе. - person m0skit0; 05.03.2012

Открытие порта, чтение входящих байтов и сохранение их в строке безопасно для Java. Просто будьте готовы получить незаконный или «вредоносный» контент. Тривиальный пример: приложение использует полученные байты для запросов к базе данных, а кто-то отправляет "код инъекции sql"...

Там больше риска с языком программирования, где возможно переполнение буфера. Затем можно можно использовать соединение для внедрения и выполнения машинного кода, если прослушивающее приложение уязвимо.

Предотвратить это довольно просто: проверьте ввод и удалите все недопустимые сообщения. Добавьте несколько тестов, отправляющих нелегальный контент, и проверьте, правильно ли отклоняются эти входные данные.

person Andreas Dolk    schedule 05.03.2012
comment
Открытие порта, чтение входящих байтов и сохранение их в строке безопасно для Java — это неправда. В самих ОС/сетевых драйверах может быть куча уязвимостей. Вы можете возразить, что это не Java, но вы должны пройти через это, так что это все равно влияет на вас. Вы можете иметь в виду, что в JVM нет известных уязвимостей, что также неверно (проверьте преобразование строки в двойное с ошибкой Java, которая может легко вызвать отказ сервера). - person m0skit0; 05.03.2012
comment
Да, конечно, это так, ... но вопрос был о том, что именно можно использовать в Java-программе и самая большая уязвимость — это программа, прослушивающая порт . - person Andreas Dolk; 05.03.2012
comment
Вы так и не упомянули о возможных уязвимостях JVM и библиотек Java, что имеет прямое отношение к вопросу. - person m0skit0; 05.03.2012
comment
Второй вопрос: Как разработчик программного обеспечения я могу предотвратить эти уязвимости? - вы ничего не можете сделать против этих проблем, кроме перехода на другую платформу/язык программирования. - person Andreas Dolk; 05.03.2012
comment
Вы правы, но как разработчик программного обеспечения вы также можете помочь исправить ошибки в программном обеспечении с открытым исходным кодом, которое вы используете в качестве базы, чтобы ваше программное обеспечение не страдало от тех же уязвимостей;) - person m0skit0; 05.03.2012

Уязвимости заключаются в несанкционированном использовании вашей программы. Теоретически "плохой парень" может выполнить обратный инжиниринг вашего проводного протокола, понять, как работает ваша программа, и заставить ее делать "плохие" вещи. Например, если ваша программа может удалять файлы на диске, когда она получает команду удаления, злоумышленник может отправить эту команду с параметром /, поэтому программа удалит все файлы с диска.

Вы можете представить себе другие сценарии.

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

Чтобы предотвратить такой сценарий, вы должны хорошо спроектировать свой протокол, использовать механизм аутентификации и (возможно) шифрование проводного протокола.

person AlexR    schedule 05.03.2012

Еще одна группа атак — DOS-атаки. Это не относится к java, но java IMO не защищает вас от: - Злоумышленник может отправить огромный/бесконечный ввод, чтобы привести к сбою вашего приложения. - Злоумышленник может медленно отправлять ввод, чтобы потреблять ваши ресурсы.

person Alpedar    schedule 05.03.2012