montana/Android/Внешний-аудит/00-Сводка-для-аудитора.md

129 lines
8.2 KiB
Markdown
Raw Normal View History

2026-05-18 22:11:45 +03:00
# 00. Сводка для аудитора — Montana Android v6.5.0
## За одну страницу
**Что это:** Android-приложение Montana — клиент VPN-сети с встроенным BIP39-кошельком. Пользователь получает 0.001 Ɉ за каждую секунду online через VPN-каскад из трёх узлов (Helsinki / Frankfurt / NewYork).
**Размер пакета:** ~3000 строк документации, 11 файлов.
**APK:** `montana-6.6.0.apk` (Phase 2 integration закрыта), 32 MB, подписан Genesis-keystore (fingerprint `305bc99b…3ce4d`).
---
## Что аудитор должен проверить в первую очередь
### Критические (P0, блокеры mainnet)
1. **`07-Известные-ограничения.md` F-2** — Heartbeat без cryptographic auth. Backend принимает heartbeat от любого 40-hex адреса если IP source ∈ MONTANA_NODES. Sybil-атака открыта. Closure: Falcon-512 подпись (Phase 3, ~2 недели).
2. **`07-Известные-ограничения.md` F-4** — `balances.json` живёт только на Moscow. SPOF. Closure: TimeChain validator state (Phase 3, ~2 недели).
3. **`03-Криптография.md` §5** — Address derivation `SHA-256("montana-v1:" || seed)[0..20]` несовместима с BIP32/BIP44. Cross-wallet import показывает пустые балансы. Phase 4 → SLIP-44 registration.
### Высокие
4. **`07` F-6** — Seed в plain text localStorage. Уязвимо на rooted устройствах и forensic. Closure: Android Keystore wrap.
5. **`07` F-7** — Нет backup confirmation flow при создании кошелька. UX risk потери денег.
6. **`07` CF-recovery-tests** — Нет automated tests recovery determinism между устройствами.
7. **`10-Покрытие-тестами.md`** — Ноль automated tests. Manual verification только.
### Средние
8. **`07` CF-4** — Reality keys + UUID в 19 местах ([C-1] SSOT violation).
9. **`07` F-3.1** — Покажется automated cron purge inactive балансов.
---
## Что работает корректно (verified)
✓ BIP39 derivation byte-exact совместимо со стандартом (cross-verified Python ↔ JS WebCrypto — см. `приложения/вектора-тестов-bip39.md`)
✓ haproxy stick-on-src закрепляет клиент за одним exit-узлом на 24h (verified 10/10 запросов)
✓ Atomic LOCK_EX на balances.json (закрыл CF-5 race)
✓ BIP39 wordlist SHA-256 integrity check fail-closed
✓ JSON parsing через `org.json.JSONObject` (закрыл CF-2 regex fragility)
✓ Catch logging в 10/13 try-блоках (закрыл CF-1)
✓ Reality Active probing resistance через SNI Echo decoy
✓ TUN-петля закрыта через `addDisallowedApplication(packageName)`
✓ ALPN pin = `http/1.1` для парсера
---
## Структура аудиторского пакета
| Файл | Содержание | Размер |
|------|-----------|--------|
| `README.md` | Точка входа | 74 строк |
| `00-Сводка-для-аудитора.md` | Этот файл | ~150 строк |
| `01-Архитектура.md` | Компоненты, потоки, границы доверия | 264 строк |
| `02-Угрозы-и-модель.md` | Threat model (атакующие A-H) | 166 строк |
| `03-Криптография.md` | Все примитивы с derivation констант | 249 строк |
| `04-Сетевой-слой.md` | VPN-каскад, haproxy sticky, Reality | 407 строк |
| `05-Состояние-и-хранилище.md` | Где живёт state, защита | 254 строк |
| `06-Восстановление.md` | BIP39 procedures, recovery, тест-векторы | 240 строк |
| `07-Известные-ограничения.md` | Findings tracker со severity и closure path | 244 строк |
| `08-Воспроизводимая-сборка.md` | Точные инструкции получить APK | 173 строк |
| `09-Инвентаризация-кода.md` | Файл-за-файлом разбор | 295 строк |
| `10-Покрытие-тестами.md` | Что тестируется, что нет | 209 строк |
| `приложения/вектора-тестов-bip39.md` | Реальные test vectors + cross-verification | 147 строк |
| `приложения/ключи-узлов.md` | Reality public keys, APK signing key | 70 строк |
| `приложения/api-эндпоинты.md` | Backend REST + heartbeat trace | 252 строк |
**Total:** ~3000 строк.
---
## Рекомендуемая последовательность чтения
1. `00-Сводка-для-аудитора.md` (этот) — overview
2. `01-Архитектура.md` — понять компоненты
3. `02-Угрозы-и-модель.md` — понять что защищаем
4. `07-Известные-ограничения.md` — что **не** работает + roadmap
5. `03-Криптография.md` — детальный crypto audit
6. `04-Сетевой-слой.md` — VPN-каскад
7. `05-Состояние-и-хранилище.md` — persistence layer
8. `06-Восстановление.md` + `приложения/вектора-тестов-bip39.md` — recovery verification
9. `08-Воспроизводимая-сборка.md` — собрать APK с нуля
10. `09-Инвентаризация-кода.md` — code reading reference
11. `10-Покрытие-тестами.md` — test gap
---
## Заявление о готовности к production-mainnet
**Готовность:** ~60% (после Phase 2 closure). Часть production-fixes применена в v6.5.0 (Phase 1), но **критические findings F-2 и F-4 остаются open**.
Запуск mainnet **запрещён** до закрытия P0 findings:
- F-2 (heartbeat auth) — требует TimeChain integration M-VPN-3
- F-4 (state persistence) — требует TimeChain integration M-VPN-2
- F-6 (seed encryption) — Phase 2 user passcode flow
- F-7 (backup confirmation) — Phase 2 UX
- CF-recovery-tests (test coverage) — Phase 2 obligatory
Phase 2 closure cost: ~1-2 недели.
Phase 3 closure cost: ~3-4 недели (вкл. spec patch Montana Protocol v35.25 → v35.26).
После закрытия Phase 2/3 пакет должен быть **переаудитован** независимым специалистом (формальный engagement, не self-audit).
---
## Контакт и обратная связь
**Спецификация протокола:** `/Users/kh./Python/Ничто/Montana Protocol v35.25.0.md`
**Реализация:** `/Users/kh./Python/Ничто/Montana/Montana-Protocol/Code/`
**Hub:** `https://hub.montana.quest/efir369999/montana`
**Аудитор может ответить через issue в hub либо напрямую автору.**
---
## Ограничения этого аудиторского пакета
1. **Self-audit, не независимый.** Пакет собран автором проекта на основе ролей критика/архитектора из спецификации. Не заменяет внешний security audit от независимой firm (NCC Group, Trail of Bits, Cure53, Quarkslab).
2. **Snapshot 2026-05-18.** Все findings и закрытия зафиксированы на эту дату. После Phase 2/3 пакет должен быть обновлён с новыми статусами.
3. **Не покрывает:**
- Внешнюю криптографию xray-core (отдельный аудит xray)
- Android OS уязвимости (CVE)
- Hosting provider integrity
- Legal compliance (GDPR, лицензирование VPN в странах деятельности)
4. **Не имеет formal proof.** Все утверждения empirical либо математические по стандарту, но без formal verification (TLA+, Coq, F\*).