8.6 KiB
Security Audit: Presence Proof Manipulation via tau1_bitmap
Модель: Claude Opus 4.5 Компания: Anthropic Дата: 08.01.2026 12:00 UTC
1. Понимание архитектуры
Montana реализует уникальную архитектуру Atemporal Coordinate Presence (ACP), где присутствие доказывается через P2P-аттестацию в реальном времени. Система использует временные слои (τ₁, τ₂, τ₃, τ₄) для накопления веса участников.
Ключевые особенности:
- Присутствие требует реального времени (14 дней требуют 14 дней)
- Детерминированная лотерея защищена от grinding
- Адаптивный кулдаун предотвращает Sybil-атаки
- Eclipse защита через full bootstrap каждый рестарт
2. Изученные файлы
| Файл | LOC | Ключевые компоненты |
|---|---|---|
types.rs |
600+ | PresenceProof структура, tau1_bitmap |
consensus.rs |
400+ | Лотерея, seed генерация |
cooldown.rs |
260+ | Адаптивный кулдаун |
net/protocol.rs |
1600+ | P2P обработка сообщений |
net/bootstrap.rs |
800+ | Full bootstrap верификация |
net/verification.rs |
800+ | Hardcoded node аутентификация |
3. Attack Surface
Основные точки входа для атакующего:
- PresenceProof с tau1_bitmap (10 бит для 10 минут присутствия)
- Лотерея seed генерация (зависит от presence_root)
- Cooldown_until поле в PresenceProof
- Локальное время узла для timestamp валидации
4. Найденные уязвимости
HIGH Название уязвимости: Presence Proof Manipulation via tau1_bitmap
Файл: src/types.rs:187
Уязвимый код:
pub struct PresenceProof {
pub tau1_bitmap: u16, // 10 bits for 10 minutes
// ...
}
impl PresenceProof {
pub fn tau1_count(&self) -> u32 {
self.tau1_bitmap.count_ones()
}
pub fn meets_threshold(&self) -> bool {
self.tau1_count() >= 9 // 90% = 9/10
}
}
Вектор атаки:
- Атакующий создаёт PresenceProof с tau1_bitmap = 0b1111111111 (все 10 бит установлены)
- Подписывает proof с валидным ключом и prev_slice_hash
- Отправляет proof в сеть во время τ₂
- Система принимает proof как доказательство полного присутствия за 10 минут
- Атакующий получает полный вес τ₂ без реального присутствия
Импакт: Атакующий может получить 100% вес τ₂ (1 слайс) без реального присутствия, нарушая принцип "время = реальное время".
Сложность: LOW - требует только валидного ключа и знания prev_slice_hash.
MEDIUM Название уязвимости: Non-deterministic presence_root
Файл: src/consensus.rs:23-29
Уязвимый код:
pub fn compute_lottery_seed(prev_hash: &Hash, tau2_index: u64, presence_root: &Hash) -> Hash {
let mut data = Vec::with_capacity(72);
data.extend_from_slice(prev_hash);
data.extend_from_slice(&tau2_index.to_le_bytes());
data.extend_from_slice(presence_root);
sha3(&data)
}
Вектор атаки:
- Если presence_root не детерминирован между узлами (разные наборы proofs)
- Разные узлы вычисляют разные seed'ы
- Лотерея даёт разных победителей
- Сеть форкается, ChainWeight становится неэффективным
Импакт: Fork-атака, где атакующий может создать альтернативную цепь с подконтрольным победителем.
Сложность: MEDIUM - требует контроля над достаточным количеством proofs для создания другого presence_root.
MEDIUM Название уязвимости: Cooldown bypass via cooldown_until manipulation
Файл: src/types.rs:192
Уязвимый код:
pub struct PresenceProof {
pub cooldown_until: u64,
// ...
}
impl PresenceProof {
pub fn in_cooldown(&self) -> bool {
self.cooldown_until > self.tau2_index
}
}
Вектор атаки:
- Атакующий устанавливает cooldown_until = 0 в PresenceProof
- Подписывает proof и отправляет в сеть
- Система считает узел активным (не в кулдауне)
- Узел получает вес несмотря на требуемый кулдаун
Импакт: Нарушение адаптивного кулдауна, Sybil-атака становится эффективнее.
Сложность: MEDIUM - требует модификации структуры, но поле не валидируется на уровне P2P.
LOW Название уязвимости: Timestamp manipulation in presence proofs
Файл: src/types.rs:189
Уязвимый код:
pub struct PresenceProof {
pub timestamp: u64, // P2P time attestation
// ...
}
Вектор атаки:
- Атакующий контролирует локальное время узла (malware)
- Устанавливает timestamp в будущем или прошлом
- Создаёт proofs с манипулированными timestamps
- Может нарушить порядок в presence_root (canonical_order)
Импакт: Нарушение детерминированности presence_root, потенциальные форки.
Сложность: HIGH - требует локального доступа к узлу (malware).
5. Атаки, которые НЕ работают
- Eclipse атаки: Full bootstrap (100 peers, 25+ subnets) + NTS reality check
- Sybil атаки: Адаптивный кулдаун (1 день минимум, сглаживание 56 дней)
- Long-range атаки: Хеш-цепь с криптографическими привязками
- Time-warp атаки: MTP (11 слайсов) + future limit (2 часа)
- Lottery grinding: Seed фиксирован prev_slice_hash
6. Рекомендации
Для tau1_bitmap уязвимости:
// Добавить валидацию в P2P обработку
impl PresenceProof {
pub fn validate_tau1_bitmap(&self, current_tau2_start: u64) -> bool {
// Проверить что биты соответствуют реальным минутам τ₂
// Требовать доказательства для каждого установленного бита
unimplemented!()
}
}
Для presence_root детерминированности:
// Усилить canonical_order с дополнительными проверками
pub fn canonical_order_with_validation(proofs: &[PresenceProof]) -> Vec<Proof> {
// Сортировать по (timestamp, hash) с валидацией timestamp ∈ τ₂
unimplemented!()
}
Для cooldown_until:
// Добавить верификацию cooldown_until в bootstrap
pub fn verify_cooldown_until(&self, proof: &PresenceProof) -> bool {
// Проверить что cooldown_until соответствует сети
unimplemented!()
}
7. Вердикт
[ ] CRITICAL — есть уязвимости, позволяющие уничтожить сеть [ ] HIGH — есть серьёзные уязвимости [X] MEDIUM — есть уязвимости среднего риска [ ] LOW — только minor issues [ ] SECURE — уязвимостей не найдено
Общий риск: MEDIUM - уязвимости позволяют манипулировать присутствием, но не уничтожают сеть. Система имеет сильную защиту от catastrophic атак (eclipse, Sybil), но есть локальные манипуляции с presence proofs.