v0.8.5 Hardened Citadel 12 мин 24 сентября 2026, 20:00 — 25 сентября 2026, 11:00

Акт VII: Битва титанов — Qwen против Antigravity и триумф v0.8.5

Кульминация вайб-кодинга: когда тесты зеленые, но внутри свербит. Как модель Qwen устроила разгромный аудит, вскрыла уязвимость MitM, и как мы переписали ядро на строгий Fail-Closed и OpenSSH Randomart.

BUG-034 BUG-035 BUG-036 #qwen #antigravity #security-audit #fail-closed #randomart #seo
BUG-035 BUG-035: Ликвидация скрытого Fail-Open в SSH-рукопожатии
Анатомия инцидента безопасности
Уязвимый Fail-Open (Было)
// ОПАСНО: При отсутствии UI-коллбэка возвращался true!
if (onVerifyHostKey == null) {
  _logger.warning('Коллбэк не передан, продолжаем...');
  return true; // Уязвимость к перехвату MitM!
}
// Падение на случайных байтах хэша:
return utf8.decode(fingerprint);
Строгий Fail-Closed (Стало)
// БЕЗОПАСНО: Запрет по умолчанию (Fail-Closed)
if (onVerifyHostKey == null) {
  _logger.severe('КРИТИЧНО: Нет коллбэка верификации. Разрыв.');
  return false; // Соединение отклоняется!
}
// Каноничный Base64 дайджест OpenSSH:
return 'SHA256:' + base64.encode(fingerprint);
Вердикт аудита: Qwen вскрыл, что тихое поведение Fail-Open позволяло злоумышленникам в локальной сети Wi-Fi перехватывать SSH-сессии без какого-либо предупреждения. Внедрен абсолютный отказ по умолчанию.

Симулятор защиты Shellit: проверка ключей хоста Fail-Closed

Интерактивная демонстрация: первое подключение, фоновая сверка и реакция на атаку перехвата (MitM)

Сценарий №1: Вы арендовали новый сервер и подключаетесь к нему впервые

Сервер ранее не встречался в базе Vault. Программа не может подтвердить подлинность автоматически и запрашивает разовое подтверждение человека (RFC 4253 / TOFU).

ssh [email protected]:22 Новый хост
TOFU Verification Dialog

Подлинность хоста не может быть установлена. Сверьте отпечаток с консолью вашего хостинга:

+--[ED25519 256]--+
|    .. .         |
|o.... *          |
|+oo+o* .         |
|**.*o=oo         |
|*++ X.=.S        |
|o.+oo*..         |
|o..*  +o         |
|o . o....        |
| .   E ..        |
+----[SHA256]-----+
Визуальный образ ключа (OpenSSH Randomart)
Криптографический хэш SHA-256:
SHA256:4mG+zW1+oK9yL1a9B7tPqR8vC3xZ0kM4jN7sW2qX5yU
💡 В консоли хостинга при создании сервера печатается такой же рисунок. За 1 секунду взглядом сверяем картинку (звёзды в центре) и подтверждаем.
Решение пользователя:
Контекст акта: Главный инженерный манифест Shellit. Агент Antigravity отрапортовал о 382 зеленых тестах и Zero-Trust защите. Но интуиция архитектора требовала независимой проверки: исходный код был передан внешней модели Qwen в качестве беспощадной Red Team. Результатом стал разгром уязвимостей, ночной рефакторинг на строгий Fail-Closed, OpenSSH Randomart и признание аудитора.

Запись 43. Битва титанов: как я стравил Qwen с Antigravity

⏱️ Время: 25 сентября 2026, 01:35 — 01:50 (~15 минут)

Главная ловушка вайб-кодинга с сильными агентами — так называемая «галлюцинация компетентности». Агент выдает безупречные архитектурные документы, с суровым лицом сыплет терминами («Zero-Trust песочница», «RFC 9106 тест-векторы»), пишет 382 теста, и все они победно горят зеленым.

Но если ты сам не зубришь синтаксис Dart и C++, слепо верить одной нейросети нельзя ни в коем случае. Особенно в криптографии и сетевой безопасности.

Я взял свежий коммит релиза v0.8.4, выгрузил ключевые файлы и натравил на них модель Qwen с жестким запросом: «Найди все уязвимости, разбери архитектуру под микроскопом и скажи мне горькую правду».

Ответ Qwen оказался сокрушительным и невероятно профессиональным:

  1. Тихий обход проверки (Fail-Open): В файле ssh_client_service.dart при отсутствии коллбэка проверки отпечатка из UI агент просто писал предупреждение в лог и… возвращал true. То есть при любой ошибке интерфейса соединение устанавливалось вслепую — классический риск Man-in-the-Middle!
  2. Бинарный хэш и наивный UTF-8: Библиотека dartssh2 передает отпечаток в виде 32 сырых байт SHA-256. Агент написал utf8.decode(fingerprint). В реальности это приводило либо к падению с FormatException, либо к кракозябрам вместо канонического Base64. Синтетические тесты были зелеными лишь потому, что мок-тест сам генерировал UTF-8 строку!
  3. Иллюзия зануления памяти в управляемом Dart: Заявление о «гарантированном занулении» на уровне сборщика мусора без dart:ffi было иллюзией — сборщик мусора оставляет копии строк в куче.

Запись 44. Триумф перекрестного аудита: рефакторинг на Fail-Closed и релиз v0.8.5

⏱️ Время: 25 сентября 2026, 03:10 — 03:30 (~20 минут)

Мы не стали спорить с критикой. Мы взяли предложенный план и системно переработали ядро:

  1. Абсолютный Fail-Closed: Любая ошибка верификации, отсутствие коллбэка или сбой сети теперь возвращают строгий false. Никаких молчаливых подключений.
  2. Каноничный Base64-дайджест OpenSSH: Исправлен парсер отпечатков dartssh2 — вместо падения utf8.decode на сырых байтах внедрено автоматическое кодирование SHA-256 хэша в стандартный формат OpenSSH (SHA256:...).
  3. Гигиена памяти на Uint8List: Секреты переведены из неизменяемых String в изменяемые байтовые массивы с занулением .fillRange(0, length, 0) и вызовом SecretKey.destroy().
  4. Песочница плагинов JSON-RPC 2.0: Белый список методов и защита от null-байтов (\x00).

После публикации v0.8.5 я снова отправил кодовую базу в Qwen.

Из повторного вердикта Qwen:
«✅ Критическая уязвимость MitM: ИСПРАВЛЕНА. Логика onVerifyHostKey реализована безупречно: правильная кодировка отпечатка OpenSSH, строгий принцип Fail-Closed, безопасная обработка исключений.
⚖️ Обновленный вердикт: Проект продемонстрировал выдающуюся скорость реакции и качество исправлений. Техническая реализация базовой защиты SSH-соединения теперь соответствует современным стандартам безопасности. Отличная работа.»


Запись 45. Битва за органику: Long-Tail руководства и оптимизация сайта

⏱️ Время: 25 сентября 2026, 10:15 — 10:45 (~30 минут)

Когда ядро превратилось в цитадель, мы устроили второй независимый аудит от Qwen — на этот раз по поисковой оптимизации и краулингу:

  • Ликвидировали мертвые зоны 403 Forbidden в родительских папках Astro через статические 301-редиректы.
  • Исключили служебные маршруты /admin/ и /api/ из robots.txt и карты сайта.
  • Внедрили стратегию Long-Tail контент-маркетинга: опубликовали 3 прикладных руководства на русском и английском (защита от rm -rf, настройка своего E2EE-релея и конфигурация MCP для Cursor/Claude).

Главный вывод Хроники:
Будущее разработки через ИИ лежит в перекрестном состязательном взаимодействии нескольких независимых нейросетей (Red Team vs Blue Team) под системным надзором человека-архитектора. 411 зеленых тестов, 0 уязвимостей, 100% честность перед пользователями.

📖 Типографика статьи выровнена по алгоритму Кнута — Пласса с помощью mcp-typography-server на базе Justif.
Knuth-Plass • TeX Style