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

39 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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