ИБ-агент на маленькой локальной модели
Автономный агент кибербезопасности, который решает задачи без интернета и укладывается в архив до 10 МБ.
- Хакатон
- Sber × AIRI
- Организатор
- Сбер · AIRI
- Даты
- 22 авг — 13 сен 2026
- Коммитов
- 362
На хакатоне Сбера и 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 теряет право на запуск и падает на всех задачах. Упаковкой это не лечится.






