SergeyRazzhivin

SergeyRazzhivin

На Пикабу
111 рейтинг 1 подписчик 2 подписки 2 поста 0 в горячем
Награды:
5 лет на Пикабу
8

Обмен паролями и ссылками между устройствами. Закрыл в Copy Sync дыру, про которую честно предупреждал в прошлом посте

Передача буфера обмена между устройствами через защищённый канал

Передача буфера обмена между устройствами через защищённый канал

Короткое напоминание

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

Многие тогда справедливо спросили в комментах: "а ключи-то от шифрования откуда устройства берут?" Вопрос в точку. И в той статье я сам честно написал, что тут осталась слабое место. Вот её и чиню.

В чём была дыра

Объясню простым языком:

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

И вот тут собака зарыта. А что если сервер (или тот, кто его взломал) вместо настоящего ящика вашего устройства подсунет свой? Тогда:

  • ваше первое устройство шифрует письмо в подставной ящик;

  • сервер его спокойно открывает, читает, потом перепаковывает в настоящий ящик и отправляет дальше;

  • второе устройство получает письмо как ни в чём не бывало.

Оба ваших устройства довольны, а посередине кто-то всё прочитал. Это называется "человек посередине" (man-in-the-middle). И самое обидное шифрование тут ни при чём, оно идеальное. Просто зашифровали не туда. А "не туда" подсунул именно тот, кому мы вроде как не должны были доверять, мой сервер.

Неприятно, что мой же сервис, про который я писал "нечем вас прочитать", в этом сценарии всё-таки мог. Так не пойдёт.


Как защититься

Способ старый и проверенный, такой же используют в Signal и WhatsApp, когда показывают "код безопасности". Идея простая:

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

Вы открываете Copy Sync на двух своих устройствах и сравниваете отпечатки глазами. Совпали - значит, между устройствами реально один и тот же ключ, никто посередине не встрял. А если сервер подсунул свой ключ - отпечаток сразу разойдётся, и вы это увидите. Подделать его нельзя: отпечаток намертво привязан к ключу.

Пять секунд работы - и MITM из "незаметно читает всё" превращается в "попадётся на первой же сверке".


А теперь - самое главное, ради чего и пишу

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

Я этого не сделал. Сознательно.

Смотрите. Мы защищаемся от кого? От сервера. А теперь представьте, что я бы доверил тому же серверу хранить отметку "этому ключу можно верить". Взломщик просто поставил бы галочку "проверено" своему поддельному ключу и вся защита превратилась бы в спектакль. Нельзя ставить сторожить дверь того, от кого ты эту дверь запираешь.

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

Цена честная: сверять придётся на каждом устройстве отдельно. Но это в сто раз лучше, чем доверять "проверку" тому, кого проверяешь.


Бонусом - подключение второго устройства по QR

Заодно сделал удобную мелочь. Раньше, чтобы добавить второе устройство, надо было вводить пароль. Теперь на первом устройстве показывается QR-код, вы сканируете его вторым и всё, вы в системе. Без пароля.

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


Честно о том, чего ещё нет

Как и в прошлый раз - про минусы сам, без прикрас:

  1. Сверка ручная. Она работает, только если вы реально сравнили отпечатки. Не сравнили - защита не сработает. Я не заставляю это делать насильно, но честно: это инструмент, а не автоматический щит.

  2. Сервис пока не предупреждает сам, если ключ вдруг сменился - он лишь снимает галочку "проверено". Автоматическое уведомление "эй, ключ поменялся!" следующая задача.

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


Посмотреть

  • Сайт: copysync.ru (заведите два устройства, подключите второе по QR и сверьте отпечатки — увидите всё своими глазами)

  • Исходники: gitlab.com/razgiva/copy-sync

    Буду рад вопросам и критике - особенно от тех, кто шарит в безопасности. Нашли, как обойти сверку, - для меня это ценнее лайка.

А вопрос к вам такой: вы вообще когда-нибудь сверяли "код безопасности" в Signal или WhatsApp? Или это та штука, которую все видели, но никто ни разу не нажимал?

Показать полностью
1

Надоело пересылать самому себе пароли в «Избранное». Сделал свой обмен буфером - и так, чтобы даже я не мог прочитать ваши данные

Надоело пересылать самому себе пароли в «Избранное». Сделал свой обмен буфером - и так, чтобы даже я не мог прочитать ваши данные

С чего всё началось

Знакомая ситуация? Скопировал на телефоне код из СМС - надо вставить в терминал на ноуте. Скопировал ссылку на компе - хочешь открыть на телефоне. И каждый раз одно и то же: отправляешь сам себе в Telegram, в «Избранное».

У меня этих «Избранных» сообщений уже на пару тысяч накопилось. Свалка из ссылок, кодов, кусков текста и паролей.

Вот на слове «паролей» я и притормозил.

Неприятная мысль

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

Полез читать, как эти штуки устроены. И почти везде одно и то же: ваш буфер обмена уезжает на сервер компании, там лежит, оттуда раздаётся на другие ваши устройства. Шифрование «по дороге» есть почти у всех - но на самом сервере данные лежат как есть. Открытым текстом.

То есть весь вопрос «читает ли кто-то мой буфер» сводится к «доверяю ли я этой компании». А я не хотел доверять на слово. Даже самому себе.

Что я в итоге сделал

Сел и написал свой сервис. Называется Copy Sync. Идея в одной фразе:

Сервер устроен так, что ему физически нечего у вас украсть.

Это не «мы обещаем не смотреть». Это «мы технически не можем посмотреть, даже если очень захотим». Разница примерно как между «сосед обещал не читать ваши письма» и «письмо вообще не попадает соседу в руки».

Как это работает на человеческом языке:

  • Ваш текст шифруется прямо на вашем устройстве, ещё до отправки.

  • На сервер уезжает уже не текст, а зашифрованная каша. Ключа от неё у сервера нет - ключ остаётся у вас.

  • Получатель (другое ваше устройство) расшифровывает кашу обратно у себя.

  • Сервер в этой схеме - просто труба. Он передаёт мешок, не зная, что внутри. Сами данные не хранятся - улетели и удалились.

Если кто-то завтра украдёт мой сервер целиком и заглянет в базу - он увидит столбец со случайным шумом. Ни паролей, ни ссылок, ни ключей. Их там нет не потому, что я их спрятал. Их там нет по конструкции.


Почему рассказываю, а не просто пользуюсь молча

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

И честно про минусы, без маркетинга: проект ещё сырой. Пока работает веб-версия, расширение для браузера и приложения на телефон - в планах. Пара важных штук по безопасности ещё не доделана. Это пет-проект одного человека, а не продукт корпорации.


Если интересно потыкать


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

А ещё расскажите: вы сами-то как ссылки между телефоном и компом гоняете? Неужели тоже «Избранное»?

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества