montana/Русский/Совет/Google/аудит_сети.md

4.2 KiB
Raw Permalink Blame History

Network Layer Security Audit

Модель: Gemini 3 Pro (Google) Дата: 2025-01-07

Вердикт

NEEDS_REVIEW

Критические проблемы

Файл Строка Severity Описание
montana/src/net/protocol.rs 9 HIGH Используется слабый address::AddressManager вместо защищенного addrman::AddrMan. address.rs использует предсказуемое распределение по бакетам (modulo), что уязвимо для DoS/Eclipse атак. addrman.rs (SipHash) не используется.
montana/src/net/protocol.rs 659 MEDIUM Логика FlowControl не останавливает чтение из сокета при переполнении очереди (pause_recv). Полагается только на неявное backpressure каналов mpsc, делая явную логику FlowControl частично бесполезной.

Предупреждения

  • montana/src/net/address.rs: Метод select() использует рекурсию при неудачном выборе адреса. В случае, если все адреса в бакетах "плохие" или уже подключены, это может привести к переполнению стека (хотя вероятность низка из-за рандома).
  • montana/src/net/addrman.rs: Файл содержит более качественную реализацию (аналог Bitcoin Core addrman), но он не интегрирован в protocol.rs. В нем отсутствует метод add_seed, который есть в address.rs.

Сильные стороны

  • Bootstrap Verification: bootstrap.rs реализует отличную защиту от Eclipse-атак при старте: проверка времени сети (median time), требование разнообразия подсетей (25+ /16 subnets) и сверка с hardcoded узлами.
  • Eviction Logic: eviction.rs содержит надежную многоуровневую систему защиты (Netgroup, Ping, Tx, Slice, Longevity), которая эффективно предотвращает заполнение всех слотов атакующим.
  • Size Limits: Ранняя проверка MAX_SLICE_SIZE (4MB) в read_message (строка 1003) предотвращает атаки на исчерпание памяти до десериализации.
  • Rate Limiting: Token Bucket (rate_limit.rs) корректно применяется для сообщений Addr, Inv и GetData.

Рекомендации

  • Заменить AddressManager: Необходимо перевести protocol.rs на использование addrman::AddrMan. Добавить недостающий метод add_seed в addrman.rs и внедрить его вместо текущего address.rs.
  • Исправить FlowControl: В handle_connection следует явно приостанавливать вызов read_message, если flow_control.should_pause_recv() возвращает true, а не просто логировать это.
  • Убрать рекурсию: Переписать метод select в address.rs (или использовать итеративный подход из addrman.rs), чтобы исключить риск переполнения стека.

Общая оценка

Сетевой слой в целом спроектирован грамотно, с явным акцентом на безопасность (Sybil/Eclipse resistance). Однако наличие двух реализаций менеджера адресов (address.rs vs addrman.rs) и использование более слабой из них в продакшн-коде создает неоправданный риск. Логика начальной загрузки (bootstrap.rs) выполнена на очень высоком уровне.