4.2 KiB
4.2 KiB
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 Coreaddrman), но он не интегрирован в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) выполнена на очень высоком уровне.