✦RLT.Hack — 5 место✦Хакатон Московского транспорта — 3 место, 200 000 ₽✦КосмоХакатон 2026 · финал — финалисты✦КосмоХакатон 2026 — 3 место, 100 000 ₽✦Хакатон MAX — итоги ещё не объявили✦Sber × AIRI — не в призах✦AIOS — не в призах✦Ozon Hackathon — не в призах✦наберите «восторг» на клавиатуре
← все проекты
NDV-003

ИБ-агент на маленькой локальной модели

Автономный агент кибербезопасности, который решает задачи без интернета и укладывается в архив до 10 МБ.

не в призах
Хакатон
Sber × AIRI
Организатор
Сбер · AIRI
Даты
22 авг — 13 сен 2026
Коммитов
362
СтекPythonлокальная LLMагентный цикл
недо-

На хакатоне Сбера и AIRI нам не хватило оперативки под 7B

Веса рекомендованной 7B — 4,68 ГБ, а WSL досталось 5 ГиБ из 7,8. На всё остальное почти ничего не оставалось.

Кто был в этот раз4 человека

Состав: IR6, m1x, IMaSKoT, Ivan Banan.

Кейс

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

Сложность в ограничениях. Модель маленькая и локальная, интернета при оценке нет, ставить пакеты нельзя, архив — до 10 МБ. В закрытом наборе 15 задач, за каждую 1 или 0. Какая модель будет на оценке и какие у задач лимиты, организаторы не раскрыли.

Что сдали

Агент на чистой стандартной библиотеке Python. Архив весит 109 521 байт — примерно в сто раз меньше лимита. В образе организаторов без сети он стартует и штатно завершается, даже если модель недоступна.

  • Решает 2 из 6 публичных задач — обе простые, про файл с точным содержимым.
  • Из 18 собственных тестовых задач решает 4–5.
  • Код покрыт 714 тестами.

Как устроено

  • Предполётная проверка без модели: код осматривает рабочую папку, утилиты и требования к результату и собирает короткую сводку.
  • Одна петля вместо команды агентов. На каждом шаге модель выбирает одно действие — прочитать, поискать, выполнить команду, записать файл — и видит обрезанный вывод.
  • Пять плейбуков: аудит, исправление, форензика, CTF и общий случай. Это подсказка порядка работы в промпте, а не жёсткий маршрутизатор.
  • Лестница протоколов. Не умеет модель вызывать инструменты нативно — клиент спускается на JSON по схеме, потом на простой JSON, потом на текст.
  • Агенту не верят на слово. Финиш засчитывается, только если результат прошёл проверку, а дедлайн и лимит шагов держит код.

Цифры

  • 0 из 18 → 3 из 18. Первый прогон на 7B не решил ничего: агент искал рабочую папку не там. Одна правка дала три задачи без потерь.
  • Около 6 токенов в секунду выдавала 7B на процессоре: в бюджет 95 секунд влезает 4–6 шагов петли.
  • 5 из 18 и 2 из 18 — два прогона одного и того же кода. Разброс стенда шире большинства эффектов, которые мы мерили.
  • 8 вариантов промпта, 22 прогона за ночь и ни одной новой решённой задачи.
  • 3 из 15 тестов на промпт-инъекции агент провалил: выполнил команду, спрятанную в файлах задачи.

Что было трудно

Сначала железо. Рекомендованная 7B весит 4,68 ГБ, а WSL на первой машине получал 5 ГиБ. Первый живой прогон шёл на 0.5B — проверяли протокол, а не ум. Позже 7B заработала на другой машине на процессоре, потом на ноутбучной видеокарте с 4 ГБ. Стенд подкидывал свои нули: логи форензик-задачи прятало правило в .gitignore, и её образ просто не собирался.

Потом сама модель. Малая модель не выполняет просьбу «запиши лучший вариант сейчас» — она продолжает ходить по кругу. Четыре публичных нуля — четыре разных механизма. Верную находку сломала неэкранированная кавычка в JSON, и агент двадцать раз перезаписал отчёт пустым. SQL-инъекцию закрыли, но забыли передать параметр в запрос и уронили вход. В форензике агент десять раз перечитал одну записку и ни разу не открыл логи. Вишенка: если архив распаковать модулем zipfile из Python, run.sh теряет право на запуск и падает на всех задачах. Упаковкой это не лечится.

код пока приватныйОткроем, когда перестанем стесняться
следующий · NDV-002Агенты управляют месторождением →