Эпизод 07 - Удалённые узлы

24/01/2019

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

Стенограмма эпизода:

Джастин: Рад снова приветствовать вас, это Breaking Monero, Сегодня Саранг и я поговорим об удалённых узлах и обсудим некоторые вопросы, связанные с их использованием. Всем нам уже известно, что удалённые узлы — довольно удобная вещь. Большинство кошельков любой криптовалюты, включая Monero, Bitcoin и многие другие, приветствуют использование удалённых узлов, поскольку соединение с ними происходит быстро, они просты в использовании, и, по-моему, GUI-клиент Monero даже по умолчанию обеспечивает простую опцию подсоединения к удалённым узлам, поэтому и сам клиент запускается быстро. Не приходится сидеть и долго ждать соединения в течение нескольких дней. Но, несмотря на все удобства, вы перекладываете часть ответственности, и вам приходится доверять таким узлам, когда вы пользуетесь ими. Поэтому необходимо понимать все компромиссы использования удалённых узлов. И сейчас Саранг расскажет вам о способах использования Monero с различными типами соединений, а также о том, что могут дать вам такие узлы.

Саранг: Правильно. Итак, в некотором смысле, независимо от программного обеспечения выбранного вами кошелька, в какой-то момент вам придётся соединиться с каким-то программным обеспечением, поддерживающим копию блокчейна. Причина состоит в том, что когда вы генерируете новую транзакцию, программному обеспечению вашего кошелька необходимо в равной степени знать определённые выходы, которые вы пытаетесь потратить, а также быть в состоянии взять ложные выходы для построения кольцевых подписей, о которых мы уже много говорили, из истории блокчейна. Таким образом, в определённый момент программному обеспечению потребуется доступ к копии блокчейна. И вот здесь есть несколько способов сделать это, один из которых часто описывается людьми как «создание своего собственного узла». Ну, запуск собственного узла, по сути, означает, что у вас где-то есть машина, какое-то устройство, обычно это компьютер. Фактически на нём содержится полная копия блокчейна Monero и, по мере того как появляются новые блоки, они прикрепляются к блокчейну, машина верифицирует их правильность и обеспечивает данные блокчейна, когда вы решаете провести транзакцию. Затем новые блоки сканируются, а баланс указанных вами кошельков обновляется. Тем не менее, что делать с устройствами с небольшой мощностью или скромными ресурсами для хранения данных, с телефоном, например, куда обычно нельзя загрузить полную копию блокчейна и поддерживать её? Это займёт много времени, много места и большой объём питания, что, как правило, делать не хочется. Вот в этом случае я могу дать указание программному обеспечению соединиться с узлом, удалённым узлом, как мы называем их, который поддерживает полную копию блокчейна и находится где-то в другом месте. Это может быть компьютер, расположенный где-то ещё и контролируемый мною, или же это может быть компьютер, доступ к которому кто-то обеспечил на благо сообщества и сети. Также есть вариант с использованием «полукастодиального» сервиса подобного MyMonero или открытого сервера Monero, которые работают несколько иначе, и в отношении которых требуется некоторое доверие, чтобы они отслеживали транзакции от вашего лица, но это не совсем то же самое, о чём мы говорим. Итак, Джастин, сейчас, может, немного расскажешь о любом из этих типов узлов, что они фактически делают, и почему нам следует взаимодействовать со всеми ими.

Джастин: Превосходно! Как уже было отмечено тобой, есть необходимость в некоторого рода связи с другими участниками сети. Можно самостоятельно подписать транзакцию локально, но в конечном счёте будет необходимо сообщить всем, что транзакция была проведена, чтобы о ней стало известно в других местах. Так что, в первую очередь, связь понадобится для сообщения информации остальной части сети. Одним из способов состоит в том, чтобы подсоединиться к кому-то, у кого уже есть такая связь, и кто бы мог протолкнуть информацию дальше в сеть. Подобным образом, если кто-то захочет адресовать транзакцию мне, например, вместо установления прямого соединения с другими участниками сети, я могу сказать, что свяжусь с данным конкретным лицом, у которого есть инфраструктура узла, и мне сообщат, когда будут проходить мои транзакции. Мне будут направлены блоки, я просмотрю эти блоки локально, я проверю, есть ли в этих блоках транзакции, адресованные мне, я узнаю о статусе обновления сети, скажем так, через этот узел, узнаю, как обстоят дела. Эти узлы удобны в использовании с точки зрения облегчения процесса начальной синхронизации, когда ты выводишь свой удалённый узел онлайн. Прости, когда ты выводишь свой кошелёк онлайн. Когда ты выводишь кошелёк онлайн после того, как он не был в этом состоянии несколько дней, ему необходимо получить последние данные за эти несколько дней и узнать, предназначены они для тебя или нет. Если вы используете удалённый узел, это означает, что вы получаете блоки напрямую. Если вы попытаетесь создать собственный удалённый узел, свой полный узел, вам понадобиться синхронизировать все данные блоков подобным образом. Но я хотел бы подчеркнуть следующее: когда вы пользуетесь удалённым узлом, от вас не требуется предоставления ваших приватных ключей. Вы не даёте права на то, чтобы такие узлы тратили ваши деньги, вы просто запрашиваете у них информацию или же даёте им информацию. Но никакая информация, предоставляемая им вами, не даёт удалённым узлам права на трату ваших средств. Точно также мы не даём своего приватного ключа просмотра, как в случае использования сервисов вроде MyMonero или другого сервиса Monero открытого типа. В плане интерактивности как бы снимается один уровень, соединение с такими удалёнными узлами менее интерактивно, если сравнивать с теми типами настроек. В конечном счёте, когда вы проводите транзакции, удалённые узлы дают вам данные, которые необходимы для построения новых колец для ваших транзакций. У вас есть один выход, который вы хотели бы отправить кому-то другому. Но для проведения транзакции вам необходимы и другие выходы. Поэтому вы запрашиваете выходы у удалённого узла, он даёт их вам, вы подписываете транзакцию, передаёте её удалённому узлу, а уже он передаёт её остальной части сети. Саранг, не мог бы ты рассказать о самом процессе отправки транзакции немного поподробнее?

Саранг: Конечно. Предположим, я хотел бы взаимодействовать с сетью Monero через мой телефон, но я не хочу создавать полный узел на моём телефоне, так как это требует много места, много времени на поддержку, так что вместо этого я соединяюсь с удалённым узлом. Опять же, это может быть узел, созданный лично мною, и я буду знать, что его данные верны, или же это может быть общедоступный удалённый узел, созданный кем-то для поддержания сети. Первое, что мне нужно сделать, это дать программному обеспечению моего кошелька указание синхронизироваться с полным блокчейном. Но это не означает, что он начнёт скачивать и поддерживать весь блокчейн. Вместо этого он запросит некоторую информацию блоков, которая, в частности, будет включать в себя данные транзакции. Опять же, узел не будет знать, какая из транзакций будет предназначена мне, поскольку я не собираюсь говорить ему об этом. Эта информация является чувствительной. Вместо этого я запрошу данные транзакций, а мой телефон локально выявит транзакции, направленные мне, и сохранит некоторую информацию баланса, чтобы отправлять транзакции. Безусловно, по мере поступления новых блоков от удалённого узла на мой кошелёк, мой кошелёк некоторым образом будет обновлять себя. Таким образом, сохраняется минимум информации, а также приходится полагаться на то, что удалённый узел поддерживает собственную копию блокчейна для синхронизации. Затем, когда я буду готов отправить транзакцию, и моему кошельку уже будет известно, какие выходы я собираюсь отправить, мне по-прежнему будут неизвестны данные других ложных выходов. Следует помнить, что мой кошелёк не сохраняет такой информации, поскольку это равноценно локальному хранению всего блокчейна. Вместо этого мой телефон запросит удалённый узел отправить ему данные от 1 до 10 выходов из блокчейна. Безусловно, это будут выходы, выбранные в соответствии с распределением, о котором мы говорили ранее. Так что когда я говорю, что я хотел бы получить данные от 1 до 10 выходов или от 1 до 11, или любого другого количества выходов, это будет принципиально зависеть от размера кольца. Я также запрошу выход, данные которого мне известны, так как в каждом кольце, которое я собираюсь создать, мне уже будет известен выход реального отправителя. Мне известен выход, который я собираюсь отправить. И, конечно же, я не собираюсь запросить у удалённого узла только ложные выходы, поскольку, кода я позже буду отправлять транзакцию, удалённый узел скажет: «Минуточку, я отправлял только 10 ложных выходов, а в этом кольце 11 участников. Я понял, кто тут является отправителем». И это будет плохо. Вместо этого мой телефон запросит 11 ложных выходов, а затем использует их в транзакции. В чём тут преимущество? А преимущество состоит в том, что удалённый узел не узнает, какой из выходов будет принадлежать отправителю. Поэтому запрашивается информация всех ложных выходов. Сам удалённый узел не будет знать, какие из выходов ложные. А затем мой телефон использует собственные библиотеки для шифрования, для криптографии, для создания подписей, для построения транзакции, а после этого просто перейдёт непосредственно к отправке транзакции. Теоретически объём связи с удалённым узлом, необходимый для построения транзакции, невелик. По большей части это просто получение информации по ложным выходам и фактическому члену кольца, необходимой для построения кольца.

Джастин: Да, я думаю, важно отметить, что было сделано очень много для того, чтобы ограничить объём данных, передаваемых таким удалённым узлам, поэтому совсем не очевидно, что удалённые узлы способны сделать что-то уже очень и очень плохое. Но это Breaking Monero, и мы должны пройтись по всем возможным ограничениям. Мы говорили о статус-кво, о том, как работают эти удалённые узлы. А теперь давай поговорим о том, что может произойти, если удалённый узел будет принадлежать злоумышленнику, если он будет использован для атаки, чтобы навредить, в той или иной степени. Что может сделать удалённый узел, принадлежащий злоумышленнику? Ведь он может знать, ну, почему может, не может, он точно знает IP-адрес, используемый для соединения с ним. Если вы в своей домашней сети и не имеете какой-либо другой защиты, и напрямую соединяетесь с удалённым узлом, и начинаете проведение транзакции, то узлу известен ваш домашний IP, так как вы действуете через открытое соединение для связи с узлом с вашего IP. Если вы используете некоторые меры предосторожности, используете VPN или нечто подобное, доверяя службе VPN, или же вы работаете через сервер Tor, или через другой промежуточный сервис, то это, очевидно, защитит вас, и удалённый узел не получит информации о вашем IP. Потенциально это поможет, но риск утечки информации о вашем IP при использовании удалённых узлов повышается, если сравнивать со случайным подсоединением к сети, так как если вы подсоединяетесь к сети с вашего IP, то люди совсем не обязательно узнают, что транзакции проводятся с вашего IP, но если вы используете удалённый узел, то людям точно будут известны транзакции, которые вы пытаетесь провести. Подобным образом вам могут подбросить фальшивые данные кольца. Саранг подробнее расскажет о подобном виде атаки, а также о том, как проект Monero пытается избежать подобной опасности. Но вы запрашиваете информацию у узла, и вы не можете проверить какую-либо информацию, кроме информации о деньгах, которые вы контролируете локально, так как у вас нет локальной копии блокчейна, так что узел может попытаться обмануть вас при определённых обстоятельствах и определёнными способами, чтобы получить информацию о вашей транзакции. А затем в конечном счёте злоумышленник может провести что-то вроде «атаки Сивиллы», когда ваша транзакция просто не пропускается. Предположим, вы отправляете транзакцию через, ну, я не знаю, соединение определённого интернет-провайдера, и этот провайдер по какой-то причине предпочитает не иметь дела с ISP. Транзакции, проводимые чрез ISP компании, будут блокироваться. Так что существуют некоторые риски, когда вы соединяетесь с удалёнными узлами, и они не будут работать так, как вы рассчитываете, они будут делать всё как-то иначе. В этом случае они станут только досаждать вам, досаждать вашему соединению, и вам придётся найти другой способ для проведения транзакций. Саранг, не мог бы ты рассказать подробнее, что происходит, если ваш узел получит ложные данные, и какие могут возникнуть проблемы, связанные с этим?

Саранг: Эта проблема специфична именно для Monero. Как я уже говорил, когда вы хотите провести транзакцию, если размер кольца составляет 11, как на сегодняшний день, если я буду тратить определённый выход, его данные уже будут мне известны, поскольку мой телефон хранит данные моих собственных выходов. Таким образом, он, например, хранит информацию баланса, но в общей сложности он запросит у удалённого узла 11 выходов, 10 из которых, как мне известно, будут ложными, но один, опять же, как будет известно только мне, будет моим собственным выходом. Безусловно, удалённый узел может решить: «OK, вот что я сделаю. Я подменю некоторые из этих выходов, отправляемых на телефон, либо искажёнными данными, либо информацией о выходах, которые я сам контролирую». А у меня на месте нет информации о них. Я не могу сказать, искажены они или нет.

Джастин: Прости, перебью тебя немного. Саранг, для примера, предположим, я подсоединяюсь к тебе, ты — удалённый узел. У меня есть выход, который я собираюсь потратить, и я запрашиваю у тебя 11 выходов. Я запрашиваю у тебя свой собственный выход, который я уже контролирую, а также 10 других, которые я выбираю, но так как я не имею возможности верифицировать эти 10 других выходов, ты можешь обмануть меня с ними. В любое количество запрошенных выходов ты можешь добавить информацию выходов, которые ты уже контролируешь, или вообще какие-то ложны данные. Я правильно понял?

Саранг: Да, так оно и есть. А теперь рассмотрим крайний случай. Я как удалённый узел могу решить и отправить Джастину, например, либо все 11 выходов, контролируемых мною, либо 11 случайных искажённых выходов. Программному обеспечению кошелька Джастина известен его собственный выход, и так как я отправил ему все искажённые выходы, это будет означать, что тот, который известен телефону, тоже должен оказаться искажённым. В этом случае, если его кошелёк настроен правильно, как все кошельки настроены по умолчанию, он должен забить тревогу и указать на то, что происходит что-то не то, и что данные каким-то образом повреждены. Если он достаточно сообразителен, он быстро отсоединится от моего узла и более никогда не будет подсоединяться к нему. Что он может сделать, если он, как бы это сказать, совсем-совсем ничего не понимал в этом? Он мог бы попробовать сгенерировать транзакцию заново. Ну, допустим, это недостаточно умный кошелёк. Это означает, что он попытается потратить тот же выход во второй раз, но запросит при этом совершенно другой набор ложных выходов. В этом случае я, вновь получающий эту информацию, смогу увидеть общие входы в этих запросах и попытаться провести махинацию с пересекающимися кольцами, и выявить настоящий выход траты. Но есть более хитрый способ сделать это. Я не стану делать этого, потому что его кошелёк может некоторым образом одуреть, но вместо этого я могу выборочно снова взять несколько выходов, мне неизвестно, какой принадлежит ему, поэтому я случайно выберу несколько из них и искажу их, и отправлю данные обратно. Если мне не повезёт, то я искажу его настоящий вход, а затем его кошелёк взбесится и поднимет тревогу. Но если я не сделаю этого, и если я искажу только те, что используются в качестве ложных, то кошелёк не заметит этого. А это означает, что если он отправит транзакцию, то я смогу посмотреть на мои данные и сказать: «OK, статистически у меня есть более высокая вероятность того, что я определю, какой тут настоящий выход, так как это точно не один из тех, которые были мною искажены». Удалённый узел может провести статистические атаки на кошелёк, чтобы узнать, какой выход тратится на самом деле. Это изощрённый вид атаки, который работает какое-то время, он незаметный. Следует отметить, что во всех подобных случаях это не означает, что удалённый узел сможет потратить средства, которые не контролируются им, это невозможно. Это означает лишь то, что путём махинаций удалённый узел может либо показать, кто действительно потратил выход, как в случае, если Джастин запросит абсолютно новые выходы, либо он попытается выборочно исказить несколько выходов в попытке повышения шансов на статистическое выявление истинного выхода. Это очень изощрённая атака, которая опирается на тот факт, что вы запрашиваете информацию у удалённого узла, и правильность какой-то части этой информации вы не в состоянии проверить.

Джастин: Если ты отправил мне транзакцию или отправил выходы, которые были искажены, и я подписал её и вернул тебе, будет ли такая транзакция передана в сеть, или же сеть отклонит её?

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

Джастин: нтересно, спасибо. Давай теперь поговорим о том, что можно предпринять для того, чтобы избежать атак подобного вида. То есть очевидным способом является отказ от использования удалённых узлов, так? Если ты можешь не делать этого, то подобных вещей можно избежать, используя свой собственный узел. С этим также связаны определённые вопросы, но в конечном счёте это лучше с точки зрения безопасности и анонимности. Даже если вы стоите перед выбором между удобствами использования удалённого узла и преимуществами создания собственного полного узла, то лучше создать у себя полный узел, который будет работать 24 часа в сутки и 7 дней в неделю. Тогда у вас будет свой собственный компьютер, работающий как программная библиотека, как Open Monero или Fast Sync, например, и вы всегда сможете соединиться с собственным удалённым узлом или собственным сервером MyMonero, и, таким образом, у вас будут все преимущества, которые бы вы получили, соединившись с удалённым узлом. Но вместо того, чтобы доверять кому-то ещё свои данные, верить в то, что с вашими данными не проведут какую-то махинацию, вы будете просто доверять самому себе. В данном случае дополнительный уровень доверия отсутствует, вы получаете все преимущества, используя собственную, созданную вами инфраструктуру, а не доверяете созданной другими инфраструктуре. Есть несколько других в разумной мере безопасных опций, выбор которых зависит от вашей модели использования. Если вы предпочитаете доверять каким-то другим людям, допустим, я считаю, что Саранг классный парень, а у Саранга есть удалённый узел, и если у него есть удалённый узел по конкретному IP-адресу, к которому можно подсоединиться и проводить транзакции, то им стоит воспользоваться. Если я доверяю Сарангу, я могу использовать его удалённый узел, и, безусловно, мне приходится доверять ему, но если я хочу это сделать — OK, в данном случае это конкретно моя модель угрозы. Что потенциально будет чуть менее безопасно, и что будет зависеть от ряда определённых обстоятельств, безусловно, но вы можете подсоединяться к ряду случайных удалённых узлов. Вы подсоединяетесь к какому-то удалённому узлу, понятия не имея, кем он создан и при каких обстоятельствах. К примеру, есть несколько служб, сейчас покажу вам список, вот он, эти службы просто собирают список всех доступных удалённых узлов. В данном случае это node.pwned.systems, как видите, они просто сканируют сеть Monero на наличие открытых узлов. В списке их несколько, очевидно, я не буду говорить обо всех или о каком-то определённом из них, но это пример списка узлов, к которым я могу подсоединиться. Они доступны, теоретически я могу подсоединиться к ним, и сделать это я могу в произвольном порядке. Безусловно, я не знаю, кто стоит за ними. Они могут заниматься какими-то махинациями или подобными делами. И в этом случае лучшее, что можно сделать, если ваш кошелёк начнёт сигнализировать, что что-то не так с удалённым узлом, то надо просто остановиться и не использовать его больше никогда. Подсоединяйтесь к следующему, поскольку если ваш кошелёк предупреждает вас о чём-то, то очень вероятно, что удалённый узел чем-то пытается вам навредить. Едва ли нормальный удалённый узел будет конфигурирован так, что будет выдавать вам фальшивые данные по умолчанию. Это просто не имеет смысла.

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

Джастин: Точно так. И последнее, о чём я хотел сказать чуть ранее. Если вы хотите помочь скрыть некоторые метаданные сетевого уровня от удалённого узла, чтобы он не смог узнать ваше местоположение, например, соединяйтесь через Tor или подобную службу. Возможно, в случае синхронизации данных, это будет реально медленнее, но если вы проводите транзакции и занимаетесь подобным чрез удалённые узлы, то это имеет смысл. Если вы используете службу VPN, которой доверяете, например, то во многих случаях это будет полезно для многих моделей угрозы. Ладно, думаю, мы достаточно обсудили, что и как обстоит с удалёнными узлами Bitcoin и Monero и что уникально для Monero, и какие проблемы могут возникнуть при использовании удалённых узлов с точки зрения безопасности и анонимности. Есть ли какие-то заключительные мысли для наших зрителей, Саранг?

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

Джастин: Хорошо. Ещё раз спасибо, Саранг. Спасибо всем, кто смотрел нас, встретимся в следующий раз. Берегите себя.

Перевод: Mr. Pickles
Редактирование: Agent LvM
Коррекция: Kukima