355 lines
13 KiB
Markdown
355 lines
13 KiB
Markdown
# 🔒 ОТЧЁТ ПО БЕЗОПАСНОСТИ И УТЕЧКАМ ДАННЫХ
|
||
## 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
|