montana/Русский/Совет/Anthropic/сетевая_атака_07.01.2026_16:45.md

281 lines
10 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.

# Adversarial Review: Montana Network Layer
**Модель:** Claude Opus 4.5
**Компания:** Anthropic
**Дата:** 07.01.2026 16:45 UTC
---
## Executive Summary
Проведён анализ сетевого слоя Montana (`/Montana ACP/montana/src/net/`) на устойчивость к атакам. Проверены 5 критических векторов из шаблона Council.
**Общий вердикт:** NEEDS_FIX — обнаружено 2 уязвимости среднего уровня.
---
## Роль
**Атакующий** с неограниченными ресурсами: ботнеты, множество IP-адресов из разных /16 подсетей, неограниченное время.
**Цель:** Eclipse жертвы, исчерпание ресурсов, нарушение консенсуса.
---
## Attack Surface
- **External inputs:** TCP соединения, P2P сообщения, адреса от peers
- **Trust boundaries:** inbound peers (недоверенные), outbound peers (частично доверенные)
- **Critical assets:** consensus view, address manager state, connection slots
---
## TIER 0: КРИТИЧЕСКИЕ ВЕКТОРЫ
### 1. Eclipse Attack
**Файлы:** `addrman.rs`, `eviction.rs`, `connection.rs`
#### Проверенные защиты
| Механизм | Статус | Код |
|----------|--------|-----|
| Netgroup diversity (/16) | PROTECTED | `connection.rs:253-257` |
| Cryptographic bucketing | PROTECTED | `addrman.rs:445-475` |
| Self-connection detection | PROTECTED | `protocol.rs:768-772` |
| Eviction multi-layer | PROTECTED | `eviction.rs:65-126` |
| Anchor connections | NOT IMPLEMENTED | — |
#### Attempted Attacks
| # | Attack | Result |
|---|--------|--------|
| 1 | Заполнить NEW table вредоносными адресами | MITIGATED — cryptographic bucketing распределяет по source |
| 2 | Продвинуть в TRIED через fake connections | MITIGATED — требует реальное TCP соединение |
| 3 | Occupy all outbound slots from same /16 | PROTECTED — MAX_PEERS_PER_NETGROUP = 2 |
| 4 | Gaming eviction (fake low latency) | PROTECTED — 6-layer protection (28 slots) |
| 5 | **Post-restart eclipse** | **VULNERABLE** — нет anchor connections |
#### Finding: Anchor Connections Missing
**Severity:** MEDIUM
**Описание:**
После рестарта узла все outbound соединения выбираются заново из AddrMan. Если атакующий заранее заполнил NEW/TRIED таблицы вредоносными адресами (даже распределёнными по разным /16), после рестарта жертва может подключиться к 8 узлам атакующего.
**Эксплуатация:**
```
1. Атакующий получает IPs в 8+ разных /16 подсетях
2. Заполняет AddrMan жертвы через Addr сообщения (1000 addr/msg)
3. Ждёт рестарт жертвы (обновление, сбой)
4. Жертва выбирает 8 outbound из отравленного AddrMan
5. Все 8 outbound → атакующий, eclipse достигнут
```
**Mitigating factors:**
- Требует 8+ IPs в разных /16 (дорого, но достижимо)
- Rate limiting на Addr (0.1/sec sustained) замедляет отравление
- Жертва должна перезапуститься
**Рекомендация:**
Реализовать anchor connections — сохранять 2 последних успешных outbound peers и подключаться к ним первыми после рестарта. Bitcoin Core: `net.cpp:2098-2150`.
---
### 2. Memory Exhaustion
**Файлы:** `protocol.rs`, `sync.rs`, `rate_limit.rs`
#### Проверенные защиты
| Механизм | Статус | Код |
|----------|--------|-----|
| Flow control BEFORE read | PROTECTED | `protocol.rs:647-658` |
| Early size check (4MB) | PROTECTED | `protocol.rs:1114-1119` |
| Bounded deserialize | PROTECTED | `protocol.rs:1138-1141` |
| OrphanPool bounded | PROTECTED | `sync.rs:38` (100 orphans) |
| BoundedInvSet | PROTECTED | `peer.rs:35-87` (100k items) |
| AddrMan file limit | PROTECTED | `addrman.rs:29` (16MB) |
#### Attempted Attacks
| # | Attack | Result |
|---|--------|--------|
| 1 | Send msg with length=2^32 | PROTECTED — early check vs MAX_SLICE_SIZE (4MB) |
| 2 | Flow control bypass | PROTECTED — check BEFORE read_message() |
| 3 | Orphan slice flooding | PROTECTED — MAX_ORPHANS=100, FIFO eviction |
| 4 | Known inventory exhaustion | PROTECTED — BoundedInvSet, FIFO eviction |
| 5 | Malicious bincode length prefix | PROTECTED — bounded deserialize with_limit() |
#### Verdict: SAFE
Память защищена на всех уровнях. Flow control исправлен после Gemini audit (комментарий в `protocol.rs:635`).
---
## TIER 1: ВЫСОКИЕ ВЕКТОРЫ
### 3. Connection Slot Exhaustion
**Файлы:** `connection.rs`, `eviction.rs`
#### Attempted Attacks
| # | Attack | Result |
|---|--------|--------|
| 1 | Occupy all 117 inbound slots | PARTIAL — eviction может освободить |
| 2 | Gaming eviction via fake metrics | PROTECTED — 6-layer, 28 protected slots |
| 3 | Rapid connect/disconnect flooding | **POTENTIAL** — нет per-IP rate limit |
#### Finding: Connection Rate Limiting Per-IP
**Severity:** LOW
**Описание:**
Нет явного rate limiting на новые TCP соединения от одного IP. Атакующий может быстро открывать и закрывать соединения, создавая нагрузку на listener loop.
**Mitigating factors:**
- Exponential backoff в `connection.rs:139-173` работает только для outbound
- TCP handshake сам по себе ограничивает скорость
- OS-level connection limits
**Рекомендация:**
Добавить per-IP connection rate limit в listener_loop: max 5 connections per IP per minute.
---
### 4. Sync DoS
**Файлы:** `sync.rs`, `bootstrap.rs`, `protocol.rs`
#### Attempted Attacks
| # | Attack | Result |
|---|--------|--------|
| 1 | GetSlices amplification | PROTECTED — `count.min(500)` в `protocol.rs:1036` |
| 2 | GetData abuse | PROTECTED — rate_limits.getdata (1000 burst, 5/sec) |
| 3 | **Headers flooding** | **POTENTIAL** — нет rate limit на SliceHeaders |
#### Finding: Headers Rate Limiting
**Severity:** MEDIUM
**Описание:**
Нет явного rate limit на получение SliceHeaders сообщений. Атакующий может слать большие headers responses, вызывая CPU exhaustion на валидации.
**Проверка в коде:**
- `Message::SliceHeaders` не имеет rate limiter в `PeerRateLimits`
- MAX_HEADERS_SIZE = 512KB (2000 headers × 256 bytes)
- Обработка headers требует валидации каждого
**Эксплуатация:**
```
1. Подключиться к жертве
2. Слать GetHeaders запросы
3. Отвечать 2000 headers каждый раз
4. Жертва тратит CPU на валидацию
5. Повторить с множества соединений
```
**Рекомендация:**
Добавить HeadersRateLimiter в PeerRateLimits: 5000 headers burst, 10/sec sustained.
---
### 5. Rate Limit Bypass
**Файл:** `rate_limit.rs`
#### Attempted Attacks
| # | Attack | Result |
|---|--------|--------|
| 1 | Multiple connections bypass | CONFIRMED — rate limits per-connection |
| 2 | Token bucket timing | SAFE — refill() calls Instant::now() |
| 3 | Message type gaps | PARTIAL — Headers/Presence not rate limited |
#### Finding: Per-Connection vs Per-IP
**Severity:** LOW
**Описание:**
Rate limits в `PeerRateLimits` применяются per-connection. Атакующий с 10 соединениями получает 10× burst capacity.
**Пример:**
- Addr: 1000 burst per connection
- 10 connections = 10,000 addr burst
- Это ускоряет AddrMan poisoning
**Mitigating factors:**
- MAX_INBOUND = 117 ограничивает масштаб
- Netgroup diversity (/16) ограничивает connections per attacker
**Рекомендация:**
Рассмотреть глобальный per-IP rate tracker для критических message types.
---
## Checklist Results
```
[x] Eclipse: netgroup diversity работает
[ ] Eclipse: anchor connections есть ← MISSING
[x] Memory: flow control до allocation
[x] Memory: orphan pool bounded
[x] Memory: все collections bounded
[x] Slots: eviction защищает diversity
[ ] Sync: headers rate limited ← MISSING
[x] Sync: GetSlices rate limited
[ ] Rate: все messages covered ← PARTIAL
[x] Rate: per-IP limiting (partial via netgroup)
```
---
## Summary of Findings
| # | Finding | Severity | Status |
|---|---------|----------|--------|
| 1 | Missing anchor connections | MEDIUM | NEEDS_FIX |
| 2 | Headers not rate limited | MEDIUM | NEEDS_FIX |
| 3 | Connection rate per IP | LOW | CONSIDER |
| 4 | Per-connection vs per-IP rate | LOW | CONSIDER |
---
## Positive Observations
1. **Flow control**: Исправлен после Gemini audit, теперь блокирует read ПЕРЕД allocation
2. **Bounded collections**: Все структуры данных имеют лимиты с FIFO eviction
3. **Eviction system**: 6-layer protection делает gaming очень сложным
4. **Cryptographic bucketing**: SipHash24 с секретным ключом предотвращает bucket prediction
5. **Self-connection detection**: Nonce-based detection работает корректно
6. **Bounded deserialize**: bincode with_limit() везде где нужно
---
## Verdict
```
[ ] SAFE — можно продолжать
[x] NEEDS_FIX — исправить перед продолжением
Critical: 0
High: 0
Medium: 2 (anchor connections, headers rate limit)
Low: 2 (connection rate, per-IP rate)
```
---
## References
- Bitcoin Core anchor connections: `net.cpp:2098-2150`
- Bitcoin Core headers rate limit: `net_processing.cpp:HEADERS_DOWNLOAD_TIMEOUT_BASE`
- Erebus attack paper: https://erebus-attack.comp.nus.edu.sg/
---
*Report generated by Claude Opus 4.5 (Anthropic)*
*Security Council Review — Montana ACP*