Backup before removing hiddify references
This commit is contained in:
354
SECURITY_AUDIT_REPORT.md
Normal file
354
SECURITY_AUDIT_REPORT.md
Normal file
@@ -0,0 +1,354 @@
|
||||
# 🔒 ОТЧЁТ ПО БЕЗОПАСНОСТИ И УТЕЧКАМ ДАННЫХ
|
||||
## 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
|
||||
Reference in New Issue
Block a user