Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,5 @@ package-lock.json
yarn.lock
SETUP_GITHUB.md
FINAL_REPORT.md
FINAL_IMPLEMENTATION_SUMMARY.md
CORRECTIONS_SUMMARY.md
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,41 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.0] - 2024-12-27

### Added
- **GPS Fake Detector** (`EngineGpsFakeDetector`) - Detecta aplicativos de GPS falso e manipulaΓ§Γ£o de localizaΓ§Γ£o
- Verifica configuraΓ§Γ΅es de mock location no Android
- Detecta mais de 25 apps conhecidos de GPS fake instalados
- Analisa confiabilidade da fonte de GPS (precisΓ£o suspeita, valores impossΓ­veis)
- Verifica consistΓͺncia do GPS ao longo do tempo (detecta "teletransporte")
- Monitora permissΓ΅es de localizaΓ§Γ£o e serviΓ§os GPS
- NΓ­vel de severidade: 7 (alto)
- ConfianΓ§a de detecΓ§Γ£o: 90%
- Suporte para Android e iOS

### Dependencies
- Adicionado `geolocator: ^13.0.1` para anΓ‘lise de localizaΓ§Γ£o GPS
- Adicionado `location: ^7.0.0` para serviΓ§os de localizaΓ§Γ£o
- Adicionado `permission_handler: ^11.3.1` para verificaΓ§Γ£o de permissΓ΅es

### Enhanced
- Expandido enum `SecurityThreatType` com novo tipo `gpsFake`
- Implementado cΓ³digo nativo Android para detecΓ§Γ£o de mock location
- Adicionados mΓ©todos estΓ‘ticos para verificaΓ§Γ΅es especΓ­ficas:
- `EngineGpsFakeDetector.checkMockLocationEnabled()`
- `EngineGpsFakeDetector.getInstalledFakeGpsApps()`

### Examples
- Novo exemplo de app demonstrando detecΓ§Γ£o de GPS Fake
- Interface completa mostrando resultados detalhados da detecΓ§Γ£o
- DocumentaΓ§Γ£o expandida no README com exemplos de uso

### Tests
- 100% de cobertura de testes mantida
- Novos testes unitΓ‘rios para o detector de GPS Fake
- Testes de integraΓ§Γ£o para verificar funcionamento completo

## [1.0.0] - 2024-12-19

### Added
Expand Down
77 changes: 76 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
- 🎯 **Pontuação Pana 100/100** - Qualidade mÑxima no pub.dev
- πŸ”„ **CI/CD Automatizado** - Pipeline completo com GitHub Actions
- πŸ“± **Android & iOS Exclusivo** - Otimizado para dispositivos mΓ³veis
- πŸ›‘οΈ **4 Detectores Especializados** - Frida, Root/Jailbreak, Emulator, Debugger
- πŸ›‘οΈ **5 Detectores Especializados** - Frida, Root/Jailbreak, Emulator, Debugger, GPS Fake
- ⚑ **Detecção Assíncrona** - Performance otimizada
- 🎨 **API Intuitiva** - FÑcil integração e uso
- πŸ“Š **Sistema de ConfianΓ§a** - NΓ­veis de confianΓ§a calibrados
Expand Down Expand Up @@ -83,6 +83,7 @@ Future<void> performFullSecurityCheck() async {
EngineRootDetector(),
EngineEmulatorDetector(),
EngineDebuggerDetector(),
EngineGpsFakeDetector(),
];

print('πŸ” Executando verificaΓ§Γ£o completa de seguranΓ§a...\n');
Expand Down Expand Up @@ -127,6 +128,12 @@ Future<void> performFullSecurityCheck() async {
- **MΓ©todos**: Processos de debug, timing attacks
- **Plataformas**: Android, iOS

### 5. πŸ—ΊοΈ GPS Fake Detector (`EngineGpsFakeDetector`)
- **AmeaΓ§a**: `SecurityThreatType.gpsFake`
- **ConfianΓ§a**: 90%
- **MΓ©todos**: Mock location, apps falsos, consistΓͺncia GPS, anΓ‘lise de localizaΓ§Γ£o
- **Plataformas**: Android, iOS

## πŸ“Š Modelos de Dados

### SecurityCheckModel
Expand Down Expand Up @@ -166,6 +173,7 @@ enum SecurityThreatType {
emulator, // Severidade: 6
rootJailbreak,// Severidade: 8
debugger, // Severidade: 2
gpsFake, // Severidade: 7
}
```

Expand Down Expand Up @@ -195,6 +203,73 @@ flutter run
### ImplementaΓ§Γ£o Personalizada

```dart
### Detector de GPS Fake - Exemplo AvanΓ§ado

```dart
import 'package:engine_security/engine_security.dart';

void main() async {
final gpsDetector = EngineGpsFakeDetector();

// VerificaΓ§Γ£o bΓ‘sica
final result = await gpsDetector.performCheck();

if (!result.isSecure) {
print('⚠️ GPS Fake detectado!');
print('πŸ“ Detalhes: ${result.details}');
print('πŸ” MΓ©todo: ${result.detectionMethod}');
print('🎯 Confiança: ${(result.confidence * 100).toStringAsFixed(1)}%');

// Tomar aΓ§Γ΅es de seguranΓ§a
await handleGpsFakeDetection(result);
} else {
print('βœ… GPS Γ© confiΓ‘vel');
}

// VerificaΓ§Γ΅es especΓ­ficas
final mockEnabled = await EngineGpsFakeDetector.checkMockLocationEnabled();
final fakeApps = await EngineGpsFakeDetector.getInstalledFakeGpsApps();

print('πŸ“± Mock Location habilitado: $mockEnabled');
print('🚫 Apps de GPS Fake encontrados: ${fakeApps.length}');

for (final app in fakeApps) {
print(' - $app');
}
}

Future<void> handleGpsFakeDetection(SecurityCheckModel result) async {
// Bloquear funcionalidades baseadas em localizaΓ§Γ£o
// Registrar tentativa de fraude
// Solicitar verificaΓ§Γ£o adicional do usuΓ‘rio
// Etc.
}
```

### TΓ©cnicas de DetecΓ§Γ£o de GPS Fake

O `EngineGpsFakeDetector` utiliza mΓΊltiplas tΓ©cnicas para detectar manipulaΓ§Γ£o de GPS:

#### 1. πŸ”§ VerificaΓ§Γ£o de Mock Location (Android)
- Detecta se as "opΓ§Γ΅es de desenvolvedor" tΓͺm mock location habilitado
- Verifica configuraΓ§Γ΅es do sistema Android

#### 2. πŸ“± DetecΓ§Γ£o de Apps de GPS Fake
- Verifica instalaΓ§Γ£o de mais de 25 apps conhecidos de GPS fake
- Lista atualizada dos principais apps de spoofing de localizaΓ§Γ£o

#### 3. πŸ“Š AnΓ‘lise de Confiabilidade da Fonte
- Verifica precisΓ£o suspeita do GPS (< 100m pode indicar fake)
- Detecta valores impossΓ­veis (altitude e velocidade zero)

#### 4. πŸ”„ VerificaΓ§Γ£o de ConsistΓͺncia GPS
- Analisa movimento impossΓ­vel entre leituras GPS
- Detecta "teletransporte" (distΓ’ncia > 1km em < 10s)

#### 5. πŸ” AnΓ‘lise de PermissΓ΅es
- Verifica interferΓͺncia em permissΓ΅es de localizaΓ§Γ£o
- Detecta desabilitaΓ§Γ£o suspeita de serviΓ§os de localizaΓ§Γ£o

class MySecurityManager {
final List<ISecurityDetector> _detectors = [
EngineFridaDetector(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package io.flutter.plugins;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import io.flutter.Log;

import io.flutter.embedding.engine.FlutterEngine;

/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Android platform.
*/
@Keep
public final class GeneratedPluginRegistrant {
private static final String TAG = "GeneratedPluginRegistrant";
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin device_info_plus, dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.baseflow.geolocator.GeolocatorPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin geolocator_android, com.baseflow.geolocator.GeolocatorPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.lyokone.location.LocationPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin location, com.lyokone.location.LocationPlugin", e);
}
try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin package_info_plus, dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.baseflow.permissionhandler.PermissionHandlerPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin permission_handler_android, com.baseflow.permissionhandler.PermissionHandlerPlugin", e);
}
}
}
50 changes: 50 additions & 0 deletions android/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
group 'tech.stmr.engine_security'
version '1.0.0'

buildscript {
ext.kotlin_version = '1.9.10'
repositories {
google()
mavenCentral()
}

dependencies {
classpath 'com.android.tools.build:gradle:8.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

allprojects {
repositories {
google()
mavenCentral()
}
}

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'

android {
compileSdkVersion 34

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = '1.8'
}

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}

defaultConfig {
minSdkVersion 21
}

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
}
2 changes: 2 additions & 0 deletions android/local.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
sdk.dir=/Users/thiagomoreira/Library/Android/sdk
flutter.sdk=/Users/thiagomoreira/development/flutter
9 changes: 9 additions & 0 deletions android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tech.stmr.engine_security">

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package tech.stmr.engine_security

import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.provider.Settings
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result

class EngineSecurityPlugin: FlutterPlugin, MethodCallHandler {
private lateinit var channel: MethodChannel
private lateinit var context: Context

override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "engine_security/gps_fake")
channel.setMethodCallHandler(this)
context = flutterPluginBinding.applicationContext
}

override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"checkMockLocationEnabled" -> {
result.success(isMockLocationEnabled())
}
"getInstalledApps" -> {
result.success(getInstalledAppPackages())
}
else -> {
result.notImplemented()
}
}
}

override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}

private fun isMockLocationEnabled(): Boolean {
return try {
val mockLocation = Settings.Secure.getString(
context.contentResolver,
Settings.Secure.ALLOW_MOCK_LOCATION
)
mockLocation == "1"
} catch (e: Exception) {
false
}
}

private fun getInstalledAppPackages(): List<String> {
return try {
val packageManager = context.packageManager
val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
packages.filter { it.flags and ApplicationInfo.FLAG_SYSTEM == 0 }
.map { it.packageName }
} catch (e: Exception) {
emptyList()
}
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

android {
namespace = "com.stmr.security.security_demo"
namespace = "tech.stmr.security.security_demo"
compileSdk = flutter.compileSdkVersion
ndkVersion = "27.0.12077973"

Expand All @@ -21,7 +21,7 @@ android {

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.stmr.security.security_demo"
applicationId = "tech.stmr.security.security_demo"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- PermissΓ΅es necessΓ‘rias para o detector de GPS Fake -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

<application
android:label="security_demo"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/ic_launcher"
android:allowBackup="false">
<activity
android:name=".MainActivity"
android:exported="true"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.stmr.security.security_demo
package tech.stmr.security.security_demo

import io.flutter.embedding.android.FlutterActivity

Expand Down
File renamed without changes.
Loading