Читая очередную новость об успешной подмене злоумышленниками кода крупного проекта, сам собой возникает вопрос: как вообще такое возможно, если код был подписан!? Пренебрежение правилами безопасности в криптосфере – оксюморон и, одновременно, факт, поэтому, чтобы данная статья не превратилась в избиение лежачего, я отобрал для анализа не новичков, а криптовалюты с вершины рейтинга CoinMarketCap. И, как вы уже догадались, не зря.
Давайте посмотрим как обстоят дела с применением цифровой подписи в оплоте финтех революции.
Мотивация
Как вы, скорее всего, знаете взломы официальных сайтов и github-профилей криптопроектов происходят достаточно часто, через которые распространяется вредоносный код. Иногда подменяются адреса кошельков, в других случаях подменяется распространяемое ПО. Способы взлома различаются: происходит атака на один из узлов сети, ответственный за доставку данных и производится скрытая подмена фрагмента данных. Обнаружить подмену визуально достатчно сложно, чем и пользуются злоумышленники. Защититься от такой атаки можно несколькими способами. Стандартным считается PGP-подпись: публикация подписанных проверочных сумм. При этом PGP-ключ должен быть распространен надлежащим образом. Например опубликован на различных ресурсах (желательно больше двух).
Анализ
Для анализа я использовал официальные ресурсы, ссылки на которые получил из разных источников. После чего начал собирать информацию двигаясь с разных направлений. При анализе учитывалась публикация как пользовательского ПО, так и SDK. Для анализа не брались токены или основанные на смарт-контрактах проекты, только криптовалюты.
Результаты
Проект | Результат |
---|---|
Bitcoin Core | публикация ключа и кода в одном источнике |
Ethereum Geth | публикация ключа и кода в одном источнике |
Ethereum SDK | нет подписи |
Parity | нет подписи |
XRP | - |
Litecoin | публикация ключа и кода в одном источнике |
Cardano Daedalus | нет подписи |
Cardano | нет подписи |
Stellar | неопубликованы ключи |
Stellar SDK | неподписанные релизы, подпись неопубликованными ключами |
IOTA IRI | нет подписи |
IOTA Wallet | нет подписи |
Tron Core | нет подписи |
Tron Wallet | нет подписи |
Neo Gui | нет подписи |
Neo Cli | нет подписи |
Monero | публикация ключа и кода в одном источнике |
Dash Core | публикация ключа и кода в одном источнике |
Dash Electrum | нет подписи |
NEM Nano Wallet | нет подписи |
NEM NIS | неопубликованы ключи |
Ethereum Classic | * |
Qtum Core | нет подписи |
Zcash | неподписанные релизы |
( * ) Ethereum Classic использует сторонее ПО и не публикует информации для подтверждения релиза.
Типичные ошибки
- Отсутствие подписи как таковой (10/15):
Неподписанным может оказаться как код исполняемого кода, но чаще встречаются неподписанные библиотеки и прикладное ПО вроде кошельков. - Подпись неопубликованными ключами (2/15):
Код подписывается несколькими разработчиками, ключи которых нигде не опубликованы, а соответственно такие подписи бесполезны. - Публикация ключей и кода в одном источнике (5/15).
Очень частой ошибкой является публикация ключей по ссылке на стороннем ресурсе, либо создание единого доверенного источника в виде сайта. Таким образом для подмены данных достаточно взломать только сайт.
Нетипичные ошибки
Monero предлагает смотреть ключи в папке с подписанными данными. По сути это ошибка дистрибуции ключа, которая приводит к полной утрате надежности.
На заметку!
- Litecoin публикует ключи в том числе и в виде ссылки на доверенный ресурс pgp.mit.edu.
- Ethereum и Zcash публикуют подробные списки ключей:
- Ethereum публикует ключи CI-сервисов.
Причины
- Отсутствие единой стратегии. На сегодня нет инструкции, которая подходила бы большинству разработчиков для решения задач обеспечения гарантированной доставки кода на разных платформах. Велика доля самодеятельности.
- Моральное устаревание. Если взглянуть на основные сайты технологии PGP, то складывается впечатление, что технология пребывает в забвении:
- Отсутствие комплексного инструментария для публикации и проверки подписи. Даже при наличии желания пользователь столкнется с серьезными препятствиями на пути – многие пользователи не умеют и не готовы использовать консоль обязательную для проверки подписи. Даже для разработчиков использование подписи является нетривиальной задачей.
- Устаревший протокол обмена ключами. В 21 веке, когда разработчики практически не встречаются лично, устраивать обмен ключами на p2p основе становится не слишком удобно и нужны инструменты для более быстрого распространения и отзыва подписи.
Советы
Лучшие советы в данной ситуации:
- Разделять ключи по задачам (это поможет избежать утечки мастерключа или использования ключа разработчика для подписи релиза).
- Дублировать информацию в нескольких источниках, например на официальном сайте и на Github (взломать два ресурса одновременно сложнее чем один).
- Формировать человекочитаемые url (их легче запомнить и проверить).
Инструкция
Если вы еще не используете PGP-ключи, настоятельно рекомендую включить заверение подписью в рабочий процесс, даже если вы не разрабатываете финансовые проекты, этот навык лучше довести до автоматизма до того как он вам понадобится. Для старта достаточно от силы часа времени, зато получаемое потом удовольствие не поддается измерению.
- Скачиваем ПО для управления ключами:
- Генерируем ключ:
> gpg2 --gen-key
- Получаем отпечаток ключа:
> gpg2 --fingerprint user@localhost gpg: checking the trustdb gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u gpg: next trustdb check due at 2020-07-01 pub rsa2048 2018-07-02 [SC] [expires: 2020-07-01] E5F1 2C73 045F 1E85 302D A9D5 269E 7C5E B852 68BB uid [ultimate] User <user@localhost> sub rsa2048 2018-07-02 [E] [expires: 2020-07-01]
- Добавляем ключ в git (см. stackoverflow):
> git config user.signingkey E5F12C73
- Подписываем коммиты с добавлением ключа -S:
> git commit -S -m 'Signed commit'
Экспортируем ключ:
> gpg2 --armor --export user@localhost -----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFs6VDsBCADzd5F4jaJr7Dzp11+h5CmnRNHGSTWOMQe+TSXljR351BCF9hS6 VrIizaPCVkLW/ATsqdf6vZEApvbQplwHecFPwMpFhusTOILk7lsuXm8w5CscqgBo KiZdSBa9bpWmFrSsPgD8/2VMlQdh+3uChOKapsLo7cHKXNuWX8b1L30twNwgavMc Sel/3clO7Bwp9cFftyktsM/HtSUu1oaE//dibS60HzwmscPHsIIoYsfUSCEOj08f DwK2vLbPilYKyE7fONJpXCSPk5pfDnNxzdFWylNBTQL8benhCtSyfabbtHmeywe+ VWfRAGf/BRjjb7meAMX5vO6qh1l4FfHVo7irABEBAAG0FVJ1bWtpbiA8c3BhbUBy dW1rLmluPokBVAQTAQgAPhYhBOXxLHMEXx6FMC2p1SaefF64Umi7BQJbOlQ7AhsD BQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJECaefF64Umi7e4kIALs2 0wbQ0g5557cIbN/eXeK+DsyZFyp3D95RoOnLgWiDknVBluRyPY1QFkjKgNNepMNr 7TM1eNev1CcSDLkuUxlLMrDH9AsAIVWFl7v1+/npJuHkazylU2DgssWICF0yKgWZ tzOQUEDwX7xwIJ3g5v44Lymq0hPi56FVv+rq15hkNsqIOyjDQNVGROUURyO/+vUP khOa2ryjWCpdBzoRNxSyVMlyoABLHwTfXDkCFHV9T7bOa/o0GqILOZ7wCBN9tT5C 38ellwu/HTCtmzZsWvl3a6g8JcunB9yV3RZFQgUDvLEjiVoY2qqn/SWgcl6QR2Ro aEwTKk/p3PU1Foz7mEC5AQ0EWzpUOwEIAPbKGT/xzJ9JvXhMyoOGQZNWkqyXKtV4 zVdfdjxkWMrsMD/C2K1CQ5HPafTM9G/kATGCAmoFPCdLwrc9QqOw3H8PNxnph3Ca irvp0ICj6KDiuCCuptJYICzllKriyLhUDyFkb7GPpRgHpKJZMVCkRbDEau3jcJEx jsdUnjf3gDpEnkuV1pwSxGFxTV3vHNQBqGbFG8mjVkfZSnB++e+tyKPhC5X0QFue K2AlHbnj0/uXZ9wYfRTOJsbW6myR0k1edo7Y5P93fhpW49wwaMTe2Q9p+m6zRguf 8vC9sGUB/eGD9+6OwtIZJ6ZlUa8/MYUBr9er/z+hl7ApdpibChCb8lUAEQEAAYkB PAQYAQgAJhYhBOXxLHMEXx6FMC2p1SaefF64Umi7BQJbOlQ7AhsMBQkDwmcAAAoJ ECaefF64Umi7e3UIAO9ixyXaKmsfWVB11tYPHP+9Xo2s0RRanNMyqAcp1se3jQBZ Z7gfr7DBFBFPU0KeOibWXysMz54hXImxDgYQPKFznzKB5463DiZt8pYjxdphX4/j m6ccw1GnpImRJHpu3mMPSItd/QDqEl87KqSw+IojaLDid3QeL0uRzi2k5/Jwz6ru QMCwdKIMBDPw936YOsfHjQx1RTY9NC59cW1i0lU813By1J80hd24aIJH5vVyYI/I suz153mZUZ+dmN0F6wfnuqNzeCfJRoHKh45ABDD3cRQ2kE76UQ4Kr0xb0G512yUO WJFT8ff3EWn1FulR7bmprA4HHACyx/otL7P777E= =zi5u -----END PGP PUBLIC KEY BLOCK-----
- Копируем результат и добавляем в доверенные ключи в интерфейсе Github, Gitlab или Bitbucket.
Заключение
Сегодня инфраструктура доставки кода страдает детскими болезнями: фрагментацией, отсутствием устоявшихся практик, софтом не отвечающим реалиям, а разработчики даже крупных проектов находящихся под пристальным взором тысяч глаз умудряются допускать в том числе и простейшие ошибки, когда дело касается безопасности. Поэтому доверяй, но проверяй %username%!
Комментарии (6)
lorc
03.07.2018 19:12Устаревший протокол обмена ключами. В 21 веке, когда разработчики практически не встречаются лично, устраивать обмен ключами на p2p основе становится не слишком удобно и нужны инструменты для более быстрого распространения и отзыва подписи.
[irony] PKI? [/irony].
Вопрос как обычно в доверии. И в паранойе. Согласны ли вы подписать ключ друга, если он продиктует fingerprint по телефону? А если пришлет его через телеграм? Через обычный e-mail? Будете ли вы доверить другим ключам, подписанным вашим другом? А если это не друг, а просто знакомый с конференции?rumkin Автор
04.07.2018 16:37PKI на блокчейне, почему нет? (в варианте без единого CA).
На доверие взгляды разные, а решение зависит от задачи и применения. Если наработать большую практическую базу, то и решение найдется.
lorc
04.07.2018 17:07Единого CA нет и сейчас. Чем и спасаемся, собственно говоря. Если бы существовал всего один монопольный CA — мы бы жили в ужасном мире.
Блокчейн — это такая распределенная БД, которая, благодаря своему дизайну не допускает внесений изменений задним числом.
Текущие сети доверия (Web of Trust) тоже в общем распределены и не позволяют вносить изменения задним числом. В том смысле что я не могу сгенерить новый ключ и волшебным образом получить подписи от других ключей.
PKI в блокчейне ничем не будет отличаться от простого PKI. Мы либо доверяем конкретно этому CA, либо не доверяем.
click0
Вы хоть сами разберитесь с серверами.
Их много, они синхронизируются между собой, технология отказоустойчивая.
Вот их статистика.
rumkin Автор
Заменил
На
Смысл в том, что у новичков нет мотивации инвестировать время в технологию, которая выглядит устаревшей.
click0
Если новичек технический дилетант, то перед инвестированием он должен заказать техническую экспертизу.