Сервис доказательства валидности файлов на базе технологии блокчейн, с использованием Emercoin NVS.
Проблема
В настоящее время остро стоит проблема вредоносных файлов. Скачавши программу из сомнительного источника и без надлежащих проверок, пользователь рискует получить в свой компьютер программу самого широкого спектра вредоносности – от сравнительно безобидного майнера Monero, подворовывающего ресурсы компьютера, до криптолокера-вымогателя.
Существующие решения
Существует несколько способов валидации (проверки корректности) полученных файлов. Рассмотрим наиболее популярные из них.
1. Проверка антивирусом
Способ позволяет обнаружить уже известные зловреды, но с высокой вероятностью упускает новые, специально ориентированные на обман антивирусов. Способ, несмотря на несомненную пользу, всё-таки явно недостаточен для надёжной защиты пользователей.
2. Подпись SSL-сертификатом
Наиболее популярный способ валидации файлов в Windows. В этом случае бинарный файл подписывается цифровой подписью разработчика и проверяется системой перед инсталляцией. Способ технически хорош, но мало применим для индивидуальных разработчиков программ или малых коллективов, в силу сложности и дороговизны получения и обновления сертификатов, что ограничивает его применение только крупными корпорациями. Кроме того, способ уязвим против компрометации CA (вспомним DigiNotar).
3. Хеш-сумма на сайте разработчика
В силу дороговизны и сложности поддержки механизмов подписи [2], многие разработчики ПО (особенно свободного ПО) применяют хеши файлов, размещённые на сервере разработчика, например:
https://bitcoin.org/bin/bitcoin-core-0.20.0/SHA256SUMS.asc
Проблема этого способа валидации состоит в том, что источник файла и источник проверочной информации связаны (находятся на одном сайте). И в случае захвата сайта злоумышленником, или создания подложного сайта, или атаки “MIM”, злоумышленник подменит как бинарную программу, так и соответствующий ей файл хешей (или сделает его недоступным), и такая защита будет скомпрометирована. Кроме того, этот механизм проверки не стандартизирован, и если пользователь получил файл из торрент-сети или какого-то сайта с драйверами (а такое часто бывает, что драйвер нужного устройства можно найти только на сторонних сайтах), то совершенно непонятно, где искать хеш-суммы, можно ли верить найденным, как их применять к скачанному файлу, и вообще, создавались ли эти хеш-суммы хоть когда-либо.
Предлагаемое решение
Предлагаемая система подобна рассмотренной выше системе [3], но принципиальное отличие состоит в том, что здесь блокчейн Эмеркоин выступает в качестве хранилища и доверенной среды распространения контрольных хеш-сумм файлов.
Применение блокчейна решает обе проблемы системы [3]:
- Блокчейн является независимым каналом распространения хеш-сумм, в котором хеш-суммы файлов передаются заранее, до скачивания собственно файла, и следовательно – пользователь получит верные суммы задолго до возможной атаки. В результате, подмена или отказ в предоставлении проверочной информации становятся невозможными.
- Данные обо всех файлах хранятся в единственном хранилище - блокчейне, что позволяет сделать универсальный стандартизированный механизм поиска этих сумм и последующей валидации файлов, созданных разными издателями, и полученных из различных источников.
Кроме того, по сравнению с решением [2], здесь возможно получить и проверить подписи нескольких удостоверяющих агентов (валидаторов), тогда как в системе [2] файл можно подписать только одним сертификатом, принадлежащего единственному удостоверяющему агенту.
И наконец, цена использования предлагаемой системы близка к нулю, что делает её по-настоящему демократичной, то есть доступной широким массам разработчиков, включая и частных лиц.
В предлагаемой системе существуют три роли:
- Издатель. Тот, кто создаёт и распространяет файл. Это может быть разработчик программного обеспечения, автор документа или любого другого файла.
- Валидатор. Он же – удостоверяющий агент. Этот участник подписывает файлы для издателя, и тем публично заверяет, что “файл верный, я за него отвечаю”. В проcтейшем и наиболее распространённом случае, издатель и валидатор – один и тот же агент. В свободном ПО так обычно и происходит – например, Bitcoin Wallet из примера [3] выше подписывают сами же издатели. Тем не менее, в предлагаемой системе эти роли могут быть разделены, и, например, валидатор “издательский дом” может своей подписью удостоверить документ, издаваемый каким-либо независимым автором.
- Пользователь. Тот, кто получает файл, и желает убедиться, что он получил именно тот файл, который распространяет издатель. Например, пользователь скачал программу из торрентов и желает убедиться, что в неё “по дороге” не добавили какого-либо зловреда. Для этого, пользователь проверяет цифровые подписи валидаторов для данного файла, и на основании доверия к валидаторам (их может быть и несколько для одного и того же файла) принимает решение, верить ли валидаторам, и что делать с данным файлом.
Как это работает
Рассмотрим работу системы на реальном примере. Пусть есть издатель Emercoin, который сам себе валидатор (простейший случай). Издатель выпустил бинарный файл-инсталлятор кошелька Emercoin для Windows, имя файла: emercoin-0.7.10-win64-setup.exe.
Издатель
Издатель Emercoin желает воспользоваться предлагаемой системой FV для того, чтобы пользователи могли проверить полученный бинарный файл и убедиться, что они получили именно то, что распространяет издатель.
Для этого он хеширует файл алгоритмом sha256 (система предполагает смену алгоритма при необходимости), и получает хеш файла:
169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Издатель на основе хеш-суммы создаёт поисковое имя, которое будет выступать ключом в Emercoin NVS:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Здесь:
- fv: Префикс сервиса, File Validator
- sha256: алгоритм хеширования (дефолтный sha256, но возможна в будущем замена на другие алгоритмы)
- hex-строка: хеш-сумма файла.
После этого, издатель передаёт файл для проверки и подписи валидаторам, которых выбирает сам. В нашем примере, сам разработчик и выступает в качестве валидатора.
Валидатор
Валидатор имеет в Emercoin NVS уникальное имя, с которым связан Emercoin address. Имя имеет префикс сервиса “val:”, и может содержать только латинские символы нижнего регистра, а также точку и минус. То есть разрешённое множество символов: [a-z.-]. Пробелы, табуляции, спецсимволы или символы национальных кодировок также запрещены. Это ограничение призвано заблокировать манипуляции, позволяющие создавать внешне похожие имена валидаторов и от их имени подписывать всякое. Типичный пример такой манипуляции – внешне похожие, но отличающиеся имена: paypal - paypaI – paypa1.
Например, имя валидатора olegarch – корректное, а имя o1egarch – некорректное, так как содержит цифру 1.
В нашем примере, валидатором выступает Emercoin, владеющий NVS-именем val:emercoin
связанным с адресом: EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX
На основании полученного файла, валидатор создаёт поисковое имя аналогично тому, как это сделал издатель. После этого издатель создаёт строку для подписи:
emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Здесь:
- emercoin: NVS-имя валидатора.
- 100: Уровень доверия (зарезервировано для дальнейшего использования).
- fv..f6: поисковое имя, аналогичное таковому у издателя.
Эту строку валидатор подписывает командой signmessage в своём кошельке адресом EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX, связанным с именем валидатора val:emercoin:
signmessage EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX em..f6
Полученную цифровую подпись IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
валидатор передаёт издателю.
Издатель, получив подпись от валидатора, создаёт и публикует в блокчейне NVS-запись, где в качестве имени выступает поисковый ключ, а value содержит строку с подписью:
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
Здесь:
- SIG=: Префикс, специфицирующий цифровую подпись.
- emercoin: NVS-имя валидатора.
- 100: Уровень доверия (зарезервировано для дальнейшего использования).
- IH..E=: цифровая подпись валидатора.
Value может содержать несколько строк-подписей и другие строки, содержащие произвольную информацию о подписываемом файле. Например, реальная NVS-запись о нашем файле имеет структуру:
Name:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Value:
Emercoin core wallet, full node
File: emercoin-0.7.10-win64-setup.exe
Download: https://emercoin.com/en/for-coinholders#download
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=
Здесь мы видим, что информация о файле содержит подписи от двух валидаторов – emercoin и olegarch.
Пользователь
Пользователь, получив файл из недоверенного источника, желает убедиться, что данный файл – именно тот, который опубликовал издатель. Для этого он предпринимает следующие действия:
Хеширует файл, и получает его хеш sha256, например командой:
$ sha256sum emercoin-0.7.10-win64-setup.exe
169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a emercoin-0.7.10-win64-setup.exe
На основании полученной хеш-суммы пользователь формирует поисковое имя аналогично тому, как это делал издатель (см выше):
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Извлекает из Emercoin NVS информацию о полученном файле, посредством команды name_show:
name_show fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
{
"name": "fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a",
"value": "Emercoin core wallet, full node\nFile: emercoin-0.7.10-win64-setup.exe\nDownload: https://emercoin.com/en/for-coinholders#download\nSIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=\nSIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=",
"txid": "a22fa9b5ac1725d30e6e6dc9bb2038b0a0afbe362031eb8b9d9a4392e0cc46ff",
"address": "EfsrojhfLGf6LPYRFytiaGRVwYmQ9KsWN5",
"expires_in": 957918,
"expires_at": 1391644,
"time": 1598137455
}
Из полученного результата, извлекает строки с подписями:
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=
Пользователь верифицирует все или выборочно некоторые подписи следующим образом:
- Из строки извлекает имя валидатора, в нашем примере emercoin.
- Посредством запроса name_show на val:emercoin, получает EMC-адрес, связанный с этим именем: EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX.
- Извлекает из строки подпись валидатора IH..e=
- Формирует строку для подписи аналогично тому, как это делал валидатор:
emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
- Запросом verifymessage пользователь проверяет достоверность подписи:
verifymessage адрес подпись строка_для_подписи
В нашем примере – это
verifymessage EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE= emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
- Получив результат проверки, пользователь принимает решение, что делать с проверяемым файлом.
Как этим пользоваться
Выше, в разделе “как это работает”, был предоставлен пошаговый алгоритм как генерации и публикации подписей, так и проверки файлов. Понятно, что вручную все эти операции делать сложно, особенно для конечного пользователя. Поэтому для практического применения мы написали программу fv.php, которую можно скачать из репозитория Emercoin:
Эта программа также является “референтной имплементацией” рассмотренных выше алгоритмов, и может быть использована в качестве практического примера для написания аналогичной программы или для интеграции системы FV в менеджеры пакетов или другие программы и сервисы.
Программа изначально написана для Linux/FreeBSD, но может быть запущена и из командной строки Windows, например в соответствии с инструкцией:
https://stackoverflow.com/questions/12870880/run-php-file-in-windows-command-prompt-cmd
После скачивания, в программе необходимо отредактировать URL для подключения к локальному кошельку, установив там актуальные параметры username/password/port:
$emcCONNECT = "http://user:secret_pass@localhost:6662";
Также, возможно, для Windows надо удалить первую строку файла, специфицирующую интерпретатор:
#!/usr/bin/php
Использование программы
Тестирование
Вначале, надо убедиться, что программа запускается без ошибок и корректно подсоединяется к кошельку Emercoin:
$ ./fv.php -getinfo
В случае, если установка актуальных параметров произведена верно, то программа напишет результат getinfo, и можно приступать к дальнейшей работе.
Проверка файла
Для этого надо запустить программу с единственным параметром - именем файла, и она проведёт весь процесс валидации.
$ ./fv.php ./emercoin-0.7.10-win64-setup.exe
File info from NVS:
Emercoin core wallet, full node
File: emercoin-0.7.10-win64-setup.exe
Download: https://emercoin.com/en/for-coinholders#download
Validation results:
emercoin/EMERCOIN [Emercoin File Validator] created 2020-08-20 05:08; Signature PASSED
olegarch/OLEGARCH [Oleg Khovayko FV] created 2020-08-20 02:08; Signature PASSED
В примере выше программа сообщает время создания NVS-записи для данного файла (слишком свежие записи для старых файлов могут вызвать подозрение), а также результаты проверок подписей. Здесь видно, что для данного файла подписи от обоих валидаторов проверки прошли успешно, и файл не содержит неавторизированных изменений.
Генерация подписи валидатора
Для генерации подписи, Ваш кошелёк должен содержать NVS-запись валидатора, и быть полностью разблокированным.
Для генерации подписи, необходимо указать программе имя файла, и строку, содержащую имя валидатора и уровень доверия (насколько валидатор доверяет издателю файла). Второй параметр надо взять в кавычки, иначе интерпретатор командной строки будет интерпретировать символ “|” как shell pipe.
Пример запуска и результат:
$ ./fv.php ./emercoin-0.7.10-win64-setup.exe 'olegarch|100'
FV signature for upload to NVS FV-record:
NVS Key:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Signature line:
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=
В качестве результата, программа возвращает NVS-key и подпись для передачи издателю. Издатель может загрузить эти параметры в NVS, или же скомбинировать в value подписи от нескольких издателей.
Дальнейшие планы
Система была изобретена недавно, и реализована в минимальном объёме. Тем не менее, уже сейчас достаточном для практического использования.
Но мы не останавливаемся, и предполагаем развивать систему в следующих направлениях:
- Сделать сервис валидации онлайн, и тем самым дать возможность валидации пользователям, не имеющим локального кошелька Emercoin Core. Да, мы понимаем, что это – передача доверию внешнему сервису, что значительно снижает уровень доверия к системе. Однако, для пользователей, которые ценят удобство превыше безопасности, это решение может быть приемлемо.
- Добавить валидатор в GUI Emercoin Core, в раздел Manage Names.
- Рассмотреть идеи “цепочек валидаторов”, когда один валидатор подписывает другого. Мы понимаем, что это резко усложняет систему и делает её непрозрачной, но возможно, для каких-то целей это будет полезно.
Автор: Олег Ховайко 2020 г.