Псевдоузел и предполагаемые векторы атак в сети

Псевдоузел обсуждается здесь, на Reddit /r/Bitcoin.

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

Это был эксперимент того, как легко можно «подделать» полные узлы. В заключение: очень легко.

Проверочная реализация концепции (и документация) доступна здесь:

https://github.com/basil00/Псевдоузел

В сети PseudoNode кажется обычным полным узлом. Он передает запросы, транзакции, блоки и т. д., как полный узел. На самом деле PseudoNode — это тип прокси-сервера p2p. Он просто пересылает любой запрос, который не может обработать (getdata, getheaders и т. д.), соседним узлам. Для получения дополнительной информации см. приведенные выше ссылки.

PseudoNode не использует диск (загрузка блокчейна не требуется), использует мало ЦП/ОЗУ и использует меньше сетевых ресурсов (пропускную способность), чем обычный полный узел. Псевдоузел может «синхронизироваться» с сетью в течение нескольких секунд.

PseudoNode демонстрирует некоторые проблемы с поощрительными полными узлами (включая «Программу поощрения битнодов»). Трудно доказать, что полный узел действительно является полным узлом.

Реализация в основном имеет ценность новизны/доказательства концепции. Оно не предназначено для использования в качестве «производственного» программного обеспечения.

И FAQ :

Вредит ли PseudoNode сети?

Краткий ответ: Нет.

Длинный ответ: нет, если количество псевдоузлов значительно превышает количество обычных полных узлов. В противном случае, если PseudoNode может подключиться хотя бы к нескольким хорошим узлам (по умолчанию 2), то PseudoNode будет действовать как обычный узел и будет способствовать пропускной способности сети.

Может ли PseudoNode вызвать разветвление сети?

Нет, PseudoNode просто следует тому, что делают другие узлы.

Может ли PseudoNode украсть монеты?

Нет.

Можно ли запретить псевдоузлы в сети?

Не легко. Запросы, которые PseudoNode не может обработать напрямую, всегда могут быть перенаправлены на другие (сотрудничающие) полные узлы.

Мне это кажется невероятно безрассудным с точки зрения векторов атаки. Очевидно, что баланс между плюсами и минусами требует оценки, и, поскольку его значение является «новизна» (самоописание разработчика), несколько минусов кажутся очевидными:

  1. Задержка эффективно увеличивает время загрузки блокчейна, так чтоnew latency = original latency * performance decrease %
  2. Гнусный псевдоузел может снизить задержку чуть выше порога узлов, применяющих черный список (т.е. throttled latency~> cutoff latency)
  3. Увеличенный процент гнусных узлов может выполнить атаку Сивиллы (?)

2 связанных вопроса:

  1. Какие другие векторы атак (в терминах высокого уровня) и их последствия можно ожидать от псевдоузлов?
  2. Есть ли в протоколе возможные непредвиденные обстоятельства для разграничения между PN и узлом? Например, будут ли разные версии Bitcoincore идентифицировать PN (или простую модификацию протокола)?
Когда вы спрашиваете о псевдоузлах, вы спрашиваете об этой конкретной части программного обеспечения или об общей идее модификации биткойн-клиента? Когда вы говорите, This seems incredibly reckless in terms of attack vectorsвы имеете в виду, что псевдоузлы будут уязвимы для атак, которых нет у биткойн-клиента, или что автор не предусмотрел все возможные атаки?
@NickODell Я формулирую это больше в свете выпуска открытого исходного кода, который в основном сводит на нет время разработки, которое обычно мешает гнусным сторонам заниматься этим. Я также должен уточнить, были ли в прошлом случаи псевдоузлов? Или это не новая тема?
@WizardOfOzzie Все «атаки» 1..3 возможны с обычными полными узлами.

Ответы (1)

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

Например, если имеется 101 псевдоузел (PN), соединенных вместе, вы можете отправить PN1 действительно выглядящий invпакет , объявляющий об одной поддельной транзакции (около 61 байта плюс служебные данные TCP-пакета). Каждый PN ретранслирует это invкак минимум на 6100 потерянных байтов загрузки.

Но эти PN также подключены к реальным узлам. Допустим, 500 реальных узлов, так что теперь потерянная пропускная способность загрузки PN составляет 36 600 байт (плюс накладные расходы TCP) — и все потому, что злоумышленник создал один 61-байтовый файл inv. Хуже того, настоящие узлы будут запрашивать транзакцию, используя 61-байтовый getdataпакет , что приведет к потере 30 500 байт пропускной способности загрузки реального узла.

Если злоумышленник отправляет 1 МБ поддельных данных в секунду в течение всего дня, он использует 86 гигабайт собственной пропускной способности, но теряет 52 терабайта совокупной пропускной способности загрузки PN и, возможно, 43 терабайта пропускной способности загрузки реального узла.

(В зависимости от того, как написаны PN, они могут тратить еще больше пропускной способности на ретрансляцию getdataпакета.)

Сравните это со стоимостью проведения атаки на один реальный узел. На каждый 61-байтовый invпакет, загружаемый злоумышленником, реальный узел отвечает, загружая один 61-байтовый файл getdata. Таким образом, атака с исчерпанием полосы пропускания против реального узла требует примерно 1:1 потерянной полосы пропускания. Реальный узел не ретранслирует дальше, invпока не получит и не подтвердит транзакцию, на которую он ссылается, поэтому никакой другой узел не теряет пропускную способность.

Есть ли в протоколе возможные непредвиденные обстоятельства для разграничения между PN и узлом? Например, будут ли разные версии Bitcoincore идентифицировать PN (или простую модификацию протокола)?

В протоколе уже есть понятие оценки блокировки DoS, в которой каждый узел Bitcoin Core присваивает частную оценку каждому из своих пиров за любое плохое поведение, которое они совершают. Как только оценка запрета DoS для определенного узла достигает порогового значения (по умолчанию 100), узел отключается от узла и отказывается от дальнейших подключений со своего IP-адреса на некоторое время (один день по умолчанию). Плохое поведение включает в себя отправку недопустимых транзакций и блоков.

Поскольку PN не проверяют данные, они с радостью передают неверные данные. Если они станут обычным явлением, кто-то, кто хочет навредить PN, может просто подключиться к любому объявленному узлу и отправить ему кучу неверных данных. Если это был настоящий полный узел, он отключится (DoS-бан). Если бы это был PN, он передал бы эти данные на настоящие полные узлы, в результате чего настоящие полные узлы запретили бы их DoS. Это сделало бы PN бесполезным и позволило бы гриферу определить, какие узлы являются PN — грифер мог бы затем опубликовать (неаутентифицируемую) базу данных IP-адресов PN.

Этот метод лучше всего работает против долгосрочных PN. Чтобы затруднить выполнение краткосрочных атак Sybil из множества облегченных PN, можно использовать что-то вроде доказательства хранилища Грега Максвелла, чтобы сделать потребление распределенных ресурсов дорогостоящим .

Спасибо за подробную теорию; Я изменил свой запрос, чтобы выяснить, что, если вообще что-нибудь, может разграничить между PN и узлом (например, где протокол компенсирует эти сценарии.
@WizardOfOzzie отредактировал, чтобы ответить на вторую часть вашего вопроса.
Фантастика, в этом есть большой смысл. Хорошо, что это не главная проблема. Я награждаю вас щедростью, которую я настраиваю, когда я могу это сделать
@DavidA.Harding По умолчанию PN не будет передавать данные, если по крайней мере 2 других случайно выбранных узла также не передают те же данные. Поэтому трудно «обмануть» PN, заставив его передавать неверные данные.
@ Василий, это круто, хотя я не думаю, что это что-то принципиально меняет. Это просто означает, что и атакующему, и описанному выше гриферу нужен один дополнительный IP-адрес, а злоумышленнику также необходимо подключиться к нескольким PN.
Я должен был также упомянуть, что PN не доверяет входящим соединениям. Таким образом, он учитывает только запросы, полученные от исходящих пиров. В противном случае было бы легко обмануть PN, как вы описываете.
@ Василий Хех. Хорошая идея! Это, безусловно, делает атаки с использованием PN намного менее тривиальными. Я предполагаю, что по-прежнему легко обнаружить PN, отправив узлу неверные данные, например, неверную транзакцию в незавершенном invсообщении tx(способ, которым BitcoinJ отправляет транзакции в режиме SPV), а затем ожидая, не отключится ли узел.