Detección de manipulación
La detección de manipulación es un aspecto fundamental para garantizar la integridad y la seguridad de las aplicaciones de software. En el ámbito de .NET, Babel Obfuscator es una herramienta eficaz para detectar la manipulación. Con la función de detección de manipulación de Babel, los desarrolladores pueden añadir una capa de protección adicional a sus aplicaciones y ejecutar lógica personalizada como respuesta a los intentos de manipulación.
Cuando un ensamblado está firmado, .NET Framework ya puede detectar si una aplicación se ha manipulado. Babel Obfuscator va un paso más allá y aporta una salvaguarda adicional. Al activar la función de detección de manipulación de Babel, el ensamblado ofuscado es capaz de verificar si se ha manipulado o no. En caso de manipulación, la aplicación puede finalizarse, o bien pueden invocarse métodos personalizados del ensamblado para tratar la manipulación de forma más controlada.
En los destinos móviles de .NET MAUI, a partir de la versión 12 la detección de manipulación la proporciona una comprobación de integridad del paquete en lugar del hash de la imagen que se usa en escritorio: una comprobación de la firma del APK en Android (consulte Integridad del paquete en Android (MAUI)) y una comprobación del identificador del bundle y del perfil de aprovisionamiento en iOS (consulte Integridad del paquete en iOS (MAUI)). En los destinos de escritorio la comprobación calcula el hash de la imagen cargada en memoria, por lo que no tiene efecto en las aplicaciones publicadas en un único archivo, recortadas o con AOT; Babel emite una advertencia cuando se solicita la detección de manipulación para una publicación de ese tipo.
Configuración de la detección de manipulación
Activar la detección de manipulación en Babel es sencillo. Puede hacerse desde la línea de comandos, añadiendo la opción correspondiente, o mediante la tarea Babel, incluyendo el atributo TamperingDetection en el archivo de proyecto.
Línea de comandos
babel myapp.exe --tamperingdetectionTarea Babel de MSBuild
<PropertyGroup>
<TamperingDetection>true</TamperingDetection>
</PropertyGroup>
<Babel TamperingDetection="$(TamperingDetection)" />Una vez activada la detección de manipulación, el ensamblado ofuscado comprueba automáticamente en tiempo de ejecución si se ha manipulado. Si el ensamblado se ha manipulado, la aplicación se finaliza.
En los destinos de escritorio (.NET Framework y .NET sobre CoreCLR) la comprobación calcula un hash de la imagen cargada en memoria y lo compara con un hash grabado en el ensamblado durante la ofuscación. Esta técnica requiere que el ensamblado esté presente como una imagen asignada en memoria, por lo que no se aplica a las aplicaciones publicadas en un único archivo, recortadas o con AOT; cuando se solicita la detección de manipulación para una publicación de ese tipo, Babel advierte de que la comprobación no tendría efecto.
Integridad del paquete en Android (MAUI) Ultimate
El hash de la imagen en memoria descrito más arriba no puede usarse en Android: la aplicación se ejecuta en MonoVM y los ensamblados administrados se empaquetan dentro del APK en lugar de cargarse como una imagen PE de Windows. A partir de la versión 12, Babel ofrece una protección equivalente para los destinos de .NET para Android (MAUI), basada en la integridad de la firma del APK.
Cuando activa la detección de manipulación para un ensamblado net*-android, Babel inyecta una comprobación en tiempo de ejecución que lee el certificado con el que se firmó el APK en ejecución y lo compara con una o varias huellas digitales de firmantes de confianza que usted fija durante la ofuscación. Si la aplicación se vuelve a firmar o se reempaqueta con una clave distinta (la forma clásica de redistribuir una aplicación modificada), las huellas digitales dejan de coincidir y se desencadena la reacción a la manipulación: la aplicación se finaliza o se invoca su controlador personalizado (consulte Acción personalizada al detectar una manipulación). Como la comprobación inspecciona la firma del paquete en el sistema operativo y no la imagen administrada, sigue funcionando con el recorte y con la compilación AOT (ahead-of-time).
Fijar el certificado de firma
Babel no puede conocer el certificado de firma solo a partir del ensamblado, porque se aplica más tarde, cuando se firma el APK. Por eso la huella digital SHA-256 del certificado esperado se fija con la opción --trustedsigner. La opción puede repetirse, de modo que es posible fijar más de un certificado (por ejemplo, una clave de carga y una clave de firma de aplicaciones de Google Play):
babel MyApp.dll --tamperingdetection --trustedsigner 2924C53EE9C511E9F26E0720FD8151064F7621681667D7AB1899E551CDB25104Mediante la tarea de MSBuild:
<PropertyGroup>
<TamperingDetection>true</TamperingDetection>
<TrustedSigner>2924C53EE9C511E9F26E0720FD8151064F7621681667D7AB1899E551CDB25104</TrustedSigner>
</PropertyGroup>
<Babel TamperingDetection="$(TamperingDetection)" TrustedSigner="$(TrustedSigner)" />Puede obtener la huella digital SHA-256 de su certificado de firma con keytool (a partir del almacén de claves) o con apksigner (a partir de un APK compilado y firmado):
keytool -list -v -keystore my-release.keystore -alias my-alias | grep -i SHA256
# or, from a signed APK:
apksigner verify --print-certs MyApp.apk | grep -i 'SHA-256'Quite los dos puntos de separación; el valor que se pasa a --trustedsigner es una cadena hexadecimal de 64 caracteres.
Si activa la detección de manipulación en un destino Android sin fijar un firmante de confianza, Babel emite una advertencia y recurre a una comprobación más débil, que solo verifica que el paquete está firmado. Para obtener una protección real, pase siempre --trustedsigner (TrustedSigner) con la huella digital de su certificado de publicación.
Integridad del paquete en iOS (MAUI) Ultimate
En .NET para iOS (MAUI) el código administrado se compila por completo con AOT y no hay una imagen PE asignada en memoria de la que calcular el hash, por lo que la técnica de escritorio no puede usarse. A partir de la versión 12, Babel ofrece una comprobación de la identidad del paquete para los destinos net*-ios: en tiempo de ejecución, la aplicación ofuscada verifica su propio identificador del bundle y, cuando se ejecuta desde una compilación aprovisionada, el identificador de equipo de Apple (Team ID), y los compara con los valores que usted fija durante la ofuscación. Si alguno de los dos deja de coincidir (por ejemplo, después de que la aplicación se haya reempaquetado o se haya vuelto a firmar con otra identidad de desarrollador), se desencadena la reacción a la manipulación (la aplicación se finaliza o se invoca su controlador personalizado). La comprobación se ejecuta desde un inicializador de módulo al iniciarse el proceso y funciona con AOT completo.
Fijar los identificadores del bundle y de equipo
Fije los valores esperados con las opciones --trustedbundle y --trustedteam:
babel MyApp.dll --tamperingdetection --trustedbundle com.mycompany.myapp --trustedteam ABCDE12345Mediante la tarea de MSBuild:
<PropertyGroup>
<TamperingDetection>true</TamperingDetection>
<TrustedBundle>com.mycompany.myapp</TrustedBundle>
<TrustedTeam>ABCDE12345</TrustedTeam>
</PropertyGroup>
<Babel TamperingDetection="$(TamperingDetection)"
TrustedBundle="$(TrustedBundle)"
TrustedTeam="$(TrustedTeam)" />--trustedbundlees elCFBundleIdentifierde su aplicación (deInfo.plist).--trustedteames su Team ID de Apple, de 10 caracteres (visible en el portal Apple Developer, en Membership, y en el nombre de identidad de su certificado de firma, por ejemploApple Development: You (ABCDE12345)).
Cada valor fijado es opcional y se comprueba por separado: fije el identificador del bundle, el identificador de equipo de Apple o ambos.
La comprobación del identificador de equipo de Apple lee el perfil de aprovisionamiento incrustado en la aplicación (embedded.mobileprovision), que está presente en las compilaciones de desarrollo, ad hoc y de empresa. No está disponible en el simulador de iOS (donde la comprobación se omite) y se quita de las compilaciones para el App Store (que Apple vuelve a firmar), así que para la distribución en el App Store confíe en la fijación del identificador del bundle. Si activa la detección de manipulación en un destino iOS sin fijar ninguno de los dos valores, Babel emite una advertencia y no realiza ninguna comprobación de integridad.
Acción personalizada al detectar una manipulación
Para personalizar la respuesta a los intentos de manipulación, los desarrolladores pueden definir un método específico en su ensamblado. Al aplicar la función «on tampering detected method» con el atributo [Obfuscation], se designa un método personalizado que trata el evento de manipulación. Esto permite a los desarrolladores implementar su propia lógica y tomar las medidas adecuadas cuando se detecta una manipulación. Por ejemplo, pueden establecer un indicador oculto, generar resultados incorrectos o activar contramedidas concretas para mitigar el efecto de la manipulación. El mismo controlador se usa para la comprobación de la imagen en escritorio y para las comprobaciones de integridad del paquete en Android e iOS, de modo que un solo método cubre todos los destinos.
class CustomTampering
{
public static bool HasBeenTampered { get; internal set; }
[Obfuscation(Feature = "on tampering detected method")]
static void OnTamperingDetected()
{
HasBeenTampered = true;
}
}El código ofrece una implementación básica para tratar la detección de manipulación.
Si HasBeenTampered tiene el valor true, significa que se ha detectado una manipulación. El uso recomendado consiste en realizar determinadas acciones o ejecutar código específico cuando se detecta la manipulación:
if (CustomTampering.HasBeenTampered)
{
// Tampering detected: Implement appropriate security measures or handle the
// situation accordingly.
// Examples include logging the incident, notifying system administrators,
// disabling critical functionality or terminating the application.
}En resumen, con la función de detección de manipulación de Babel Obfuscator los desarrolladores pueden mejorar notablemente la seguridad de sus aplicaciones .NET. Al poder detectar los intentos de manipulación y responder a ellos, protegen su software frente a modificaciones no autorizadas, mantienen la integridad de los datos y resguardan la información confidencial.