Введение

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

Так например, до всех моих исследований и наблюдений, существовал лишь один общеизвестный вид анонимных сетей с теоретически доказуемой анонимностью – DC-сети, основанные на проблеме обедающих криптографов. К таким сетям относят, как пример, Herbivore и Dissent. После продолжительных исследований я обнаружил, что существует ещё несколько видов сетей с теоретически доказуемой анонимностью, которые работают иным образом, чем DC-сети, и каждая из которых обладает своими уникальными особенностями и характеристиками.

Теоретически доказуемая анонимность

Анонимными сетями с теоретически доказуемой анонимностью принято считать замкнутые (полностью прослушиваемые) системы, в которых становится невозможным осуществление любых пассивных атак (в том числе и при существовании глобального наблюдателя) направленных на деанонимизацию отправителя и получателя с минимальными условностями по количеству узлов неподчинённых сговору. Говоря иначе, с точки зрения пассивного атакующего, апостериорные знания (полученные вследствие наблюдений) должны оставаться равными априорным (до наблюдений), тем самым сохраняя равновероятность деанонимизации по N-ому множеству субъектов сети.

  1. Анонимные сети на базе очередей. О таковых сетях я рассказывал в большом количестве моих статей: тут, тут, тут и здесь. Наверное самой интересной их особенностью является простота реализации и примитивность доказательства, вследствие чего уже был реализован ряд программных решений с открытым исходным кодом. Т.к. о таковых сетях я рассказывал уже очень много, то мы их пропустим. Кому интересно, те могут ознакомиться, перейдя по вышеуказанным ссылкам.

  2. Анонимные сети на базе увеличения энтропии. О таковых сетях я рассказывал крайне мало. Была также на хабре у меня старая статья, в которой ошибочно таковые сети я относил к седьмой стадии анонимности. Плюс к этому, данную статью было очень сложно читать неподготовленному зрителю, потому что за основу повествования я брал не формальную логику, а диалектическую, вследствие чего большую долю внимания я уделял не самой концепции анонимизации, а её развитию и движению. Поэтому в определённой мере размывались границы повествования одной темы с другой. Именно об анонимных сетях на базе увеличения энтропии мы сегодня и поговорим.

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

Границы теоретически доказуемой анонимности

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

Не все анонимные сети на такое способны, например Tor, I2P, Mixminion и большинство других, менее популярных, не могут этим похвастаться. В основном они базируются на более слабой модели угроз, в которой присутствует принцип федеративности располагаемых узлов, и как следствие, происходит "размытие" глобального наблюдателя на несколько разрозненных локальных наблюдателей (чаще всего под таковыми предполагаются государства). Единственными широко известными (в плане научных исследований) анонимными сетями с теоретической доказуемостью являются сети на базе проблемы обедающих криптографов (DC-сети).

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

Пример активной атаки (запрос-ответ)

Предположим, что существует всего три узла в сети {A, B, C}. Мы являемся атакующим под точкой A. В нашем распоряжении есть идентификатор ID (допустим публичный ключ) одного из субъекта: либо B, либо C. Нашей целью становится связывание данного идентификатора с реальным сетевым адресом, тобишь целью становится узнать и связать реальный IP-шник узла с ID.

Если мы можем исполнять роль как глобального наблюдателя, так и внутреннего узла, в роли узла - A, то сама атака становится примитивной. Мы начинаем генерировать запрос к одному из узлов {B, C} по идентификатору ID. Т.к. архитектура сети построена по принципу "запрос-ответ", то на любой запрос будет сгенерирован свой ответ. Т.к. анонимная сеть является теоретически доказуемой, то просто проанализировав трафик сети мы ничего не получим, поэтому нам необходимо проделать некую активную манипуляцию, а именно - заблокировать на время одного участника: либо B, либо C от всей другой сети.

И так, мы блокируем участника B, отправляем сгенерированный запрос по идентификатору ID. Если спустя время мы получаем ответ, то получателем является узел C, и как следствие, мы связываем ID с IP адресом. Иначе, если мы не получаем ответ, то получателем является узел B (так как он был заблокирован), и также связываем его IP адрес с ранее известным ID. В итоге, мы деанонимизировали участника сети и если кто-то будет отправлять сообщения с данным ID, то мы уже будем знать кто конкретно сидит под данным идентификатором.

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

За безопасность приходится платить, а за ее отсутствие — расплачиваться.

(Уинстон Черчилль )

И раз мы говорим о теоретически доказуемой анонимности, то мы платим вдвойне, а именно производительностью и масштабируемостью. Какие бы мы сети с теоретически доказуемой анонимностью ни взяли, везде будут присутствовать одни и те же проблемы. Так например, сети с теоретически доказуемой анонимностью очень плохо масштабируются, они часто способны функционировать лишь в пределах малых групп пользователей, допустим 50-100 человек. Чем больше становится сеть, тем менее она становится "юзабельной". Плюс к этому, теоретически доказуемая анонимность несёт всегда какой-либо вид накладных расходов "сверх того", как например искусственные задержки в связи, большое количество спама или периоды генерации информации, из-за чего некоторые виды коммуникаций просто становятся недоступными — потоковая связь, стриминговые сервисы, видео-чаты и прочее.

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

Модель на базе увеличения энтропии

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

Когда я исследовал анонимность, то сети на базе увеличения энтропии были первыми сетями с теоретически доказуемой анонимностью, которые я смог открыть. И по наивной простоте души я начал реализовывать сеть на её основе. В итоге, в ней было настолько много условностей, что уже во всех этих реализованных дебрях найти ту самую теоретическую доказуемость со временем становилось почти нереально. И это даже не из-за "говнокода", а как раз из-за её теоретических особенностей. В последствии, как только была открыта новая сеть с теоретически доказуемой анонимностью (на базе очередей), я переписал код на неё, сократив его как минимум вдвое.

И так, давайте приступать. Предположим, что существует три субъекта {A, B, C} и существует глобальный наблюдатель, целью которого является определение отправителя и получателя в сети. Предположим также, что все субъекты данной системы не заинтересованы в деанонимизации друг друга (эта условность будет служить лишь упрощением, на практике она в полной мере не обязательна). Анонимизация здесь строится на итеративной схеме, иными словами, чем больше вы будете отправлять сообщений, тем лучше качество анонимности будет становиться.

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

Предположим, что мы являемся субъектом A, а получателем для нас будет являться субъект C. Мы знаем публичные ключи всех пользователей {B, C}. Шифрование происходит публичным ключом получателя. Предполагается, что никто не сможет расшифровать сообщение кроме узла обладающего приватным ключом. Чтобы отправить сообщение M, нам необходимо проделать одно из следующих действий с вероятностью 1/2:

  1. Зашифровать M открытым ключом пользователя C и отправить шифрованное сообщение EC(M) всем пользователям сети, то есть пользователям B и C.

    ИЛИ

  2. Зашифровать M дважды, сначала открытым ключом пользователя C, а затем открытым ключом пользователя B и отправить шифрованное сообщение EB(EC(M)) всем пользователям сети, то есть пользователям B и C.

Пример программного кода на языке Go для множественного шифрования.

import (
	"bytes"
)
func RoutePackage(sender *PrivateKey, receiver *PublicKey, data []byte, route []*PublicKey) *Package {
	var (
		rpack  = Encrypt(sender, receiver, data)
		psender  = GenerateKey(N)
	)
	for _, pub := range route {
		rpack = Encrypt(
			psender, 
			pub,
			bytes.Join(
				[][]byte{
					ROUTE_MODE,
					SerializePackage(rpack),
				},
				[]byte{},
			),
		)
	}
  return rpack
}

На первый взгляд кажется, что получилась какая-то ересь. Во-первых, глобальный наблюдатель априори знает, что пользователь A является отправителем информации M, потому как таковой является инициатором связи. Во-вторых, предполагается, что глобальный наблюдатель также знает внутренний механизм анонимизации трафика, а потому знает саму условность 1/2. Как следствие, если после отправленного сообщения последует сразу следующее и на этом моменте вся связь прервётся, то тот, кто переправит сообщение - является истинным получателем, сгенерировавшим ответ. Таким образом, на первый взгляд кажется, что эта схема обречена на провал.

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

Для лёгкости восприятия, мы теперь будем исходить из лица внешнего глобального наблюдателя. Я буду указывать (A -> B) как факт отправления, что A отправил B информацию. (ИЛИ) будет говорить о неопределённости со стороны наблюдателя.

Если мы далее продлим связь на плюс одну итерацию, то итоговая схема будет выглядить следующим образом:

  1. (A -> B ИЛИ A -> C) = запрос(1)
    [Внешний наблюдатель знает лишь факт отправления и то, кто отправил сообщение - A, но пока не знает кто является получателем]

  2. (B -> A ИЛИ C -> A) = ответ(1)
    [Внешний наблюдатель знает, что с вероятностью 1/2 пакет мог быть зашифрован лишь единожды и тогда B или C сразу отправит пользователю A ответ]

    ИЛИ

    (B -> C ИЛИ C -> B) = маршрутизация(1)
    [Внешний наблюдатель знает, что с вероятностью 1/2 пакет мог быть зашифрован дважды и тогда B или C будет являться маршрутизатором к C или B соответственно]

  3. (B -> A ИЛИ C -> A) = ответ(1)
    [Внешний наблюдатель знает, что с вероятностью 1/2 пакет мог быть зашифрован дважды и тогда B или C после этапа маршрутизации отправит пользователю A ответ]

    ИЛИ

    (B -> A ИЛИ B -> C ИЛИ C -> A ИЛИ C -> B) = запрос(2)
    [Внешний наблюдатель предполагает, что ответ мог быть уже выдан на этапе 2., а на этапе 3. мог быть сгенерирован совершенно новый запрос]

Всё, как только вступает в действие новая итерация, а конкретно новый запрос - увеличивается энтропия, как мера неопределённости, ровно на 1 бит. В то время как раньше, до второго запроса внешний наблюдатель мог со 100% вероятностью определить отправителя, то теперь вероятность определения отправителя составляет 50% (из B и C), как только начинается вторая итерация запросов.

При этом, новая итерация запроса рушит уверенность в получателе первой итерации, потому как происходит пересечение первой незавершённой итерации запрос-маршрутизация-ответ со второй итерацией запрос. Таким образом, энтропия, по-факту увеличивается "авансом" к отправителю, потому как сначала она увеличивается для получателя, а только потом переходит на отправителя. Иными словами, если мы уверены, что цепь событий продолжится, то на втором этапе для получателя будет повышена энтропия на 1 бит, и только потом, на следующем - третьем этапе, энтропия будет повышена для отправителя.

Таким образом, хоть при первой итерации мера неопределённости равнялась 0 бит, но как только достигается вторая итерация, неопределённость увеличивается на бит и как следствие, делит ранее 100%-ую вероятность вдвое. Вышеописанную схему можно представить ещё более лёгким образом, в виде перекрытия запросов и ответов:

  1. запрос(1)-ответ(1)-запрос(2)-ответ(2)

  2. запрос(1)-маршрутизация(1)-ответ(1)-запрос(2)

В таком случае, мы видим, что запрос(1)=запрос(1) в любом случае равны друг другу и как следствие вероятность определения истинности равна 100%. Далее, как только начинается противоречие между первым и вторым определением - зарождается неопределённость, но только "авансом", не окончательно. Таким образом, на этапе ответ(1)=маршрутизация(1) мы уже не знаем какая конкретно происходит операция со стороны получения ответа. Если идти далее, как только появляется запрос(2)=ответ(1), то мы уже не сможем со 100% вероятностью утверждать, что не происходит совершенно нового запроса.

Рисунок 1. Увеличение энтропии на единицу
Рисунок 1. Увеличение энтропии на единицу

Если таким же образом продолжать цепь событий, то энтропия будет каждый раз увеличиваться на единицу. Визуально это можно изобразить на Рисунке 1. В результате, глобальному наблюдателю остаётся лишь догадываться кто является отправителем и получателем, и с каждым разом вероятность определения старых запросов будет постепенно "растворяться" во множестве новых.

В вышеописанном примере, мы всегда делали предположение, что запрос(2) появляется исключительно последовательно, после запрос(1). На самом же деле, такому запросу(2) ничего не мешает появляться на любом другом этапе. Так например, даже если запрос(1) и запрос(2) появились одновременно, и как следствие, глобальный наблюдатель уже знает истинных отправителей информации (инициаторов), то это ничего не говорит о получателях этой самой информации. Наблюдателю будет всё также проблематично найти получателей за счёт "слияния" нескольких запросов, и как следствие - проблематично найти будущих отправителей. Удобно было показать, что запрос(2) способен влиять не только исходя из начала или середины связи, но и в самом неудобном случае - из её окончания.

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

Что делать, если цепь событий прекратится?

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

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

  1. Задержка T[0;N]. В такой концепции свойство задержки T[0;N] применяется для аккумулирования энтропии. Чем больше участников сети становится, тем больший прирост энтропии способен обеспечиваться в интервале T[0;N]. При отсутствии данного параметра вероятность нулевого прироста энтропии увеличивается прямо пропорционально уменьшению мощности спама (активности) сети. Таким образом, максимальный диапазон задержки N должен устанавливаться не меньше среднего времени генерации нового пакета в системе.

  2. Мощность спама |St| —  количество сгенерированных уникальных пакетов в системе за определённый период времени t совершённый разнородными (никак не связанными между собой общими целями и интересами) участниками сети. Из данного определения мощность спама не может превышать количество её участников ни в какой выбранный промежуток времени, потому как два и более сгенерированных пакета одним пользователем будут считаться за один, по причине однородности узла к самому себе. Уровень заспамленности становится в некой мере ключевым фактором безопасности, т.к. «размывает» связь между истинными субъектами посредством перемешивания множества объектов в сети.

Мощность спама |St|, где M – множество всех узлов в сети, Q – функция выборки списка подмножеств узлов, подчиняющихся одному лицу или группе лиц с общими интересами, P – период генерации пакета на базе выбранного узла, L = Q(M), G: {0,1}→{0,1} = x+1 (mod 2), F: N⋃{0}→{0,1}=⌈x/(1+x)⌉
Мощность спама |St|, где M – множество всех узлов в сети, Q – функция выборки списка подмножеств узлов, подчиняющихся одному лицу или группе лиц с общими интересами, P – период генерации пакета на базе выбранного узла, L = Q(M), G: {0,1}{0,1} = x+1 (mod 2), F: N⋃{0}{0,1}=⌈x/(1+x)⌉

Если t представлено как НОК (наименьшее общее кратное) от всех P(Lij) → НОК(P(L11), P(L12), ..., P(L21), P(L22), ..., P(Lnm)), то в заданный промежуток времени мощность спама обретает своё максимальное значение |St| = |L|. Примером может служить таблица вычисления мощности спама при L = [{A, B}, {C}, {D}]P(A) = 1, P(B) = 2, P(C) = 3, P(D) = 2, где НОК(P(A), P(B), P(C), P(D)) = 6.

 

t1

t2

t3

t4

t5

t6

A

+

+

+

+

+

+

B

-

+

-

+

-

+

C

-

-

+

-

-

+

D

-

+

-

+

-

+

 

|St| = 1

|St| = 2

|St| = 2

|St| = 2

|St| = 1

|St| = 3

Как обстоят дела с активными атакующими?

В примитивном виде, сеть на базе увеличения энтропии уязвима к активным атакующим. Например, если один из пользователей {A, B, C} является активным атакующим, допустим это будет узел A, а также он кооперирует с пассивным глобальным наблюдателем, то он может совершать атаку с целью сопоставления идентификатора ID с сетевым адресом IP для одного из {B, C} способом запроса-ответа. Узлу A достаточно отправить сообщение одному из узлов по ID, далее подождать ответ, передать структуру пакета пассивному наблюдателю, который укажет из какой точки впервые был создан такой пакет. Таким образом, ID будет сопоставлен с IP адресом, и как следствие один из субъектов {B, C} будет деанонимизирован.

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

Рисунок 2. Обобщённая схема передачи информации в анонимной сети на базе увеличения энтропии
Рисунок 2. Обобщённая схема передачи информации в анонимной сети на базе увеличения энтропии

При ранее анализируемых задержках и при вероятностной маршрутизации со стороны получателя мы становимся способными противостоять вышеописанной атаке. Как только будет получен запрос одним из субъектов B или C, запрос попадёт в этап ожидания T[0;N], после чего будет произведена либо маршрутизация, либо ответ. Задержка необходима по причине ответа без маршрутизации, потому как при самой задержке повысится мощность спама, и как следствие, повысится мера неопределённости. Более визуально это изображено на Рисунке 3.

Рисунок 3. Неопределённость выявления получателя при атаке сопоставления связей между сетевой и криптографической идентификациями на инициирующей стороне
Рисунок 3. Неопределённость выявления получателя при атаке сопоставления связей между сетевой и криптографической идентификациями на инициирующей стороне

Какие подводные камни?

Подводных камней здесь огромное количество.

  1. Во-первых, если будет существовать кооперация активных атакующий, как внутренних, так и внешних, то отключение узлов от сети и ping оставшихся может нарушать анонимность субъектов. Решением здесь может стать держание поточной связи с какими-либо ещё участниками сети, с условием, что если их отключат от сети, то связанные с ними узлы просто уйдут в deadlock и перестанут отвечать на какие-либо запросы. Решение не идеальное потому как существует второй пункт.

  2. Во-вторых, децентрализованные сети являются крайне динамичными структурами, узел может появляться на короткое время, может пропадать на продолжительное, может перемещаться, может менять IP и т.д. В таком случае, выстроить deadlock связь с другим пользователем будет проблематично.

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

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

Заключение

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

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


  1. MedicusAmicus
    24.06.2023 05:25
    +1

    Статья интересная, но вот с уровнем сложности вы излишне оптимистичны.


    1. Number571 Автор
      24.06.2023 05:25

      Да, думаю вы правы. Сложность изменил


  1. 16bc
    24.06.2023 05:25

    Многобуков. Просто ответь, от частотного анализа и других бигдата-приёмов защита уже есть, или можно ещё подремать?


    1. anonym0use
      24.06.2023 05:25

      Вроде как есть


  1. AndrChm
    24.06.2023 05:25

    Как отправитель А узнает, что воспользовался общедоступным ключом получателя C, а не некоторого злоумышленника X, который выдаёт себя за C? Вопрос простой. Хотелось бы получить столь же простой ответ. Короткий и ясный.


    1. Number571 Автор
      24.06.2023 05:25
      +1

      Краткий ответ - используя сторонние линии связи.

      В более общем ответе, инструкция от меня может быть уже такой:
      1. Предполагается, что у A и C есть своя пара открытый/закрытый ключ. Для A - это (PubA/PrivA), для C- это (PubC/PrivC),
      2. Пользователь C генерирует временную пару открытый/закрытый ключ - (PubT/PrivT),
      3. Пользователь C отправляет открытый ключ PubT на несколько централизованных сервисов прямо несвязанных между собой, допустим на 5 разных сервисов. Под несвязанностью понимается отсутствие общих директоров, инфраструктуры и прочего, допустим ВК и Mail.ru - будут считаться за связанные сервисы,
      4. Пользователь A получает открытые ключи PubT1, PubT2, PubT3, PubT4, PubT5 с централизованных сервисов соответственно 1, 2, 3, 4, 5,
      5. Пользователь A просматривает открытые ключи и сравнивает все ли они одинаковые,
      6. Если больше половины ключей расходится (допустим 3/2) - пользователи A и C выбирают совершенно новые 5 централизованных сервисов и начинают процедуру заново,
      7. Если меньше половины ключей расходится (допустим 4/1) - пользователи A и C выбирают под несогласованный публичный ключ новый сервис связи и повторяют процедуру конкретно с ним,
      8. В конечном итоге, пользователь A получит от C временный публичный ключ PubT.
      9. Далее пользователь A зашифровывает открытым ключом PubT свой открытый ключ PubA и отправит полученный результат также на эти 5 сервисов,
      CPubA = E(PubT, PubA);
      10. Пользователь C просматривает корректность получения CPubA. Если шифрованные ключи расходятся, то применяются процедуры 6/7 направленные на уже шифрованную версию ключей,
      11. При успешном получении шифрованного публичного ключа CPubA, пользователь C применяет временный закрытый ключ PrivT и расшифровывает CPubA, получая тем самым публичный ключ PubA,
      PubA = D(PrivT, CPubA);
      12. Далее, пользователь C подписывает свой публичный ключ PubC временным закрытым ключои PrivT, и шифрует результат ранее полученным публичным ключом PubA. Результат подписания и шифрования пользователь C отправляет пользователю A. Пользователь C может использовать любой сервис связи, т.к. в данном случае уже нельзя будет корректно подменить информацию за счёт необходимости нарушения подписи для PrivT,
      SPubC = S(PrivT, PubC);
      CSPubC = E(PubA, SPubC);
      13. Пользователь A принимает CSPubC, расшифровывает его своим публичным ключом PubA, получая тем самым SPubC. Далее пользователь A проверяет подпись, используя временный публичный ключ PubT, получая тем самым истинность публичного ключа PubC.

      Таким образом, пользователи A и C обменялись своими публичными ключами, воспользовавшись сторонними централизованными сервисами связи. При этом, в вышеописанном протоколе централизованные сервисы так и не узнали истинные публичные ключи, которые будут применяться в качестве дальнейших идентификаторов ID в анонимной сети, а потому и не смогут их использовать для связывания с сетевым адресом IP. У централизованных сервисов в полномочии остались только PubT, CPubA, CSPubC. Этапы 6/7 защищают от активных атак за счёт однотипных действий на несвязанных сервисах.

      В данном протоколе присутствуют следующие проблемы:
      1. Протокол является вероятностным. Существует вероятность, что централизованные сервисы смогут связаться и успешно подменять публичные ключи хотя бы для 4/1 сервисов, что будет достаточно, т.к. последний сервис будет считаться уже некорректным.
      2. Если A или C является злоумышленником, то он легко найдёт идентификатор ID своего абонента. При сотрудничестве с сервисами связи, он сможет легко узнать и IP абонента. Таким образом, легко свяжет полученный публичный ключ с сетевым адресом.
      3. Предполагается, что пользователи A и C уже друг друга идентифицируют на выбираемых ими централизованных сервисах. В противном случае, пользователи A и C не будут знать кому отправляют и от кого получают ключи.


  1. AndrChm
    24.06.2023 05:25

    Пользователь C отправляет открытый ключ PubT на несколько централизованных сервисов прямо несвязанных между собой…

    Так активный злоумышленник X перехватит этот ключ и пошлёт свой вместо него.

    Вы пишете очень длинно и, к сожалению, не предлагаете решения. А когда предлагаете что-то, то потом начинаете оправдываться, мол, всё плохо и не работает. Как к этому всему следует относиться? Это исследования такие?


    1. Number571 Автор
      24.06.2023 05:25

      Я предполагаю в качестве активного злоумышленника X конкретно сервисы связи, а не какого-то локального злоумышленника, который просто подключается к одному из узлов. С последним проблем вообще нет, потому что связь между клиентом и централизованными сервисами уже безопасна, исходя из существования центров сертификации.
      Далее, если мы отправляем нескольким несвязанным сервисам связи X1, X2, X3, ... один и тот же ключ PubT, то вероятность того, что все ключи или большая их часть будет подменена - стремится к нулю при увеличении количества участвующих сервисов.
      Перечитайте пожалуйста ещё раз всё, что я описал выше. Такое ощущение, что вы даже не хотите видеть написанное и цепляетесь вне контекста к любой непонравившейся вам фразе.


  1. riv9231
    24.06.2023 05:25

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

    1. что если искомый наблюдатель обладает не одним, а несколькими узлами сети с одинаковым публичным ключом (так можно делать в TOR, вероятно, и в I2P, но я не пробовал). Вроде как это даже использовали для распределения нагрузки и для защиты серверов от обнаружения.

    2. что если и получатель и источник выстраивают по нескольку разных маршрутов до «точек рандеву в терминологии TOR» (основная идея I2P) и при разрыве любого количества, кроме всех, связь сохраняется. Как их отключать тогда? (можно свет погасить в отдельно взятой стране, потом в городе и т. д. но предыдущий пункт!)

    3. Что если узлы обмениваются мусорным трафиком, скрывая таким образом факт передачи настоящего сообщения (есть точно в i2p)?

    4. Что если, маршруты могут вести к «мусорным узлам», которые периодически отправляют, принимают трафик и отвечают на ping? Просто ping‑ом не обойтись (это тоже в i2p).

    5. А более высокоуровневый «ping» в виде письма в котором заинтересован хозяин публичного ключа, может встретить противодействие в виде случайного времени ответа. Вы не будете знать получил ли хозяин ключа ваше сообщение, пока не пройдёт слишком много времени (кстати, freenet)

    Разве это всё, а в особенности пункт 1 не увеличивает драматически сложность обнаружения? Я имею в виду, что сложность не будет снижаться из-за атак. Вы же не знаете заранее сколько всего в сети таких узлов. Как я понял, все атаки сводятся к возможности отключить целого пользователя. Но на практике это не возможно, т.к. пользователь может поднять несколько одинаковых узлов.


    1. Number571 Автор
      24.06.2023 05:25

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

      Пункт 1

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

      Сначала проанализирую такое действие со стороны Tor и I2P.
      Если один пользователь обладает несколькими узлами в сети, то они также должны, в лучшем случае, располагаться географически удалённо друг от друга, чтобы нельзя было выявить человека по его расположению, методом уменьшения "радиуса" подконтрольных ему узлов. Но в таком случае, человек должен как-то удалённо связывать один узел с другим узлом для синхронизации хранимых данных. А это приведёт к тому, что такой способ автоматически создаст зависимые связи, которые статистически можно будет выявить глобальному наблюдателю. Допустим, какой-либо клиент отправит запрос узлу1, узел1 сохранит в БД1 действие от запроса, отправит ответ клиенту, а далее, для синхронизации, узел1 должен будет также отправить узлу2 сохранённый результат, для такого же сохранения в БД2. Либо для синхронизации может использоваться сервер, но сути дело это не меняет. Подобное действие может приводить к более пристальному анализу узла1 и узла2 (либо сервера), т.к. они связаны между собой не только клиентскими запросами, но и постоянной кооперацией между собой. Для подобного вида атаки достаточным является существование глобального наблюдателя и N-ое количество времени.

      Теперь проанилизируем такое действие со стороны описанной мной сети.
      В отличие от Tor и I2P у которых существует направленная маршрутизация (будь то луковая или чесночная), в описанной мной сети (назовём её далее EIN - entropy increase network) маршрутизация является заливочной (слепой). Последняя отличается отсутствием понимания где находится получатель, и отправленный пакет, можно сказать, сам ищет своего получателя блуждая по всей сети. В таком случае, если будут существовать два узла с одним и тем же публичным ключом, то оба этих узла будут генерировать ответ, потому как запрос дойдёт до каждого (в отличие от Tor и I2P, которые выберут только один узел). К чему это приведёт? Т.к. EIN является теоретически доказуемой сетью, то такое поведение никак не приведёт к деанонимизации субъектов со стороны пассивного глобального наблюдателя. Тем не менее, если злоумышленник является внутренним активным атакующим и самостоятельно способен отправлять запросы, то это даст ему дополнительную информацию о том, что существует целых два узла обладающих одним и тем же публичным ключом. Как следствие, это упростит деанонимизацию при условии, что существует кооперация внутреннего активного активного атакующего с активным глобальным наблюдателем, потому как упрощается задача блокировки участников с целью выявления кому принадлежит публичный ключ - если на очередной запрос злоумышленник получит уже не два, а только один ответ, то последний заблокированный пользователь будет относиться к проверяемому ключу.
      Таким образом, для сети EIN такое действие будет являться скорее негативным, чем позитивным, что нельзя однозначно сказать о Tor и I2P, потому как с одной стороны такое действие может приводить к неоднозначности используемого маршрута, но с другой стороны создаёт дополнительные связи между конечными узлами.

      Пункт 2

      что если и получатель и источник выстраивают по нескольку разных маршрутов до «точек рандеву в терминологии TOR» (основная идея I2P) и при разрыве любого количества, кроме всех, связь сохраняется. Как их отключать тогда? (можно свет погасить в отдельно взятой стране, потом в городе и т. д. но предыдущий пункт!)

      Если рассматривать данный случай со стороны Tor и I2P, то такой подход особо не улучшает качество анонимности при условии существования глобального наблюдателя, потому как для глобального наблюдателя остаются постоянными точки "взаимодействия", узлы, которые всегда остаются статичными и никогда не изменяются, сколько бы итераций изменения маршрутов не происходило. Таким образом, разрыв связи может происходить за счёт удаления одного из абонента, будь то отправителя или получателя. Такое возможно, когда сам же провайдер связи (или множество провайдеров связи) является активным глобальным наблюдателем. В таком случае, провайдер может просто запретить любые запросы-ответы направленные на или полученные от конкретного узла. Таким образом и может быть осуществлено отключение узла от сети. Существование нескольких узлов с одним и тем же публичным ключом усложняет однозначность блокирования, но тут нужно учитывать ещё несколько факторов: 1) глобальный наблюдатель может учитывать сколько раз один и тот же узел участвовал в маршрутизации. За счёт этого глобальный наблюдатель может разграничить узлы, которые применялись в маршрутах, и узлы которые являлись непосредственно абонентами за счёт неравных пропорций; 2) внутренний активный атакующий может учитывать разницу времени доставки пакета при большом количестве отправляемых данных на большом промежутке времени при очередном блокировании узла. Но такая атака наиболее эффективна, когда существует разделение между маршрутизирующими узлами и получателями, как в сети Tor.

      В EIN не существует маршрутов подобных Tor и I2P. В отличие от последних, в которых существует точно заданные маршруты, в EIN пакет пробегается по всем узлам от одного к другому, до тех пор пока не найдёт своего получателя, или пока не пробежит всю сеть и не будет ею забыт. В следствие этого, можно утверждать, что в EIN уже существует много разных маршрутов до точки назначения. Поэтому атаки, направленные на разрыв связей между узлами, в EIN не особо эффективны. Тем не менее, эффективны атаки направленные на отключение самих узлов от сети с целью их дальнейшей деанонимизации (посредством активным атак). Также, как было описано в пункте 1, существование нескольких узлов с одним публичным ключом не повысит анонимность, а скорее наоборот её понизит для EIN.

      Пункт 3 и Пункт 4

      Что если узлы обмениваются мусорным трафиком, скрывая таким образом факт передачи настоящего сообщения (есть точно в i2p)?

      Что если, маршруты могут вести к «мусорным узлам», которые периодически отправляют, принимают трафик и отвечают на ping? Просто ping‑ом не обойтись (это тоже в i2p).

      В таком случае качество анонимности действительно повысится. Но вопрос здесь скорее находится в плоскости - как этот мусорный трафик распределяется? От ответа на этот вопрос и будет зависеть на сколько качественней будет анонимность.

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

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

      Приведу также ещё один пример с мусорным трафиком. В моих статьях я очень часто рассказывал об анонимной сети на базе очередей (назовём её QBN - queue based network). Интересной её особенностью является то, что мусорный трафик генерируется исключительно в определённое время со всем истинным трафиком. Так например, если узел собирается что-то отправлять, то он генерирует запрос или ответ, в ином случае он генерирует ложный пакет. В отличие от I2P и EIN, в которых мусорный трафик накладывается в той или иной мере на истинный, в QBN мусорный трафик чередуется с истинным.

      Пункт 5

      А более высокоуровневый «ping» в виде письма в котором заинтересован хозяин публичного ключа, может встретить противодействие в виде случайного времени ответа. Вы не будете знать получил ли хозяин ключа ваше сообщение, пока не пройдёт слишком много времени (кстати, freenet)

      Это также может повысить уровень анонимности. Например, в EIN такой механизм применяется для успешности накапливания энтропии. Подход аккумулирования сообщений, применяемый в Mixminion сетях, также приводит к задержкам в соединениях. В QBN сами задержки являются основой функционирования сети. Но во всех этих случаях, задержки применяются с разной целью: 1) чтобы накопить энтропию для отправления сообщения, 2) чтобы накопить количество сообщения для дальнейшей маршрутизации, 3) чтобы не отклоняться от периода генераций сообщений.

      Поэтому да, задержки они часто помогают в анонимизации трафика, но часто идут в совокупности с чем-то. И конечно же естественным минусом таковых задержек является медленная передача данных.

      -----

      Вроде бы ответил на все вопросы. Сами ответы получились достаточно обширными. Если что-то непонятно или что-то нужно будет более детально пояснить, то можно продолжить здесь или в чате ВК, если будет проще.