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

Создание локального сетевого сокета

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

Описание

Приложение создаёт слушающий сетевой сокет (java.net.ServerSocket). Локальные сокеты используются для межпроцессного взаимодействия, отладки, встроенных HTTP-серверов и проксирования трафика. Stingray фиксирует факт создания такого сокета в рантайме как находку низкой критичности: сам по себе слушающий сокет не является уязвимостью, но требует проверки — что именно он принимает, есть ли аутентификация и к какому интерфейсу он привязан.

Пример наблюдаемого кода:

ServerSocket server = new ServerSocket(8080); // открыт слушающий порт
Socket client = server.accept();

Проблема

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

Если сокет привязан к 0.0.0.0 (всем интерфейсам), риск существенно выше — см. дефект «Прослушивание всех сетевых интерфейсов через локальный сокет (0.0.0.0)».

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

  1. Привязывайтесь только к loopback (127.0.0.1 / InetAddress.getLoopbackAddress()), если сокет нужен исключительно самому приложению:

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

  2. Внедряйте аутентификацию для любого слушающего сокета, даже локального: токены, проверка вызывающей стороны, одноразовые секреты.

  3. Предпочитайте Unix domain sockets / LocalSocket для взаимодействия в пределах устройства — они не доступны по сети.

  4. Минимизируйте время жизни сокета и закрывайте его сразу после использования.

  5. Исключайте отладочные серверы из release-сборок.

  6. Шифруйте передаваемые данные (TLS), если по сокету проходит чувствительная информация.

Ссылки

  1. https://developer.android.com/reference/java/net/ServerSocket
  2. https://developer.android.com/reference/android/net/LocalSocket
  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
К началу