AI-система автоматического обнаружения уязвимостей в смарт-контрактах

Найденная после запуска уязвимость — это замороженные активы, потерянное доверие и срочные правки в спешке. Мы разрабатываем AI-систему, которая разбирает смарт-контракты до релиза и подсвечивает рискованные места, а не только формальные ошибки. Внедряем под ключ: от первого разбора до передачи правил и регламента прогонов вашей команде.
Часто задаваемые вопросы

AI-разбор уязвимостей смарт-контрактов и слепые зоны аудита

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

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

Solidity добавляет свой пласт: наследование, контракты-посредники и делегирование скрывают реальные права за цепочкой вызовов, а данные из внешних источников меняются между проверкой и использованием. Ошибка логики контракта чаще всего проявляется именно здесь — условие верно в момент чтения и перестаёт быть верным к моменту записи.

Находки мы разделяем по классам — обход прав, повторный вызов, манипуляция внешними данными, ошибка логики — и для каждого описываем, воспроизводится ли он на тестовой сети и как закрывается правкой. Дальше смотрим, что именно проверяется автоматически, а что остаётся за инженером.

Что даёт непрерывная проверка кода перед каждым релизом

Непрерывная проверка кода встроена в конвейер сборки и запускается на каждом значимом изменении, а не в конце цикла. Разбор идёт по двум линиям: статический анализ дерева вызовов на актуальной ветке Slither и прогон сценариев на инварианты в изолированной сети. Находка приходит с трассировкой вызова и минимальным воспроизведением — её подтверждают или опровергают, а не спорят о формулировке предупреждения.

Что это меняет по пунктам:

  • Снятый класс отказов. Повторный вход, ошибки прав доступа и переполнения отсекаются до сборки релизной ветки — выкатить их в основную сеть уже нельзя.
  • Разбор перед релизом. Отчёт по изменениям приходит к ревью, а не через неделю после выкладки, поэтому правки попадают в тот же цикл.
  • Управляемый поток находок. Критичное поднимается наверх, дубликаты схлопываются, шум отсекается правилами — вместо лавины перед запуском команда получает очередь с приоритетами.
  • Срок выпуска релиза. Проверка идёт параллельно разработке, и финальный разбор перестаёт быть отдельным этапом ожидания.
  • Меньше ручных прогонов. Автоматика закрывает типовые проверки, ручной разбор остаётся на логику экономики протокола и права управления.

Политика проверок живёт в репозитории: набор правил, порог блокировки релиза и история решений по каждой находке. Доля изменений, проверенных до релиза, и число находок на релиз видны в отчёте — качество перестаёт обсуждаться на словах.

Режимы проверки кода: разовый аудит и непрерывный контур

Ни один режим проверки не даёт полной картины сам по себе — они закрывают разные классы дефектов. Разовый аудит контракта ловит логические ошибки, которые не описываются шаблоном, но к следующему коммиту его выводы устаревают. Непрерывный контур проверки срабатывает на каждое изменение, зато видит только то, что удалось формализовать правилом или сценарием. Выбор зависит от того, где контракт в жизненном цикле и какова цена ошибки.

Подход Когда подходит Ограничения
Разовый ручной аудит перед заморозкой логики и выводом в сеть, когда права доступа и выплаты нестандартны результат живёт до первого изменения, проверку нужно проводить заново
Статический анализ постоянная проверка на каждом коммите: переполнения, повторные вызовы, небезопасные внешние обращения часть срабатываний ложная, порядок вызовов между контрактами не виден
Прогон сценариев ветвления экономики: ликвидации, аукционы, граничные суммы, редкие последовательности вызовов покрытие зависит от заложенных путей — непроверенный путь остаётся дырой
Формальное доказательство свойств инварианты ядра: сходимость балансов, недоступность вывода после блокировки требует явной формулировки свойств и не покрывает внешние зависимости

Как режимы сочетаются

На каждом коммите идёт статический анализ, сценарии крутятся в ночном прогоне, для ядра доказываются свойства, а ручной аудит подключают перед крупным релизом или сменой модели доступа. Дешёвые проверки отсекают массовые дефекты, дорогие — достаются участкам, где ошибка стоит дороже всего.

Как проходит внедрение: шаги от аудита до передачи

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

  1. Аудит кода контрактов. Собираем перечень контрактов, их версии, связи между ними, права ролей и внешние вызовы. На выходе — карта того, что вообще нужно проверять.
  2. Схема контура проверки. Определяем, где запускается анализ: на каждом изменении, перед слиянием ветки или по расписанию для уже развёрнутых контрактов.
  3. Настройка правил. Включаем проверки под предметную логику: управление доступом, работа с внешними вызовами, порядок изменения состояния. Нерелевантные правила отключаем, чтобы не создавать шум.
  4. Тестовые сценарии. Прогоняем контур на исторических релизах и на намеренно внесённых ошибках — видим, что он ловит, а что пропускает.
  5. Разбор ложных срабатываний. Каждое спорное срабатывание размечаем с вашей командой: подтверждённая проблема, допустимый паттерн или пробел в правиле. По итогам правила корректируются.
  6. Встраивание в процесс разработки. Проверка становится обязательным шагом перед выпуском, с понятным статусом и порогом, при котором релиз блокируется.
  7. Передача документации и обучение. Отдаём описание контура, набор правил с обоснованием, инструкцию по разбору находок и проводим обучение команды.

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

Артефакты передачи: правила, схемы и регламент прогонов

Передача контура — не итоговый отчёт, а набор артефактов, которые остаются в вашем репозитории и работают без нас. Если команда не может сама запустить проверку, разобрать находку и объяснить происхождение результата, работа не закрыта.

  • Карта ролей и прав доступа: кто запускает прогоны, кто подтверждает находку, кто правит правила разбора, кто видит только отчёты. Права выдаются группами — персональных бессрочных доступов не остаётся.
  • Схема архитектуры: компоненты контура, границы доверия и точки, где исходники контрактов покидают ваш периметр и как результат возвращается обратно.
  • Конфигурации разбора: файлы правил, пороги срабатывания и список подавленных предупреждений с обоснованием — всё версионируется вместе с кодом.
  • Регламент прогонов: что запускает проверку (изменение кода, подготовка релиза, регулярный прогон), глубина, ожидаемое время и поведение контура при сбое.
  • Набор проверочных сценариев: контракты с известными дефектами, по которым видно, что после доработок контур не начал пропускать то, что ловил раньше.
  • Порядок разбора находок: уровни критичности, срок реакции на каждый, кто принимает решение и как фиксируется вердикт «берём в работу» или «ложное срабатывание».
  • Документация по контуру: как обновлять правила, что делать при смене инструментов сборки и куда смотреть в журналах при расхождении результата.

Кейс: разбор кода перед запуском вместо аудита по факту

Заказчик — команда, выпускающая протокол со смарт-контрактами, где ошибка в логике переводов стоит потери средств без возможности отката. До внедрения проверки шли по факту: аудиторы подключались к замороженному коду за несколько дней до релиза, а между аудитами разработчики вливали изменения без автоматической проверки. Отчёты приходили пачками предупреждений, значительная часть которых оказывалась ложной, и через пару недель их перестали читать.

Мы собрали контур, который работает на каждом изменении. Ядро — анализатор Slither, дополненный моделью, обученной на размеченных находках конкретно этого проекта: она ранжирует предупреждения по вероятности реальной эксплуатации и отсекает шаблонный шум. Вердикт по коммиту приходит в запрос на слияние до ревью, а не после слияния.

Метрики до и после

Доля уязвимостей, снятых до релиза, выросла с примерно половины до 92% — остальное попадает в план правок, а не в инциденты. Доля ложных срабатываний упала с 60% до 12%, поэтому на отчёт смотрят, а не игнорируют его. Время от коммита до вердикта по изменениям сократилось с получаса ручного разбора до 6-8 минут автоматического прогона.

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

Чем AI-разбор отличается от правил и сигнатурного поиска?

Сигнатурный поиск и правила работают на разборе кода в дерево и поиске известных шаблонов: вызов внешнего адреса до изменения состояния, необработанный результат вызова, проверка прав по источнику транзакции. Там, где класс уязвимости укладывается в шаблон, подход даёт точный и объяснимый результат — находку можно показать на конкретной строке и конкретном пути исполнения.

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

AI-разбор кода снимает это ограничение иначе: модель обучается на разметке находок — подтверждённых и опровергнутых. Она учится отличать срабатывание, которое инженер закрыл как ложное, от реального пути к использованию уязвимости, и ранжирует вывод по вероятности. Быстрый первичный проход по известным классам даёт Slither — модель дорабатывает то, что в шаблон не уложилось.

На практике связка выглядит так: правила дают дешёвое покрытие известных классов, формальные методы — доказательства на критичных участках, модель снимает основную нагрузку по ложным срабатываниям. Доля находок, которые уходят в отчёт без ручной перепроверки, растёт — именно она определяет, сколько времени занимает разбор перед выпуском контракта.

Вопросы, которые задают инженеры перед стартом

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

Сколько будет ложных срабатываний?

На первом прогоне порог смещён к полноте: лучше лишняя находка, чем пропуск. Дальше фильтр настраивается на ваших контрактах, и каждое срабатывание идёт с фрагментом кода и уровнем уверенности.

Контракт уже развёрнут — есть ли смысл в проверке?

Разбор идёт по опубликованному коду и байткоду: права владельца, доступные функции, приём внешних вызовов. Так видно, чем рискует именно развёрнутая версия.

Как проверять обновляемые контракты?

Разбор не разовый: новая реализация проходит те же проверки до публикации, между версиями сравниваются логика и хранилище. Иначе правка тихо открывает то, что было закрыто.

Куда передавать приватный код?

В публичные сервисы его выкладывать не нужно: разбор в изолированном контуре, доступ по ролям, результаты остаются у вас. Порядок работы и удаление копий фиксируем письменно.

Как встроить проверку в конвейер сборки?

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

Обсудим задачу и вернёмся с оценкой и планом

Чтобы оценка проекта опиралась на факты, а не на догадки, для разговора достаточно нескольких вводных. Присылать весь код заранее не нужно — важно понять, как проверка встроена в ваш процесс разработки и ревью.

  • Перечень сетей и типов контрактов: токены, мосты, протоколы кредитования — что именно нужно проверять.
  • Репозиторий или архив с примерами — хотя бы несколько контрактов в текущем состоянии.
  • Классы уязвимостей, критичные именно вам: повторное вхождение, ошибки контроля доступа, переполнения.
  • Как находки доходят до разработчиков: отчёт, задача в трекере, комментарий к изменению кода.
  • Ограничения по доступам: где живёт код, что можно подключить к сборочному контуру.
  • Кто утверждает правила и разбирает ложные срабатывания.
  • Накопленные примеры находок и пропусков — по ним настраиваем чувствительность.

В ответ вы получаете схему контура: где стоит анализ уязвимостей, как он связан со сборкой и проверкой изменений, где хранятся результаты и как они попадают в задачи. Дальше — план работ по этапам с точками контроля и дата первого пробного прогона на ваших контрактах. По итогам прогона видно, какую долю находок подтверждают инженеры и сколько уходит в шум, — на этих числах и строится финальная оценка проекта.

Направления AI-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139