День добрый. Сегодня я расскажу вам об одном виде паранойи, связанном с последними тенденциями в сфере защиты государством населения от информации, и методе его лечения.

image

Мир цензуры


Дело в том, что в последнее время началось активное распространение роскомнадзоров, СОРМов, золотых щитов, корневых сертификатов, черных фургонов ФБР и прочих методов прослушки/ограничения/подмены трафика во всеми любимой сети Интернет.

На фоне этого, у многих началась болезнь, прекрасно описываемая фразой «у стен есть уши». И было бы это без повода — но все ваши данные идут через маршруты, вам неизвестные, через черные коробки, вам не принадлежащие, сервера, вами не контролируемые, а скоро это все будет еще и сохраняться. Ну как тут не занервничать?

Говорят, шифрование всех спасет. Но так ли это? Опуская проблемы классической и современной криптографии, так или иначе, шифрованный трафик всегда можно относительно просто обнаружить и банально прикрыть канал передачи. И тут на помощь приходит стеганография.

Чтобы проникнуться и понять, зачем оно нам, посмотрим на классическую схему передачи трафика от Алисы к Бобу в интернете:


Учтем, что интернет и каналы связи в нем нам неподконтрольны и уязвимы by design. Более того, между Алисой и Бобом есть некто, контролирующие среду передачи и ограничивающие (прослушивающие/вставьте свое слово) их обмен сообщениями.

На самом деле, передача через данных через интернет все больше напоминает проблему заключенных.

А схема выглядит так:


Где Вилли — не садовник, как кажется на первый взгляд, а охранник, ограничивающий передачу любых сообщений к Бобу. Алиса же — свободный человек (или заключенный в другой камере), с которым Боб хочет общаться в обход охранника.

Соответственно, задача стеганографии в том, чтобы охранник просто не замечал обмена сообщениями. А кто именно является охранником — ркн или фургончик фбр — частные случаи.

А при чем здесь прокси?


  • Боб — это ПО на контролируемом устройстве, через которое очень хочется свободного обмена информацией, вне зависимости от его положения в мире.
  • Вилли — это злые провайдеры, регулирующие органы, корпоративные прокси-сервера и прочие, желающие этому обмену помешать.
  • Алиса — это шлюз, через который мы получаем информацию из внешнего (или другого внутреннего) мира.

В зависимости от ситуации, между Алисой и Бобом может быть как контролируемый Вилли канал связи, так его (канала) может и не быть в принципе. Правды ради, стоит отметить, что мало кто полностью обрезает каналы связи, и даже за великим файероволом можно при желании посидеть в фейсбуке. Так что этот случай будет первый и простой вариант.

Стеганографический канал тогда будет создаваться просто поверх заранее известного канала, подконтрольного Вилли. Рассмотрим в качестве примера реализацию с использованием обычных сокетов.

Стегоканал создается подключением Боба к Алисе через сокет на установленном заранее порту.


Получившаяся схема отличается простотой и надежностью. Но, это не совсем стеганография. Для Вилли вполне очевидно, что обмен картинками на нестандартных портах — неспроста. Частично можно снизить уровень подозрительности, используя стандартные порты и протоколы. Например, обмен файлами через FTP. В целом, один из самых быстрых и удобных вариантов. Можно пользоваться, пока градус неадеквата и подозрительности со стороны Вилли не очень высок.

А теперь представим, что Вилли запретил обмениваться Бобу сообщениями с Алисой. Вообще.


Тогда для создания стеганографического туннеля (канала без прямой связи) необходим ресурс с общим доступом. Классическим примером являются социальные сети — доступные из большинства точек мира, публичные. Идеальный вариант для обмена стеганограммами, не совсем подходит для прокси ввиду необходимости большого потока информации. Однако, секъюрность требует жертв. В данном случае, жертвой падет скорость, но об этом чуть позже. Рассмотрим реализацию с использованием ВК в качестве общедоступной среды обмена:


Эта схема полагается на сторонний сервис, а значит, полностью зависит от него. С другой стороны, обмен картинками между пользователями не вызывает никаких подозрений, даже с высокой частотой (боты, по большей части, легальны). Из минусов получаем пониженную пропускную способность и возможность оказаться без линии связи в нужный момент — если обычно запасной канал является опциональным, то тут это обязательное условие работы.

А теперь о самой реализации и том, что вышло


Боб реализован в виде обычного прокси-ретранслятора типа [Socket-Stegochanel], слушающего определенный порт. Все данные, поступающие на него, он прячет в стегоконтейнеры с использованием заранее обговоренного алгоритма и посылает по стегоканалу Алисе. Все операции записи и извлечения проводятся с установленным заранее секретом (в стеганографии, в принципе, можно и без него, ограничений на реализацию нет).

Алиса типа [Stegochanel-Socket] принимает весь трафик от Боба по стегоканалу, извлекает его из стегоконтейнеров и перенаправляет на настоящий прокси сервер, который вы хотите использовать, выделяя для каждого экземпляра стегоканала отдельное подключение к прокси (чтобы не было путаницы). Ведь кто знает заранее, что за трафик и зачем понадобится пересылать, верно?

И как оно работает?


Для тестирования, в качестве прокси-сервера я арендовал дешевый ARM-сервер во франции, развернул на нем Ubuntu 16.10 и на ней Squid вместе с ретранслятором. Все замеры проводились из дома с интернетом на 5 Мбит/с через ADSL национальнейшего русского провайдера. Если кто-то хочет проверить на нормальной скорости — в конце оставлю ссылки на GitHub.

В качестве proof of concept я реализовал стегоканал поверх сокетов. Если будет интерес — аналогичное тестирование проведу и для реализации с VK в качестве среды обмена. В качестве алгоритма — свой собственный вариант метода LSB с максимальной емкостью примерно в четверть байт от общего числа пикселей, работающий с изображениями без сжатия, о котором, возможно, напишу позже. В качестве контейнера сначала использовалось одно единственное изображение Че Гевары в png разрешением 518х587.

Результаты тестирования в качестве прокси в firefox без каких-либо плагинов и доп. настроек:

  • wikipedia.org — 1:13;
  • en.wikipedia.org — 2:01, после этого общение с сервером продолжается, но контент весь уже загружен;
  • google.com (.fr) — ~2м, подсказки не работают, поисковая выдача грузится по минуте;
  • duckduckgo.com — так и не загрузился в течение 10 минут;
  • txti.es — ~3с на страницу. И правда, fast web pages;
  • garfield.vexer.ru — 1:35. Реклама при этом не загрузилась (и адблок не нужен);
  • reddit.com — грузится очень долго (больше 10 минут), что-то загружает, но терпения у вас вряд ли хватит;
  • bing.com — 1:45 на полную загрузку. ~50 секунд на страницу поисковой выдачи;
  • jcgonzalez.com — не загрузился;
  • minergate.com — 4м;
  • vk.com — ~1м, изображения догружаются дольше, диалоги работают шустро;
  • linkedin.com — ~50c, но громадное изображение-фон будет грузиться еще долго;
  • weather.com — не загрузился;

Стоит заметить, что подобные скорости (очень скромные, особенно, если посмотреть на календарь) объясняются не только тем, что стеганография передает избыточное количество информации, но и накладными расходами на сам стеганографический алгоритм. А ожидать от ARM-сервера за 3 зеленых президента чего-то необычного в плане производительности было бы странно. Аренда болеее быстрого сервера дает сильное ускорение (раза в 2 на старом слабом х86 сервере).

Отключив изображения и медиа-элементы, включив адблок, скорость можно повысить. Переместившись таки методом на лет 10 (15?) назад, получаем соответствующую тому же времени скорость загрузки страниц. Но в целом, вывод остается тем же — такое стеганографическое прокси годится только для экстренных случаев.

Впечатления от такого интернета далеко не положительные. Возможно, с другими методами стеганографии, или просто оптимизируя мой, можно добиться больших результатов. Однако, пока что, получившийся Proof of Concept говорит лишь о том, что такое прокси годится только для экстренных случаев. Что, на самом деле, не особо удивительно. Или неожиданно. Большая часть проблем с задержками — тайминги при рукопожатии в ssl. Вот вам и повсеместное насаждение https.

Подумав, было решено заменить бедного статичного Че Гевару на случайные изображения с минимальной избыточностью. Ведь если передавать не в 16 раз больше информации, а в 4, то теоретически, получим приятный бонус к скорости. Благо, генераторов случайных изображений заданного размера в интернете полно.

Результаты при повторном тестировании:

  • wikipedia.org — 21с;
  • en.wikipedia.org — 21с;
  • google.com (.fr) — 23с до работоспособности, 45с до полной загрузки, 3с на выдачу;
  • duckduckgo.com — 45с до работоспособности, 55с до полной загрузки;
  • txti.es — мгновенно;
  • garfield.vexer.ru — 1:10 вместе с рекламой, последующие стрипы грузятся секунд по 10, так как все самое тяжелое уже в кеше;
  • reddit.com — 44с без контента, 1:20 с его превью;
  • bing.com — 13с полная загрузка, 5с на выдачу с картинками;
  • jcgonzalez.com — упал, но 404 выдает быстро;
  • minergate.com — 1м;
  • vk.com — 23c, страницы с сообщениями по секунд 10 и больше, в зависимости от содержимого;
  • linkedin.com — 40c;
  • weather.com — не загрузился;

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

> GitHub
Поделиться с друзьями
-->

Комментарии (42)


  1. rPman
    09.01.2017 12:40
    +4

    Есть замечание, картинки необходимо использовать исключительно уникальные, дабы не было возможности получить доказательство их 'не целевого' использования путем сравнения с оригиналом.
    Например видеотрансляция.


    1. unxed
      09.01.2017 12:44

      Или из google image search по запросам про котиков. Ну, например.


    1. unxed
      09.01.2017 12:48

      Ну, кстати, вот вопрос: насколько возможно достоверно идентифицировать стеганоконтейнер в отличие от, скажем, просто пережатой картинки?


      1. rPman
        09.01.2017 13:09
        +2

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

        Обнаружить сами скрытые данные в картинке — в общем случае, невозможно.


        1. Klukonin
          09.01.2017 14:47
          -2

          WAT?!

          Отсутствие возможности повторить рандомную картинку с использованием других рандомных картинок, предположительно, являющихся оригиналом, является ДОКАЗАТЕЛЬСТВОМ?!
          Да вы сбрендили, сударь.
          Попробуйте в нормальном суде втирать подобную дичь.
          Любой, даже самый неквалифицированный адвокат достаточно быстро проведет вам ликбез по основам права, заодно и по основам логики.


          1. rPman
            09.01.2017 18:03

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


            1. icoz
              10.01.2017 00:30
              +1

              вы при этом забываете, что Вилли видел какую картинку вы качали, а какую отправляли…


              1. Romiro_Orimor
                10.01.2017 08:16

                Делайте фото ковра.


                1. Labunsky
                  10.01.2017 08:17

                  В таких случаях обычно используют подобные ковры


                1. icoz
                  10.01.2017 08:30

                  А много раз пересланный ковёр тоже не внушает никаких подозрений


      1. vadimr
        09.01.2017 19:45
        +1

        Сам факт систематического размещения пережатых картинок вызывает подозрение, что не всё с ними так просто.


    1. Labunsky
      09.01.2017 14:17

      Какие контейнеры и как использовать — зависит от ситуации, алгоритмов и кучи других факторов.
      В общем случае да, стоит использовать только уникальные. Лично я использовал во время второго теста этот сайт (не реклама, просто первая ссылка из гугла)


      1. il--ya
        10.01.2017 14:38

        Несколько десятков раз обновил картинку 400x200, получил очень много повторов. Судя по всему, там около сотни картинок, которые выдаются рандомом. Одна из картинок — чёрный прямоугольник. Наверно, не лучший исходный материал для стеганографирования.


        1. Labunsky
          10.01.2017 14:56

          Да, сам заметил, когда брал выборку для комментария ниже. Исправим, заранее об этом не знал, что поделать


  1. skameykin22
    09.01.2017 14:17

    Да, это вариант.


  1. ton1
    09.01.2017 14:58
    +1

    А почему бы не прикидываться видеопотоком? А в нем белым шумом. Так и трафика можно больше завернуть. Т.е. для прослушивающего чтоб выглядело как трансляция с древнего аналогового телика не настроенного на канал. Обычный mpeg поток, до некоторого градуса ***комнадзора вполне должно работать.


    1. Labunsky
      09.01.2017 15:25

      И так можно, это все варианты реализации одной и той же схемы. Разве что проблемой будет повышенное требование к скорости кодирования скрываемой информации внутрь кадров, но это решаемо


    1. DrZlodberg
      09.01.2017 17:58

      Кодеки «с потерями» очень не любят шум. Будет или огромный размер на выходе, или вся весь «шум» превратится в кашу.
      Не силён в теме, однако напрашивается вариант использовать не один, а два хитро собранных потока, чтобы низкие частоты в обоих при сдвиге добавляли сумме потоков высоких частот. Сходу, правда, оценить работоспособность идеи не в состоянии.


  1. redmanmale
    09.01.2017 16:55

    Txti.es. Так вот как выглядит предок телеграфа.


  1. gurux13
    09.01.2017 19:19

    Правильно ли я понимаю, что хочется сделать так, чтобы всякие MITMы не поняли, что идёт обмен сообщениями? Тогда как только они находят Ваш алгоритм, они запускают его на всех подряд картинках и смотрят, получается ли из них HTML. Тем более, что такой поток картинок сам по себе слегка подозрителен.
    Кажется, это заработает только если данные, которые стеганографией включаются в картинку, шифровать и делать неотличимыми от шума. Иначе, если будут отличия, методами ТРКА алгоритм шифрования и ключ получат.

    Ну и да, ещё можно закосить под существующий протокол с шифрованием. Кажется, что простой ssh на удалённый хост будет менее подозрителен. С проверкой серверного и клиентского сертификатов, конечно.


    1. Labunsky
      09.01.2017 19:38

      Тогда как только они находят Ваш алгоритм, они запускают его на всех подряд картинках и смотрят, получается ли из них HTML.
      Проблема в том, что помимо моего алгоритма, есть сотни других. Более того, придется брутфорсить ключ (тот, что реализован в контексте статьи имеет симметричный ключ).
      Уже это требует слишком больших мощностей, чтобы одновременно проверять весь проходящий траффик. А шифрование скрываемой информации — почти стандарт де-факто, обязательно добавлю со следующим пушем

      Тем более, что такой поток картинок сам по себе слегка подозрителен.
      На это я и сам указываю в статье:
      Но, это не совсем стеганография. Для Вилли вполне очевидно, что обмен картинками на нестандартных портах — неспроста.

      Пока что все это работает исключительно в виде Proof of Concept того, что такое прокси в принципе можно написать и оно будет комфортно работать. Понятное дело, что многое еще стоит доработать, но об этом я уже буду писать в будующих статьях :)


      1. gurux13
        09.01.2017 19:58
        +2

        Раздавать каждому свой алгоритм — это security through obscurity. То есть, надо упирать на неотличимость сообщений от шума. Поток картинок в одно и то же место в любом случае отличим от шума. Не так много народу постоянно спамит картинками.
        Да, и ещё — если бы я был всесильным MITMом и знал хоть что-то про картиночную стеганографию, я бы во все картинки добавлял свой шум.

        ИМХО, реальный способ маскировать трафик — это делать его очень похожим на трафик живого человека или какой-нибудь автоматики. Например, шуметь в IP-камерном видео. Куча камер же наружу трафик выдаёт. Или, скажем, под вирусню косить. Или ещё что-то, главное, чтобы не было нетрадиционного трафика, даже если он со всех сторон законный.


        1. Labunsky
          09.01.2017 20:14

          Раздавать каждому свой алгоритм — это security through obscurity.
          Никто не спорит, но при реалистичной оценке стоит учитывать и этот очевидный фактор. Я не ставлю его во главу угла, но считаю, что и игнорировать не стоит

          Да, и ещё — если бы я был всесильным MITMом и знал хоть что-то про картиночную стеганографию, я бы во все картинки добавлял свой шум.
          Не картинками едиными, они были выбраны для примера только потому, что под рукой был готовый алгоритм с ними в основе. Но да, против нынешней реализации (но не против всех, есть алгоритмы, устойчивые к шуму) это сработает

          Со всем остальным полностью согласен, разве что нет смысла маскироваться под трафик живого человека — там скорости будут явно не для проксирования трафика


        1. il--ya
          10.01.2017 14:44

          Очень хорошее возражение — про то, что MITM может слегка «портить» данные. Причём и предлагаемое вами видео тоже можно «портить». Но это уже при очень большом градусе.


          1. Labunsky
            10.01.2017 15:08

            Задача порчи данных «на лету» не самая простая. Особенно это касается классической текстовой стеганографии — «портить» текстовые сообщения, передающиеся в какую-нибудь социальную сеть — это уже нечто запредельное


          1. vadimr
            11.01.2017 00:15

            Насколько я понимаю, сотовые операторы уже сейчас автоматически детектируют и пережимают передающееся через них видео.


            1. rPman
              11.01.2017 11:58

              как!?


              1. vadimr
                11.01.2017 12:05

                Ну как? Видят, что абонент обращается за видеопотоком, и вклиниваются посередине. Пока что, как я понимаю, это происходит только в случае без шифрования соединения.


                1. rPman
                  11.01.2017 19:12

                  даже не знаю как спросить
                  ладно забудем про как (отдельный разговор сколько это будет стоить при пересчете на ОДНОГО клиента, мои скромные прикидки говорят что на порядок дороже выгоды с трафика)
                  давайте задам вопрос — зачем?


                  1. vadimr
                    11.01.2017 19:16

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


                  1. Labunsky
                    11.01.2017 19:33

                    мои скромные прикидки говорят что на порядок дороже выгоды с трафика
                    Так или иначе, система DPI есть сейчас почти у любого провайдера в том или ином виде -> окупается каким-то образом, что не особо весело
                    давайте задам вопрос — зачем?
                    Если исходящий — чтобы меньше трафика гнать на магистрали. Если входящий — снижать нагрузку на сеть (меньше трафика на устройство — лучше)

                    К сожалению, достоверно неизвестно (по крайней мере, мне), при передаче по каким протоколам мегафон делает такие пакости


  1. VT100
    09.01.2017 22:37

    Несколько лет назад видел статью о достаточно простой детекции стеганографии в картинках. Маскируя в 0 старшие биты цветов считают энтропию(?) оставшихся младших. По крайней мере, картинки до и после, сформированные только из младших бит, — отлично отличимы визуально.


    1. Labunsky
      10.01.2017 00:44

      Схожим образом работают библиотеки и программы вроде StegExpose. Такие методы довольно хорошо работают против простых алгоритмов. Но нельзя сказать, что они универсальны и работают в 100% случаев.

      Из интереса сейчас прогнал ею большую выборку стегоконтейнеров, полученных в результате работы прокси. В качестве подозрительных она пометила 133 из 439 стегоконтейнера при их размере 200х45 и embedding rate ~25%.

      Но дело в том, что я специально стремился уменьшить избыточность при передаче данных из-за медленной скорости в первом тесте. Для интереса, хардкорно заставил использовать прокси изображения 500х500 (цифра с неба). И все, программа больше не видит в получившихся стегоконтейнерах ничего подозрительного — 0/364.

      Более того, сразу вскрывается минус такого анализа — при увеличении размера стегоконтейнеров время обработки их анализатором возрастает нелинейно — я успел заварить чай, пока ноутбук переварил сотню стегоконтейнеров


  1. semen-pro
    10.01.2017 12:45

    Кстати, сейчас можно за 50 рублей в месяц безлимитно передавать трафик в вк, через мобильную сеть. Было бы оптимально для интернета вещей.


    1. Labunsky
      10.01.2017 12:45

      А подробностей можно? Не слышал об этом ранее


      1. semen-pro
        10.01.2017 13:16

        У красного оператора есть соответствующая услуга. Вк, фейсбук и одноклассники за 50 руб в месяц. Она входит в стоимость популярных пакетов, типа смарт (трафик не считается), но можно и отдельно подключить. В общих чертах, есть идея написать бота, и управлять устройством через вк. Ну или для каких других целей… Можно ребёнку на телефоне фаерволом всё, кроме вк вырубить...


        1. NickKolok
          10.01.2017 19:46

          … и пусть он напишет стеганобота?


  1. MrRitm
    11.01.2017 19:41

    Помнится где-то лет около 10 назад читал обсуждение возможности организации тотальной слежки за трафиком пользователей. Тогда как раз кто-то и сказал, что до такого маразма не доживем, а если уж вдруг доживем, то будем маскировать под битые файлы картинок свой трафик, передавать будем по псевдослучайным портам, с шифрованием и т.п. Tor тогда вроде только зарождался как и прочие VPN. Дожили…
    А на счет «ребенку вырубить и чтоб бота написал» — идея более чем здравая. Я вот своему (как подрастет) разрешу играть в любые игры на компьютере с Linux. К тому моменту как он запустит и в полной красе увидит современную игрушку, он уже будет специалистом :-)


    1. SunX
      12.01.2017 15:01

      При всем моем уважении, Вы ту же Убунту давно запускали? Steam давно пришел на Линукс и игрушки в нем теперь «просто работают» (Ну естественно те, что поддерживают Linux). Т.е. это не сделает ребенка специалистом ну совсем никак. Максимум — научит гуглить, где переключить опенсорсные дрова для видюхи на проприетарные.
      Или Вы планируете выдать ребенку гугл и LiveCD+stage3 от генты, а дальше уже пусть сам? :)


      1. MrRitm
        12.01.2017 15:10

        Вот именно! Про генту как-то не подумал, хотя идея интересная. В планах была OpenSuse + wine
        Что, реально стим и игры на линухах есть?! Не, ну вы что, серьезно?! Я вот как-то Quake 2 под вайном пускал. Не скажу, что это очень сложно. Но повозиться пришлось. Еще какой-то кризис для теста пускал. Сравнить линуховые проприетарные драйверы под Нвидиа с виндовыми. Дальше заставки правда не заходил. Свое субъективное мнение сложившееся после эксперимента оставлю при себе.
        Да-а-а… Дожили… Кругом слушают и подглядывают и игрушки под Linux! Реально не верится! Просто офигеть!


        1. SunX
          12.01.2017 18:26

          Честно говоря не совсем распознаю, стебетесь Вы или как-то умудрились пропустить много новостей о Steam'е, но: http://store.steampowered.com/search/?os=linux
          Если верить выдачЕ, то есть примерно 6267 игр под Linux. Wine, конечно, тоже никто не отменял, если нужна Windows-only игра (хотят тут уже могут быть, и скорее всего будут, особенности)
          А так же стим сделал свою приставку на базе StemOS (Читать: Линукса) и Steam.

          Не скажу за OpenSuse, но на Ubuntu, Debian и Gentoo все замечательно работает, ровно так же, как и в винде: Зашли в Стим, нажали установить, вжух и игра скачана и запускается.


          1. MrRitm
            12.01.2017 18:35
            +1

            Не, я честно не стебусь. Просто про стим последнее что помню — они какое-то отношение к первому халф-лайф имели. Тогда еще были компьютерные клубы и диал-ап модемы. Играть толком никогда не играл (после Doom2 как-то не особо интересовало). А вот запустить игру под Linux — это меня забавляло. Чтож… Надо будет как-то скрыть от подрастающего поколения, что есть нативные версии игр под Линукс. Я то хотел, чтобы он как подрастет сначала узнал бы, что такое ОС, библиотеки, драйвера и прочее. А потом глядишь и уже не надо будет ему игрушки. Консоль — лучшая игра на свете! Сюжет пишется по ходу, квесты всегда новые да еще и денег за решение дают! Последние лет 10 играю — пока не надоело ;-)