Files
umbrix/SECURITY_AUDIT_REPORT.md

355 lines
13 KiB
Markdown
Raw Permalink Normal View History

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