# 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`) выполнена на очень высоком уровне.