Files
umbrix/SECURITY_AUDIT_REPORT.md
2026-01-15 12:28:40 +03:00

355 lines
13 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.
# 🔒 ОТЧЁТ ПО БЕЗОПАСНОСТИ И УТЕЧКАМ ДАННЫХ
## Hiddify App v2.5.7 - Полный Аудит
---
## 📧 КОНТАКТЫ ОРИГИНАЛЬНОГО ПРОЕКТА
### Email адреса разработчиков:
- **contribute@hiddify.com** - основной контакт для контрибьюторов
- **linux@hiddify.com** - для Linux пакетов (deb/rpm)
- **wrt@hiddify.com** - для OpenWRT роутеров
### Ссылки на проект:
- **GitHub**: https://github.com/hiddify/hiddify-next
- **Telegram**: https://t.me/hiddify
- **API релизов**: https://api.github.com/repos/hiddify/hiddify-next/releases
- **Сайт**: https://hiddify.com/
---
## 🚨 КРИТИЧЕСКИЕ НАХОДКИ
### 1. ⚠️ SENTRY - АВТОМАТИЧЕСКАЯ ОТПРАВКА КРАШЕЙ
**Файл**: `lib/core/analytics/analytics_controller.dart`
**Что делает**:
- Собирает информацию о крашах приложения
- Отправляет стек-трейсы ошибок на сервера Sentry
- Включает логи, информацию об окружении, версию приложения
**Куда отправляет**:
```dart
final dsn = !kDebugMode || _testCrashReport ? Environment.sentryDSN : "";
```
DSN (Data Source Name) берётся из переменной окружения `sentry_dsn` при сборке.
**Какие данные собираются**:
```dart
SentryFlutter.init(
(options) {
options.dsn = dsn;
options.environment = env.name; // prod/dev
options.dist = appInfo.release.name; // версия релиза
options.enableNativeCrashHandling = true; // крэши нативного кода
options.enableNdkScopeSync = true; // Android NDK
options.serverName = ""; // имя сервера (пустое)
options.attachThreads = true; // информация о потоках
options.tracesSampleRate = 0.20; // 20% трассировка производительности
options.enableUserInteractionTracing = true; // отслеживание действий пользователя
},
);
```
**⚠️ ВАЖНО**:
- Пользовательские данные **АНОНИМИЗИРОВАНЫ**:
```dart
event.copyWith(
user: SentryUser(email: "", username: "", ipAddress: "0.0.0.0"),
);
```
- Но всё равно отправляются: стек-трейсы, версия приложения, операционная система, действия перед крашем
**✅ ХОРОШАЯ НОВОСТЬ**:
- Можно отключить в настройках!
- По умолчанию **ВКЛЮЧЕНО** (`true`)
- Файл: `lib/core/analytics/analytics_controller.dart:23`
---
### 2. 🌍 АВТОМАТИЧЕСКОЕ ОПРЕДЕЛЕНИЕ СТРАНЫ
**Файл**: `lib/features/intro/widget/intro_page.dart:275`
**Что делает**:
При первом запуске приложение **АВТОМАТИЧЕСКИ** отправляет запрос к внешнему сервису:
```dart
final response = await client.get<Map<String, dynamic>>('https://api.ip.sb/geoip/');
```
**Какие данные отправляются**:
- Ваш **IP адрес** (автоматически виден серверу)
- User-Agent: `Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0`
**Что получает приложение**:
```json
{
"country_code": "RU",
"country": "Russia",
...
}
```
**Цель**: Автоматически выбрать язык интерфейса и регион настроек.
**⚠️ РИСК**:
- Ваш IP адрес становится известен стороннему сервису **api.ip.sb**
- Происходит **БЕЗ СОГЛАСИЯ** пользователя при первом запуске
- Сервис может логировать IP адреса
---
### 3. 🔄 АВТОМАТИЧЕСКАЯ ПРОВЕРКА ОБНОВЛЕНИЙ
**Файл**: `lib/features/app_update/notifier/app_update_notifier.dart`
**Что делает**:
Приложение периодически проверяет наличие обновлений, обращаясь к:
```
https://raw.githubusercontent.com/hiddify/hiddify-next/main/appcast.xml
```
**Файл appcast.xml**:
```xml
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
<channel>
<title>Hiddify</title>
<link>https://github.com/hiddify/hiddify-next/releases</link>
...
</channel>
</rss>
```
**Куда отправляется запрос**:
- GitHub Raw (через CDN)
- Может быть виден ваш IP адрес в логах GitHub/CDN
**Частота**: Раз в 12 часов (`durationUntilAlertAgain: Duration(hours: 12)`)
**⚠️ ПРИМЕЧАНИЕ**:
- Это стандартная практика для проверки обновлений
- Можно отключить для Google Play релиза (`allowCustomUpdateChecker`)
---
### 4. 🌐 ПРОВЕРКА IP ИНФОРМАЦИИ ПРОКСИ
**Файл**: `lib/features/proxy/data/proxy_repository.dart:127-129`
Приложение использует **3 сервиса** для проверки текущего IP при подключении к VPN:
```dart
"https://api.ip.sb/geoip/": IpInfo.fromIpSbJson,
"https://ipapi.co/json/": IpInfo.fromIpApiCoJson,
"https://ipinfo.io/json/": IpInfo.fromIpInfoIoJson,
```
**Что отправляется**: Ваш IP адрес (через VPN, если подключен)
**Цель**: Показать пользователю текущее местоположение и провайдера
---
## 🛡️ ЧТО НЕ СОБИРАЕТСЯ (ХОРОШИЕ НОВОСТИ)
**НЕТ Firebase Analytics** (закомментировано в истории)
**НЕТ Google Analytics**
**НЕТ рекламных трекеров**
**НЕТ сбора списка приложений** (кроме Per-App Proxy функции)
**НЕТ доступа к контактам, SMS, звонкам**
**НЕТ передачи VPN трафика третьим лицам**
**НЕТ сбора истории браузера**
---
## 📊 НАСТРОЙКИ ПРИВАТНОСТИ В ПРИЛОЖЕНИИ
### Где найти:
**Экран приветствия** (`lib/features/intro/widget/intro_page.dart`):
```
"Сбор аналитики"
"Сбор данных аналитики и отправка отчетов о сбоях для улучшения приложения"
```
**Переводы** (`assets/translations/strings_ru.i18n.json`):
```json
"enableAnalytics": "Включить аналитику",
"enableAnalyticsMsg": "Разрешить сбор аналитики и отправку отчетов о сбоях"
```
### Как работает:
1. **Первый запуск**: Пользователю предлагается включить/отключить аналитику
2. **Сохраняется в**: SharedPreferences (`enable_analytics` ключ)
3. **По умолчанию**: `true` (ВКЛЮЧЕНО)
4. **Можно изменить**: В настройках приложения
---
## 🔐 РЕКОМЕНДАЦИИ ПО БЕЗОПАСНОСТИ
### Для обычных пользователей:
1. **Отключите аналитику** при первом запуске
2. Понимайте, что ваш IP виден при первом запросе к `api.ip.sb`
3. Используйте VPN сразу после установки, чтобы скрыть реальный IP
### Для параноиков:
1. **Заблокируйте** в файерволе:
- `api.ip.sb`
- `ipapi.co`
- `ipinfo.io`
- `sentry.io` (если отключили аналитику)
- `raw.githubusercontent.com` (отключит проверку обновлений)
2. **Измените код** перед сборкой:
- Удалите автоматический запрос к `api.ip.sb` (строка 275 в `intro_page.dart`)
- Установите `enableAnalyticsPrefKey` по умолчанию в `false`
3. **Соберите приложение без Sentry**:
```bash
flutter build apk --dart-define sentry_dsn=""
```
### Для разработчиков форка (Umbrix):
1. **Удалите все контакты Hiddify**:
- `contribute@hiddify.com` → замените на свои
- Telegram канал → замените на свой
- GitHub ссылки → замените на свой репозиторий
2. **Измените URLs**:
```dart
// lib/core/model/constants.dart
static const githubUrl = "https://github.com/YOUR_ACCOUNT/umbrix";
static const appCastUrl = "https://raw.githubusercontent.com/YOUR_ACCOUNT/umbrix/main/appcast.xml";
static const telegramChannelUrl = "https://t.me/YOUR_CHANNEL";
```
3. **Отключите Sentry** или используйте свой DSN:
```bash
# В Makefile замените или удалите:
SENTRY_DSN=your_sentry_dsn_here
```
4. **Замените IP определение** на приватное решение:
- Используйте только локальные методы (timezone, locale системы)
- Или предлагайте пользователю выбрать страну вручную
---
## 🔍 БЭКДОРЫ?
**НЕ ОБНАРУЖЕНО**. Код открытый, проверяется community на GitHub.
### Проверенные векторы:
- ✅ Нет скрытых серверов для коммуникации
- ✅ Нет зашифрованных payload
- ✅ Нет подозрительных native библиотек
- ✅ VPN трафик не перенаправляется на третьи сервера
- ✅ Нет обфусцированного кода
### Единственные внешние соединения:
1. **Sentry** (опционально, можно отключить)
2. **api.ip.sb** (при первом запуске)
3. **GitHub** (проверка обновлений)
4. **IP check сервисы** (при подключении к VPN, показывают текущий IP)
---
## 📝 ИТОГОВАЯ ОЦЕНКА
### Уровень приватности: **7/10** ⭐⭐⭐⭐⭐⭐⭐☆☆☆
**Плюсы**:
- ✅ Открытый исходный код
- ✅ Можно отключить аналитику
- ✅ Данные анонимизированы в Sentry
- ✅ Нет рекламы и трекеров
- ✅ Нет сбора личных данных
**Минусы**:
- ⚠️ IP адрес утекает к `api.ip.sb` при первом запуске (БЕЗ СОГЛАСИЯ)
- ⚠️ Sentry включён по умолчанию
- ⚠️ Проверка обновлений с GitHub (виден IP)
**Вердикт**: Приложение относительно безопасное, но требует настройки для максимальной приватности.
---
## 🛠️ КАК УДАЛИТЬ ВСЕ УТЕЧКИ (ДЛЯ UMBRIX)
### 1. Удалите автоматическое определение страны:
**Файл**: `lib/features/intro/widget/intro_page.dart`
Замените функцию `autoSelectRegion` на:
```dart
Future<void> autoSelectRegion(WidgetRef ref) async {
// НЕ ДЕЛАЕМ НИЧЕГО - пусть пользователь выберет сам
loggy.debug("Auto region selection disabled for privacy");
}
```
### 2. Отключите Sentry по умолчанию:
**Файл**: `lib/core/analytics/analytics_controller.dart:23`
```dart
@override
Future<bool> build() async {
return _preferences.getBool(enableAnalyticsPrefKey) ?? false; // ← БЫЛО true
}
```
### 3. Удалите проверку обновлений:
**Файл**: `lib/features/app/widget/app.dart`
Закомментируйте или удалите:
```dart
// final upgrader = ref.watch(upgraderProvider);
// upgrader: upgrader,
```
### 4. Замените все URLs:
**Файл**: `lib/core/model/constants.dart`
```dart
abstract class Constants {
static const appName = "Umbrix";
static const githubUrl = "https://github.com/YOUR_ACCOUNT/umbrix";
static const githubReleasesApiUrl =
"https://api.github.com/repos/YOUR_ACCOUNT/umbrix/releases";
static const githubLatestReleaseUrl =
"https://github.com/YOUR_ACCOUNT/umbrix/releases/latest";
static const appCastUrl =
"https://raw.githubusercontent.com/YOUR_ACCOUNT/umbrix/main/appcast.xml";
static const telegramChannelUrl = "https://t.me/YOUR_CHANNEL";
static const privacyPolicyUrl = "https://umbrix.com/privacy-policy/";
static const termsAndConditionsUrl = "https://umbrix.com/terms/";
// ...
}
```
### 5. Соберите без Sentry:
```bash
make TARGET=android SENTRY_DSN=""
```
---
**Дата аудита**: 27 декабря 2025 г.
**Версия**: Hiddify v2.5.7
**Аудитор**: GitHub Copilot AI Assistant