Сокеты: Android для Unity, возможна ли атака размещения? - PullRequest
1 голос
/ 20 мая 2019

У меня есть клиентское приложение на Android с использованием Java и сервер на моем ноутбуке в игре Unity.Оба находятся в одной сети, и я получил их для подключения.Когда я отправляю небольшое строковое сообщение от клиента к серверу, сервер блокирует его с таким предупреждением: ReadMessageBlocking: possible allocation attack with a header of 1298494342 bytes. Как мне даже начать приближаясь к этому блокпосту?

Для сервера яЯ использую библиотеку Unity Mirror , которая построена на основе Telepathy framework.Что касается клиента, я следовал за клиентской частью этого учебника .

Этот (из Telepathy) содержит соответствующий метод (ReadMessageBlocking), который выдает это предупреждение.Я попытался установить для MaxMessageSize значение int.MaxValue (что составляет 2 ГБ), чтобы хотя бы принять сообщение, чтобы я мог проверить его, напечатав его содержимое, но безрезультатно.

У меня нетпроблема с ReadMessageBlocking, это не зря.Меня беспокоит: почему в мире мой андроид якобы отправляет заголовок размером 1 ГБ со строкой?Что я могу с этим сделать?

Редактировать: Это соответствующая функция, которая отправляет сообщение от клиента (как указано в учебном руководстве, упомянутом ранее.)

void sendMessage(final String message) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (null != socket) {
                            PrintWriter out = new PrintWriter(new BufferedWriter(
                                    new OutputStreamWriter(socket.getOutputStream())),
                                    true);
                            out.println(message);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

    }

Для сервера (Unity) дляполучить, я ничего не писал.Предупреждение исходит от внутренней функции обработки сообщений Telepathy, которая, как мне кажется, ReceiveLoop здесь.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Я понял это. Телепатия (и, как следствие, Mirror) использует массив byte[] для передачи пакетов в обычном формате <size,message>. Это означает, что сначала необходимо указать размер (в байтах) сообщения, которое вы хотите отправить, в массиве, а затем байты фактического содержимого сообщения.

Поскольку я использую Java с другой стороны, DataOutputStream делает это немного проще:

DataOutputStream d_out = new DataOutputStream(socket.getOutputStream());
byte [] byte_message = message.getBytes();
d_out.writeInt(byte_message.length);
d_out.write(byte_message);

Так как я не использовал DataOutputStream ранее, Telepathy интерпретировал весь контент сообщения как size и плачет. Таким образом, полный рабочий код Send теперь выглядит так:

void sendMessage(final String message) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (null != socket) {
                            DataOutputStream d_out = new                             
                            DataOutputStream(socket.getOutputStream());
                            byte [] byte_message = message.getBytes();
                            d_out.writeInt(byte_message.length);
                            d_out.write(byte_message);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

    }
0 голосов
/ 20 мая 2019

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

Пусть заголовок будет подходящего размера

Я попытался установить для MaxMessageSize значение int.MaxValue

Слишком большой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...