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

13 KiB
Raw Blame History

🔒 ОТЧЁТ ПО БЕЗОПАСНОСТИ И УТЕЧКАМ ДАННЫХ

Hiddify App v2.5.7 - Полный Аудит


📧 КОНТАКТЫ ОРИГИНАЛЬНОГО ПРОЕКТА

Email адреса разработчиков:

Ссылки на проект:


🚨 КРИТИЧЕСКИЕ НАХОДКИ

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": "Разрешить сбор аналитики и отправку отчетов о сбоях"

Как работает:

  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:

    flutter build apk --dart-define sentry_dsn=""
    

Для разработчиков форка (Umbrix):

  1. Удалите все контакты Hiddify:

    • contribute@hiddify.com → замените на свои
    • Telegram канал → замените на свой
    • GitHub ссылки → замените на свой репозиторий
  2. Измените 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";
    
  3. Отключите Sentry или используйте свой DSN:

    # В 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 на:

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