TCP стеганография или как скрыть передачу данных в интернете


Польские исследователи предложили новый способ сетевой стеганографии основанный на особенностях работы широко распространенного протокола транспортного уровня TCP.

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

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

В этом и состоит отличие этой науки от криптографии, которая пытается сделать недоступным для прочтения содержание сообщения.

Стоит отметить, что профессиональное сообщество криптографов достаточно презрительно относится к стеганографии в силу близости ее идеологии к принципу Security through obscurity (безопасность посредством неясности).

Этим принципом, к примеру, пользуются в компании Skype Inc. - исходный код популярной звонилки закрыт и никто толком не знает как именно осуществляется шифрование данных. Недавно, кстати, об этом сетовали в NSA, о чем известный специалист Брюс Шнайер написал у себя в блоге:
http://www.schneier.com/blog/archives/2009/02/nsa_wants_help.html

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

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

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

Тут мы вплотную подошли к Transmission Control Protocol (TCP). Объяснять все его детали, разумеетется, не имеет смысла - длинно, скучно, те кому надо и так знают. Вкратце же можно сказать, что TCP - это протокол транспортного уровня (т.е. работает над IP и под протоколами уровня приложений, к примеру HTTP, FTP или SMTP), который обеспечивает надежную доставку данных от отправителя к получателю.

Надежная доставка означает, что если какой-то пакет потерялся или пришел с изменениями, то TCP позаботится о том, чтобы переслать этот пакет. Отметим, что под изменениями в пакете тут подразумевается не умышленное искажение данных, а ошибки в передаче возникающие на физическом уровне. К примеру, пока пакет шел по медным проводам пару бит поменяли свое значение на противоположное или вообще затерялись среди шума (кстати для Ethernet значение Bit Error Rate обычно принимают равным порядка 10-8).

Потеря пакетов в пути также относительно частое явление в интернете. Происходить она может, к примеру, из-за загруженности маршрутизаторов, которая приводит к переполнения буферов и как следствие отбросу всех вновь прибывающих пакетов. Обычно доля потерянных пакетов составляет около 0.1%, а при значении в пару процентов TCP вообще перестает нормально работать - у пользователя все будет жутко тормозить.

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

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

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

Но как правило это практически невозможно, поэтому обычно ищут чем-то выделяющиеся пакеты и соединения, а предложенный метод как раз и делает ваше соединение ничем не примечательным. Да и никто не мешает вам зашифровать тайные данные на всякий случай. При этом само соединение может оставаться незашифрованным, чтобы вызывать меньше подозрений.

Авторы работы (http://arxiv.org/abs/0905.0363) на уровне симуляций показали, что предложенный метод работает как задумано. Возможно, в будущем кто-нибудь займется реализаций их идеи на практике. И тогда, будем надеяться, в интернете станет чуть меньше цензуры.

Обновлено: 11.03.2015