# 🔒 ОТЧЁТ ПО БЕЗОПАСНОСТИ И УТЕЧКАМ ДАННЫХ ## 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>('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 Hiddify https://github.com/hiddify/hiddify-next/releases ... ``` **Куда отправляется запрос**: - 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 autoSelectRegion(WidgetRef ref) async { // НЕ ДЕЛАЕМ НИЧЕГО - пусть пользователь выберет сам loggy.debug("Auto region selection disabled for privacy"); } ``` ### 2. Отключите Sentry по умолчанию: **Файл**: `lib/core/analytics/analytics_controller.dart:23` ```dart @override Future 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