Перейти к содержанию

Прослушивание всех сетевых интерфейсов через локальный сокет (0.0.0.0)

Критичность: ВЫСОКИЙ
Способ обнаружения: DAST, NETWORKING

Описание

Приложение создаёт слушающий сокет (java.net.ServerSocket) и привязывает его к адресу 0.0.0.0 (или эквиваленту :: для IPv6) вместо loopback-адреса 127.0.0.1. Привязка к 0.0.0.0 означает, что сокет слушает все сетевые интерфейсы устройства и доступен не только самому приложению, но и другим процессам на устройстве, а также любым узлам в той же сети (Wi-Fi, сотовая сеть).

Пример небезопасного кода:

ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress("0.0.0.0", 8080)); // доступен из внешней сети

Безопасный вариант — привязка только к loopback:

ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress(InetAddress.getLoopbackAddress(), 8080));

Проблема

  1. Доступ из локальной сети. Любой узел в той же подсети может подключиться к открытому порту. Если на нём работает встроенный сервер или отладочный интерфейс, это открывает несанкционированный доступ к функциональности и данным приложения.
  2. Межприложенческий доступ на устройстве. Другие (в том числе вредоносные) приложения могут подключиться к сокету и взаимодействовать с сервисом в обход проверок.
  3. Отсутствие аутентификации. Сервис, рассчитанный на «локальное доверенное окружение», обычно не проверяет вызывающую сторону — при привязке к 0.0.0.0 это приводит к удалённой утечке данных и выполнению привилегированных операций.
  4. Удалённая эксплуатация уязвимостей. Любые дефекты слушающего сервиса (инъекции, переполнения, обход логики) становятся эксплуатируемыми по сети.

Рекомендации

  1. Привязывайтесь только к loopback-интерфейсу (127.0.0.1 / InetAddress.getLoopbackAddress()). Не используйте 0.0.0.0 без явной и обоснованной необходимости.

  2. Если внешний доступ действительно нужен — обязательно внедрите аутентификацию и авторизацию (взаимный TLS, токены), ограничьте источники подключений и шифруйте трафик.

  3. Используйте Unix domain sockets / LocalSocket вместо TCP для взаимодействия в пределах устройства.

  4. Проверяйте конфигурацию в CI. Не допускайте попадания привязки к 0.0.0.0 (часто остаётся от отладочных серверов) в production-сборки.

  5. Минимизируйте время жизни слушающего порта — открывайте его только на время выполнения задачи.

Ссылки

  1. https://developer.android.com/reference/java/net/ServerSocket
  2. https://developer.android.com/privacy-and-security/security-tips#networking
  3. https://mas.owasp.org/MASTG/0x05h-Testing-Platform-Interaction/
  4. https://cwe.mitre.org/data/definitions/200.html
  5. https://cwe.mitre.org/data/definitions/20.html
К началу