13 votos

Cuando las aplicaciones se firman con código, ¿qué partes del paquete .app cubre la firma?

En Mountain Lion, sé que algunas aplicaciones, incluidas todas las de la Mac App Store, están firmadas digitalmente por el desarrollador, por lo que si se modifican, la firma no coincidirá, y dará todo tipo de errores (y la situación se agravará con la próxima versión del sistema operativo...).

Mi pregunta es ¿qué partes del paquete de aplicaciones cubre la firma? Si cualquier cosa en Appname.app/Contents cambios (incluidos los metadatos, como la fecha de modificación del Contents ), ¿se rompe la firma? ¿Es sólo el binario en Contents/MacOS ? ¿Se incluyen los .plists en la firma? El Resources ? Como usuario final, ¿qué puedo hackear (si es que hay algo) sin romper la firma?

14voto

shsteimer Puntos 8749

TL;DR Depende del desarrollador elegir qué piezas de la aplicación están firmadas y si la manipulación de esas piezas da lugar a alguna acción cuando se lanza la aplicación. Hay que utilizar el método de prueba y error para averiguarlo aplicación por aplicación.

En gran medida, es el desarrollador quien decide qué componentes de su paquete de aplicaciones están representados en el sello que se firma antes de entregar su aplicación. Todo lo que está en el sello es efectivamente a prueba de manipulaciones, ya que es casi imposible modificar estas cosas sin cambiar sus firmas hash. Pero eso no significa que no se pueda manipular.

La guía para desarrolladores de Apple tiene esto que decir sobre lo que debe firmar:

Debe firmar todos los ejecutables de su producto, incluyendo aplicaciones, herramientas, herramientas de ayuda ocultas, utilidades, etc. La firma de un paquete de aplicaciones cubre sus recursos, pero no sus subcomponentes, como las herramientas y los subpaquetes. Cada uno de ellos debe ser firmarse de forma independiente.

Si su aplicación consiste en una gran parte de interfaz de usuario con una o más pequeñas herramientas de ayuda que tratan de presentar una sola cara al usuario, puede hacerlas indistinguibles para la firma de código dándoles a todas el exactamente el mismo identificador de firma de código. (Puede hacerlo asegurándose de que que todos tengan el mismo valor CFBundleIdentifier en su Info.plist, o utilizando la opción -i en el comando codesign, para asignar el mismo identificador). En ese caso, todos los componentes de su programa tienen acceso a los mismos elementos del llavero y se validan como el mismo programa. Haga esto sólo si los programas involucrados están realmente destinados a formar una sola entidad, sin hacer distinciones.

Un binario universal (paquete o herramienta) tiene automáticamente firmas individuales firmas individuales aplicadas a cada componente de la arquitectura. Estas son independientes, y normalmente sólo la arquitectura nativa en el sistema del sistema del usuario final.

En el caso de los paquetes instaladores (paquetes .pkg y .mpkg), todo está firmado implícitamente: El archivo CPIO que contiene la carga útil, el archivo archivo CPIO que contiene install scripts, y la lista de materiales (BOM) tienen cada uno un hash registrado en la cabecera XAR, y esa cabecera a su vez está firmada. a su vez está firmada. Por lo tanto, si se modifica un scriptsscript de instalaciónscripts (por ejemplo) después de que el paquete haya sido firmado, la firma será inválida.

También puedes firmar tus plug-ins y bibliotecas. Aunque esto Aunque esto no es necesario en la actualidad, lo será en el futuro, y no hay desventaja de tener firmas en estos componentes.

Dependiendo de la situación, el codiseño puede añadir a su archivo ejecutable Mach-O o crear nuevos archivos en el directorio de contenidos de su paquete. en el directorio de contenidos de su paquete. Ninguno de sus otros archivos se modifica.

También desde aquí no es necesariamente cierto que tener una firma inválida para una aplicación signifique que ésta no se inicie. La página dice:

Depende del sistema o del programa que lanza o carga el código firmado código firmado decidir si verifica la firma y, si lo hace, determinar determinar cómo evaluar los resultados de esa verificación.

Una aplicación puede optar por permitir modificaciones.

Su mejor opción es un enfoque de prueba y error con cualquier aplicación que esté tratando de modificar. Puede que funcione, puede que no. No se puede dar una respuesta siempre verdadera.

Si una aplicación ha sido firmada puedes buscar un Contents/CodeResources o un Contents/_CodeSignature/CodeResources del paquete. Este archivo enumera todos los componentes firmados y sus valores hash esperados en el paquete. Es un buen lugar para empezar a entender qué piezas de la aplicación un desarrollador considera lo suficientemente críticas como para vigilar los cambios.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X