13 KiB
🔒 ОТЧЁТ ПО БЕЗОПАСНОСТИ И УТЕЧКАМ ДАННЫХ
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
- Включает логи, информацию об окружении, версию приложения
Куда отправляет:
final dsn = !kDebugMode || _testCrashReport ? Environment.sentryDSN : "";
DSN (Data Source Name) берётся из переменной окружения sentry_dsn при сборке.
Какие данные собираются:
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; // отслеживание действий пользователя
},
);
⚠️ ВАЖНО:
- Пользовательские данные АНОНИМИЗИРОВАНЫ:
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
Что делает: При первом запуске приложение АВТОМАТИЧЕСКИ отправляет запрос к внешнему сервису:
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
Что получает приложение:
{
"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:
<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:
"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):
"enableAnalytics": "Включить аналитику",
"enableAnalyticsMsg": "Разрешить сбор аналитики и отправку отчетов о сбоях"
Как работает:
- Первый запуск: Пользователю предлагается включить/отключить аналитику
- Сохраняется в: SharedPreferences (
enable_analyticsключ) - По умолчанию:
true(ВКЛЮЧЕНО) - Можно изменить: В настройках приложения
🔐 РЕКОМЕНДАЦИИ ПО БЕЗОПАСНОСТИ
Для обычных пользователей:
- Отключите аналитику при первом запуске
- Понимайте, что ваш IP виден при первом запросе к
api.ip.sb - Используйте VPN сразу после установки, чтобы скрыть реальный IP
Для параноиков:
-
Заблокируйте в файерволе:
api.ip.sbipapi.coipinfo.iosentry.io(если отключили аналитику)raw.githubusercontent.com(отключит проверку обновлений)
-
Измените код перед сборкой:
- Удалите автоматический запрос к
api.ip.sb(строка 275 вintro_page.dart) - Установите
enableAnalyticsPrefKeyпо умолчанию вfalse
- Удалите автоматический запрос к
-
Соберите приложение без Sentry:
flutter build apk --dart-define sentry_dsn=""
Для разработчиков форка (Umbrix):
-
Удалите все контакты Hiddify:
contribute@hiddify.com→ замените на свои- Telegram канал → замените на свой
- GitHub ссылки → замените на свой репозиторий
-
Измените URLs:
// 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"; -
Отключите Sentry или используйте свой DSN:
# В Makefile замените или удалите: SENTRY_DSN=your_sentry_dsn_here -
Замените IP определение на приватное решение:
- Используйте только локальные методы (timezone, locale системы)
- Или предлагайте пользователю выбрать страну вручную
🔍 БЭКДОРЫ?
НЕ ОБНАРУЖЕНО. Код открытый, проверяется community на GitHub.
Проверенные векторы:
- ✅ Нет скрытых серверов для коммуникации
- ✅ Нет зашифрованных payload
- ✅ Нет подозрительных native библиотек
- ✅ VPN трафик не перенаправляется на третьи сервера
- ✅ Нет обфусцированного кода
Единственные внешние соединения:
- Sentry (опционально, можно отключить)
- api.ip.sb (при первом запуске)
- GitHub (проверка обновлений)
- IP check сервисы (при подключении к VPN, показывают текущий IP)
📝 ИТОГОВАЯ ОЦЕНКА
Уровень приватности: 7/10 ⭐⭐⭐⭐⭐⭐⭐☆☆☆
Плюсы:
- ✅ Открытый исходный код
- ✅ Можно отключить аналитику
- ✅ Данные анонимизированы в Sentry
- ✅ Нет рекламы и трекеров
- ✅ Нет сбора личных данных
Минусы:
- ⚠️ IP адрес утекает к
api.ip.sbпри первом запуске (БЕЗ СОГЛАСИЯ) - ⚠️ Sentry включён по умолчанию
- ⚠️ Проверка обновлений с GitHub (виден IP)
Вердикт: Приложение относительно безопасное, но требует настройки для максимальной приватности.
🛠️ КАК УДАЛИТЬ ВСЕ УТЕЧКИ (ДЛЯ UMBRIX)
1. Удалите автоматическое определение страны:
Файл: lib/features/intro/widget/intro_page.dart
Замените функцию autoSelectRegion на:
Future<void> autoSelectRegion(WidgetRef ref) async {
// НЕ ДЕЛАЕМ НИЧЕГО - пусть пользователь выберет сам
loggy.debug("Auto region selection disabled for privacy");
}
2. Отключите Sentry по умолчанию:
Файл: lib/core/analytics/analytics_controller.dart:23
@override
Future<bool> build() async {
return _preferences.getBool(enableAnalyticsPrefKey) ?? false; // ← БЫЛО true
}
3. Удалите проверку обновлений:
Файл: lib/features/app/widget/app.dart
Закомментируйте или удалите:
// final upgrader = ref.watch(upgraderProvider);
// upgrader: upgrader,
4. Замените все URLs:
Файл: lib/core/model/constants.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:
make TARGET=android SENTRY_DSN=""
Дата аудита: 27 декабря 2025 г. Версия: Hiddify v2.5.7 Аудитор: GitHub Copilot AI Assistant