File Validator

К списку новостей

Сервис доказательства валидности файлов на базе технологии блокчейн, с использованием Emercoin NVS.

 

Проблема

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

 

Существующие решения

Существует несколько способов валидации (проверки корректности) полученных файлов. Рассмотрим наиболее популярные из них.

1. Проверка антивирусом

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

2. Подпись SSL-сертификатом

Наиболее популярный способ валидации файлов в Windows. В этом случае бинарный файл подписывается цифровой подписью разработчика и проверяется системой перед инсталляцией. Способ технически хорош, но мало применим для индивидуальных разработчиков программ или малых коллективов, в силу сложности и дороговизны получения и обновления сертификатов, что ограничивает его применение только крупными корпорациями. Кроме того, способ уязвим против компрометации CA (вспомним DigiNotar).

3. Хеш-сумма на сайте разработчика

В силу дороговизны и сложности поддержки механизмов подписи [2], многие разработчики ПО (особенно свободного ПО) применяют хеши файлов, размещённые на сервере разработчика, например:

https://bitcoin.org/bin/bitcoin-core-0.20.0/SHA256SUMS.asc

https://www.freebsd.org/releases/12.2R/checksums/CHECKSUM.SHA256-FreeBSD-12.2-RELEASE-arm64-aarch64.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 г.

К списку новостей