Хакните HL и заработайте 125.000 рублей

Введение

При достаточном количестве наблюдателей ошибки выплывают на поверхность

(Закон Линуса)

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

К сожалению, я не компания, как например, ruvds, способная выдать действительно приличное количество средств в своём хакатоне для общего интереса. У меня есть только работа, благодаря которой я получаю средства, и мой pet-проект, на который я готов тратить как своё свободное время, так и эти же полученные средства.

О проекте HL

Hidden Lake (HL) — это одноранговая (P2P) децентрализованная friend-to-friend (F2F) анонимная сеть, основанная на принципе микросервисной архитектуры и написанная на языке Go. В ядре анонимной сети (Hidden Lake Service = HLS) содержится анонимизирующий алгоритм с доказуемой моделью на базе очередей. Он является теоретически доказуемым, в том простом плане, что любые действия пассивных атакующих, как апостериорные вероятности деанонимизации, становятся равны априорным вероятностям. Иными словами, качество анонимности не уменьшается вследствие ряда исследований со стороны пассивных атакующих (в том числе и со стороны глобального наблюдателя).

Помимо HLS, проект HIdden Lake также содержит другие сервисы, а именно: 1) Hidden Lake Traffic (HLT) - распределитель трафика, способный работать как в роли ретранслятора сообщений, так и в роли хранилища трафика; 2) Hidden Lake Messenger (HLM) - прикладное приложение, предоставляющее возможность отправления / получения сообщений и файлов. В приложениях: HLS, HLT, HLM, и в их комбинациях: HLS+HLM, HLS+HLT, HLS+HLT+HLM, выражается весь проект HL.

Для упрощения тестирования, запуска и адаптации к проекту, для последующего поиска уязвимостей, можно воспользоваться примерами, которые находятся в директории examples самой библиотеки go-peer. Некоторые примеры можно запускать в докере. В README присутствуют примеры запуска, как приложений, так и непосредственно самих примеров.

Хакатон

Теория и практика иногда сталкиваются. Когда это случается, теория проигрывает. Всегда

(Закон Линуса)

Хакатон проводится онлайн. Допускается формирование команд. На хакатоне даётся в общей сложности 7 дней (без учёта сегодняшнего, неполного дня) дата завершения: 12.08.2023, включительно. За это время вам необходимо будет найти как можно больше уязвимостей, багов, неточностей и т.п. в проекте HL. Все результаты ваших исследований, а также призовые места, будут помещены и закреплены в комментариях к этой статье после окончания хакатона.

Я продолжительное время думал на счёт того, как я буду оценивать сам хакатон. По каким критериям я буду разделять уязвимости между собой? В какой пропорции N багов будут относиться к M уязвимостям? Что если два человека выдадут хорошо похожие результаты, кого выбрать в качестве победителя? Стоит ли делать одно место в 125.000 рублей или стоит разделить эти средства по местам? Чем ограничены рамки поиска уязвимостей?

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

  1. В хакатоне будет статично 125.000 рублей. Вне зависимости от количества призовых мест, данная сумма не пропадёт, а будет лишь распределяться. Максимум призовых мест = 3. Таковой исход благоприятен при высокой активности участников и качестве исследований. В таком случае, победителю (первое место) достанется 62.500 рублей, второму месту = 41.666 рублей, третьему месту = 20.834 рублей. Если активность участников или качество исследований будет низкое, где при этом будет выделяться лишь один или два человека, то и само призовое место снизведётся до одного или двух человек. И как следствие, награда будет равна либо 125.000 победителю, либо 73.334 рублей (первому месту) и 51.666 рублей (второму месту).

  2. В хакатоне, все найденные, исследованные и доказанные уязвимости, надо отправлять в ближайшее время, не дожидаясь окончания сроков хакатона. В таком случае, я смогу точно по времени узнать, кто первый заметил данную уязвимость / баг / неточность, доказал её существование и указал способы её решения. Лишь в полной конкатенации: указать (на уязвимость) + доказать (уязвимость) + указать на решение (уязвимости), ответ считается зачтённым. Следовательно, если два участника отправят отчёт о похожей уязвимости, то таковой отчёт зачтётся только тому, кто первый и в полной мере описал её.

  3. Пропорции между багами и уязвимостями я точно не смогу выяснить до тех пор, пока самолично не узнаю эти пропорции в проекте HL. Одно могу сказать точно — уязвимости являются наивысшими оценками, и если таковые будут найдены, то это точно сыграет больше в оценивании итогового результата, чем если бы вы нашли баг или какую-либо неточность.

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

  5. Разделение уязвимостей будет происходить по их качеству, по реальной разрушительной способности. Чем серьёзнее будет уязвимость, тем больше виртуальных (абстрактных) баллов будет вам зачислено. Таким образом, уязвимость уязвимости рознь, ровно также, как и уязвимость не оценивается как баг. Но в отличие от багов, уязвимости могут быть примерно равны по своему потенциалу к деструкту системы.

  6. Поиск уязвимостей, багов, неучтённых моментов не ограничивается исключительно программным кодом директории cmd/hidden_lake. Ограничение будет затрагивать только тот код, который не принадлежит к cmd/hidden_lake, или тот код, который не относится к библиотеке go-peer. Так например, даже если в директории cmd/micro_anon будет найдена уязвимость, она не будет зачтена, потому как cmd/micro_anon никак не принадлежит к cmd/hidden_lake. Такая же ситуация и с подключаемыми сторонними библиотеками. Если в одной из них будет найдена уязвимость, например в github.com/syndtr/goleveldb, то уязвимость также не будет учтена. С другой стороны, директории pkg/network или internal/api напротив, полностью относятся к области cmd/hidden_lake, т.к. наследуются ею.

Все отчёты отправляйте мне в личные сообщения ВК или в Telegram (рекомендую отправить и туда, и туда). И там, и там, ID = number571. Отправляйте отчёты, пожалуйста в одном из файловых форматов: «.txt», «.pdf». В файле укажите ссылки на профили участников, чтобы в случае выигрыша я знал кому надо переводить. Все участники должны быть согласны с участием и отнесением себя к команде. Команда делит итоговый результат поровну. То есть, если команда состоит из трёх человек заняла первое место при условии высокой активности участников (иными словами, существуют вторые и третьи места), и получила тем самым 62.500 рублей, то каждый участник индивидуально получит по 20.834 рублей. Аналогична ситуация со вторым и третьим местами.

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

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

Литература

При разборе уязвимостей, багов и прочего, на всякий случай лучше перепроверить, что таковые моменты я не описывал ещё в своих работах. Так например, возможность осуществления DDoS на сеть не является ни уязвимостью, ни багом на сеть HL. Спорно? Без сомнения спорно, но по данному нами ранее определению уязвимостью считается не только факт её существования, но также и способы её искоренения, не вредя при этом самой системе в степени большей, чем само "изживание" проблемы.

Подобная же ситуация присутствует и с теоретически, а в неком роде и практически, возможной MITM атакой на устройстве клиента между HLS и HLM в локальном окружении. Они обмениваются асимметричными ключами, чтобы исключить пассивные атаки на дальнейший перехват приватного ключа. Тем не менее, MITM атаки такой подход не искореняет, но и практического способа я не могу придумать, чтобы таковой был способен предотвращать MITM.

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

Что насчёт литературы, то список основной литературы такой (от наиболее основополагающих, к более частным):

  1. Теория строения скрытых систем (60 стр.);

  2. Абстрактные анонимные сети (22 стр.);

  3. Монолитный криптографический протокол (9 стр.);

  4. Криптографический протокол обмена ключами децентрализованного характера в среде централизованных сервисов связи (10 стр.);

Также на хабре есть ряд более конкретных статей:

  1. Hidden Lake Service — ядро скрытой сети с теоретически доказуемой анонимностью;

  2. Пишем анонимный мессенджер с нуля;

  3. Обезопасить, удержать, сохранить. Выгрузка трафика анонимной сети как свойство отложенной маршрутизации в HLT;

  4. Тайные каналы связи или как централизованные сервисы способны разлагаться изнутри;

  5. Анонимная сеть в 200 строк кода на Go;

Заключение

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

Проект HL;

@Number571
04.08.2023 10:17 UTC
Первоисточник

Комментарии

@Number571
13.08.2023 02:26 UTC
+1

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

  1. Первое место - TeaRot (73.334 рублей)

  2. Второе место - vectorABY (51.666 рублей)

Найденные уязвимости/баги были следующие:

  1. [TeaRot] Атака двух друзей HLM<->HLS.

    Когда пользователь авторизуется в HLM он расшифровывает приватный ключ посредством ввода логина и пароля. Далее этот приватный ключ он отсылает к HLS. И начиная с этого момента, чтобы совершать последующие действия (например отправка/получение сообщений для внесения в БД) HLM всегда запрашивает у HLS публичный ключ. Это может привести к следующему сценарию:

    1. HLM отправляет приватный ключ к HLS

    2. HLM запрашивает в N-ом действии свой публичный ключ от HLS (подразумивая, что этот публичный ключ от переданного им ранее приватного ключа)

    3. HLS отправляет к HLM совершенно иной публичный ключ, и совершает анонимизацию под совершенно другим приватным ключом

    4. Протокол анонимизации работает всегда корректно, но сам пользователь под HLM фактически находится под другим аккаунтом.

    Эксплуатировать уязвимость можно таким образом:

    1. Существует три пользователя и две связи друзей: A <-> B, B <-> C, то есть B общается сразу с двумя друзьями.

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

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

    Решением здесь является следующее:

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

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

  2. [TeaRot] Атака двух друзей HLM<->HLT.

    Когда HLM запрашивает у HLT сообщения, то для начала HLM скачивает их хеши. Далее по запросам на хеши HLM получает от HLT сообщения и перенаправляет их к HLS. Тем не менее, HLM не проверяет целостность самого сообщения, а именно не сравнивает хеш предполагаемый и хеш получаемый. В таком сценарии, HLT может выдавать случайные хеши, но при этом всегда отсылать только конкретные сообщения.

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

  3. [TeaRot] Неправильное/невалидное API HLS, HLT.

    Это уже конечно не уязвимость, но правильное замечание. Редактируя HLS, HLT иногда я забывал редактировать соответствующую документацию по API.

  4. [TeaRot] Всегда в ответах: text/plain;

    Это тоже из разряда бага/неправильного проектирования. Суть заключается в том, что HLS, HLT отправляют всегда ответы с text/plain форматом, даже если результатом их ответов является JSON. В итоге, браузеры, постман и прочие могут некорректно отображать сами результаты (в виде обычного текста, без структуризации).

  5. [vectorABY] Небезопасное отправление/получение сообщений HLM<->HLM.

    Когда HLM отправляет или получает сообщения, то таковые сообщения переходят или приходят от HLS непосредственно в открытом виде. Иными словами, безопасная коммуникация наблюдается лишь и только между двумя HLS, но не между двумя HLM. Более кратко это можно описать так: HLM -- [незашифрованное сообщение] --> HLS -- [зашифрованное сообщение] --> HLS -- [незашифрованное сообщение] --> HLM.

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

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

    Тем не менее, решить данную проблему сложнее чем кажется. Суть заключается в том, что HLM работает по принципу HTTP-сервера, где сами же данные адресуемые от интерфейса к HLM незашифрованы. Эту проблему можно исправить, если создать приложение самодостаточное - либо десктопное, либо мобильное.

  6. [vectorABY] Некорректное вычисление статичного размера сообщений в pkg/client.

    Баг, в том плане, что некоторые байты при вычислении статичного размера сообщения мы просто не могли использовать.

Большая часть моментов уже была исправлена, а именно:

  1. Атака двух друзей HLM<->HLS (с авторизацией внутри HLM, нужно будет также сделать авторизацию через отдельный сервис)

  2. Атака двух друзей HLM<->HLT

  3. Неправильное/невалидное API HLS, HLT

  4. Всегда в ответах: text/plain

  5. Небезопасное отправление/получение сообщений HLM<->HLM (ЧАСТИЧНО! т.к. HLM не был переведён на десктоп/мобильное приложение)

  6. Некорректное вычисление статичного размера сообщений в pkg/client