Идея использования блокчейна для обеспечения неизменяемости данных в учетных системах на платформе 1С:Предприятие выглядит крайне привлекательно. Владелец базы данных хочет доказать своему партнеру или проверяющему (аудитору), что информация не корректировалась "задним числом". Для этого создается последовательный журнал хэш-сумм документов, где каждый новый блок ссылается на хэш предыдущего. Проверяющий регулярно запускает программу проверки, сверяя хэши документов в базе с журналом.
Однако, так ли надежна эта схема в условиях, когда у владельца базы остаются полные административные права на СУБД и саму платформу 1С? Проанализируем технические нюансы этой задачи, разберем ключевые уязвимости "однобазового" приватного блокчейна и выясним, какими способами владелец может незаметно изменить данные в обход любой проверяющей программы.
Для начала разберем, как платформа 1С строит отчеты и балансы. Абсолютное большинство отчетов (оборотно-сальдовые ведомости, взаиморасчеты, остатки на складах) формируются не по реквизитам документов, а по записям в регистрах накопления, регистрах сведений или регистрах бухгалтерии. Документ в данном случае выступает лишь в роли регистратора.
Если алгоритм блокчейна хэширует только реквизиты и табличные части самих документов, то злоумышленник с полными правами может легко обойти эту защиту:
РегистрыБухгалтерии.Хозрасчетный или РегистрыНакопления.ВзаиморасчетыСКонтрагентами).Проведен, Дата, Номер и табличные части не меняются.Выясним причину, почему проверяющая программа не заметит подлога. Программа считывает данные документа, вычисляет хэш — он совпадает с сохраненным в блокчейне. Однако реальные движения, влияющие на баланс предприятия и расчет пени или долгов, изменены. Блокчейн-журнал остается валидным ("зеленым"), а финансовый результат в базе уже другой.
Даже если разработчик блокчейна попытается включить движения документов в хэш-сумму (как упоминается в обсуждении), в 1С всегда существует возможность записать движения по документу вообще без привязки к его проведению (например, ручной корректировкой движений) или использовать сторонние корректирующие регистры, которые не связаны с этим конкретным документом напрямую.
Рассмотрим подробнее, как хранятся ссылки в документах 1С. Любой реквизит типа "СправочникСсылка" (например, Контрагент, Номенклатура или Договор) физически представляет собой уникальный идентификатор (GUID/UUID) — шестнадцатеричную строку. В документ записывается именно этот UUID, а не текстовое наименование "ООО Поставщик".
Если при формировании хэша документа используется этот идентификатор, то возникает критическая уязвимость:
12345678-abcd-ef01-...). Документ хэшируется, блок закрывается.Контрагент по-прежнему ссылается на UUID 12345678-abcd-ef01-....При очередной проверке программа считает данные документа. Ссылка на справочник осталась неизменной, хэш-сумма сойдется на 100%. Однако в любых отчетах, печатных формах и актах сверки вместо надежного поставщика теперь будет фигурировать совершенно другое юридическое лицо. Данные подменены без нарушения цепочки блокчейна.
Если для защиты от этого попытаться хэшировать не UUID, а текстовые представления (наименования и реквизиты связанных справочников), система столкнется с проблемой "лавинного эффекта". При изменении названия обслуживающего банка в классификаторе или адреса контрагента мгновенно станут недействительными хэши тысяч старых документов, где использовались эти справочники, что парализует работу системы контроля.
Проанализируем ситуацию, когда владелец базы хочет изменить финансовый результат операции, не трогая сам первичный документ и его проводки. В типовых конфигурациях 1С (например, 1С:Бухгалтерия) для этого существует штатный механизм — документ ОперацияБух (ручная операция) с возможностью сторнирования движений.
Схема обхода выглядит следующим образом:
ОперацияБух текущей датой (например, 05.08.2019). В движениях этой операции он делает сторнирующую запись на сумму -90 000 рублей, указывая в качестве аналитики тот самый исходный документ реализации.ОперацияБух выглядит как абсолютно новая транзакция текущего периода. Цепочка блокчейна не нарушена, старые хэши сходятся.Однако конечный итог взаиморасчетов за июль поменялся. Проверяющий, ориентируясь на то, что "старые документы не менялись", пребывает в ложной уверенности, что июльские данные в безопасности. На самом деле их экономический смысл был полностью перекрыт новой операцией, которую легко пропустить в потоке новых документов.
Главный концептуальный недостаток приватного блокчейна в рамках одной базы данных — отсутствие распределенного консенсуса. В отличие от публичных сетей (Bitcoin, Ethereum), где блоки валидируются тысячами независимых узлов (нод), здесь база находится под полным контролем одного субъекта — владельца.
Если у владельца есть доступ уровня sa (System Administrator) к Microsoft SQL Server или PostgreSQL, на котором крутится база 1С, он может выполнить любую манипуляцию:
Как отреагирует проверяющая программа? При следующем запуске она обнаружит, что последний хэш (ключ Y), сохраненный ею при предыдущей проверке, теперь не совпадает с тем, что находится в базе. Казалось бы, подлог обнаружен. Но у владельца базы всегда есть весомый административный контраргумент:
"Вчера произошел сбой оборудования (или отключение питания/сбой СУБД). База данных повредилась. Мы были вынуждены восстановить её из бэкапа трехдневной давности и заново перепровести документы за эти дни. Естественно, хэши пересчитались. Вот официальный лог технической службы."
Математически доказать, что изменение хэш-цепочки было вызвано умышленным подлогом конкретных цифр, а не техническим сбоем и восстановлением из резервной копии, в условиях централизованного администрирования невозможно.
Проверяющая программа не работает с "воздухом", она должна считывать данные из базы владельца. Обычно это происходит через HTTP/веб-сервисы, COM-соединение или прямое чтение таблиц СУБД. Владелец, контролирующий инфраструктуру, может настроить систему так, чтобы она отдавала проверяющему "виртуальную реальность":
В итоге программа проверки видит идеальную картину: хэши совпадают, документы не менялись. В то же время реальные пользователи владельца базы, его менеджеры и отчеты работают с новыми, измененными данными. Это классический пример атаки "двойного дна", от которой локальная проверяющая программа защитить не способна.
Приватный блокчейн на одной базе данных без распределенного консенсуса — это полезный инструмент для защиты от случайных ошибок операторов, но он не является гарантией защиты от умышленного взлома со стороны администратора системы. Любые криптографические цепочки хэшей бессильны, если злоумышленник контролирует среду исполнения кода (платформу 1С) и среду хранения данных (СУБД).
Чтобы сделать систему действительно прозрачной, необходимо: