Gatekeeper ejecuta esta verificación automáticamente la primera vez que abre una aplicación descargada y la mayoría de las veces nunca ve los detalles: aparece un cuadro de diálogo, hace clic en él y listo. Esta práctica de laboratorio trata de ver lo que vio Gatekeeper: qué desarrollador firmó la aplicación, si esa firma está intacta, si el servicio notarial de Apple la verificó y qué se le permite hacer una vez que se ejecuta. Cada comando aquí viene con las herramientas de línea de comandos de Xcode (xcode-select --install si aún no las tienes), y cada uno de ellos es de solo lectura: estás inspeccionando, no cambiando, la aplicación.
La firma en sí: codesign -dvvv
codesign es la herramienta de Apple para crear e inspeccionar firmas de código. La bandera -d muestra información sobre el código firmado en una ruta y, según su página de manual, "Los niveles crecientes de detalle producen más resultados", por lo que -dvvv (pantalla, tres niveles de detalle) le brinda la imagen completa en un solo comando:
codesign -dvvv /Applications/Example.app
# example output, trimmed to the fields that matter
Executable=/Applications/Example.app/Contents/MacOS/Example
Identifier=com.example.app
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=... flags=0x10000(runtime) hashes=...
Signature size=4741
Authority=Developer ID Application: Example Software LLC (ABCDE12345)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Team Identifier=ABCDE12345
Runtime Version=14.0.0Cuatro campos para leer cada vez. Authority es la cadena de certificados: una aplicación externa normal debe terminar en Apple Root CA a través de Developer ID Certification Authority, con la línea superior nombrando al desarrollador. Team Identifier es el ID de diez caracteres de Apple para la cuenta de desarrollador: el valor para comparar entre aplicaciones que crees que provienen de la misma empresa, ya que no cambia entre sus versiones. flags=0x10000(runtime) significa que el tiempo de ejecución reforzado está habilitado, un conjunto de restricciones adicionales (como resistir la inyección de código en el proceso) que Apple requiere para la certificación notarial. Y la ausencia de cualquier línea Authority (solo Signature=adhoc) significa que la aplicación no está firmada o está autofirmada y no tiene ninguna cadena con Apple.
¿La firma aún coincide con los archivos? --verify --deep --strict
Una firma es una promesa sobre un conjunto específico de bytes en el momento de la firma. --verify comprueba si esa promesa aún se cumple; según la página de manual, confirma "que el código en esas rutas está firmado, que la firma es válida y que todos los componentes sellados no están alterados". Dos indicadores adicionales son importantes para un paquete de aplicación, que es un directorio lleno de recursos anidados, marcos y ejecutables auxiliares, no un solo archivo:
codesign --verify --deep --strict --verbose=2 /Applications/Example.app
/Applications/Example.app: valid on disk
/Applications/Example.app: satisfies its Designated Requirement--deep es importante porque, según la página de manual, la verificación del contenido anidado está "limitada de forma predeterminada a una investigación superficial que puede no detectar cambios en el código anidado": el modo profundo verifica recursivamente cada marco integrado y herramienta auxiliar, no solo el paquete externo. --strict agrega comprobaciones adicionales que Apple considera lo suficientemente importantes como para no estar activadas de forma predeterminada, incluido que cualquier enlace simbólico dentro del paquete "apunte a archivos sellados dentro de su paquete", rechazando uno que apunte fuera de la aplicación o a algo no sellado: un truco conocido para contrabandear una carga útil sin firmar en un paquete que de otro modo estaría legítimamente firmado. Si cualquiera de las comprobaciones falla, verá code failed to satisfy specified code requirement o una nota que nombra exactamente qué elemento anidado no coincide con lo que estaba sellado originalmente; lea esa línea, le da nombre al archivo.
Leyendo los derechos
Los derechos son los permisos específicos que le otorga la firma de una aplicación: acceso a la cámara, la capacidad de acceder a la red sin espacio aislado, deshabilitar la validación de la biblioteca, etc. codesign -d --entitlements - los extrae; según la página de manual, "Los datos de derechos incorporados se extraerán de la misma manera y se escribirán en" la ruta proporcionada, y - significa salida estándar:
codesign -d --entitlements - /Applications/Example.app
# example output, trimmed
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>La mayoría de los derechos no tienen nada de especial y coinciden con lo que la aplicación obviamente necesita: una aplicación de videollamadas que solicite acceso a la cámara no es un hallazgo. El que vale la pena detenerse es disable-library-validation: significa que la aplicación cargará código desde fuera de su propio paquete firmado, lo cual es una necesidad normal para algún software basado en complementos y una puerta más amplia que la que requieren la mayoría de las aplicaciones. Es un detalle a tener en cuenta, no una señal de alerta automática, y es exactamente el tipo de detalle que no puedes ver sin preguntar.
¿Lo comprobó realmente el servicio notarial de Apple?: spctl y grapadora
Una firma válida sólo prueba que una aplicación no ha sido alterada desde que un desarrollador la firmó; no dice nada sobre si Apple la ha examinado. Eso es lo que añade la notarización. La propia documentación de Apple describe el servicio de notario automatizado como un escaneo de "su software en busca de componentes maliciosos, verifica problemas de firma de código y le devuelve los resultados rápidamente". Cuando se aprueba, "el servicio de notario genera un ticket para que usted lo engrape en su software; el servicio de notario también publica ese ticket en línea donde Gatekeeper puede encontrarlo".
spctl --assess es la forma práctica de pedirle su veredicto al propio motor de políticas de Gatekeeper en lugar de inferirlo usted mismo. Según su página de manual, --assess "realiza una evaluación de los archivos proporcionados" y -v / --verbose, repetido para obtener más detalles, se describe simplemente como una solicitud de "resultado más detallado":
spctl --assess -vv /Applications/Example.app
/Applications/Example.app: accepted
source=Notarized Developer IDsource=Notarized Developer ID es el resultado que desea ver: significa que Gatekeeper encontró una firma de ID de desarrollador válida y un ticket de certificación notarial, ya sea que ese ticket esté grapado a la aplicación o se haya encontrado en línea. Un resultado de source=Unnotarized Developer ID significa que la aplicación está firmada pero Apple no la ha certificado ante notario (o aún no), y un rejected plano significa que Gatekeeper bloquearía su inicio en su configuración predeterminada.
Para verificar la grapa específicamente, xcrun stapler validate busca el ticket físicamente adjunto a la aplicación en lugar de pedirle a Gatekeeper que lo busque en línea; esto es útil para confirmar que una aplicación seguirá evaluando correctamente sin conexión a Internet:
xcrun stapler validate /Applications/Example.app
Processing: /Applications/Example.app
The validate action worked!La bandera de la cuarentena: de dónde viene el control de primera ejecución
La guía de seguridad de la plataforma de Apple explica que "Gatekeeper también rastrea la procedencia de los archivos escritos por el software descargado" y "solicita la aprobación del usuario antes de abrir el software descargado por primera vez". El mecanismo detrás de esto es un atributo extendido, com.apple.quarantine, que Safari, Mail y otras aplicaciones adjuntan a todo lo que guardan en la red. xattr -l lo enumera y, según la página de manual, esta opción "hace que se muestren tanto los nombres de los atributos como los valores correspondientes":
xattr -l ~/Downloads/Example.dmg
com.apple.quarantine: 0081;65e1a2b3;Safari;Sin ningún resultado significa que el archivo no lleva ningún indicador de cuarentena: o se creó localmente, llegó por una ruta que no establece el atributo (algunas herramientas de archivo y administradores de paquetes lo omiten) o el indicador se eliminó manualmente con xattr -d com.apple.quarantine. Vale la pena conocer ese último caso por una razón diferente: es una forma documentada en que las personas evitan por completo la verificación de primera ejecución de Gatekeeper, en archivos en los que confían o creen que confían, y vale la pena ser deliberado en lugar de pegar desde un conjunto desconocido de instrucciones de terminal.
Una comparación elaborada: dos aplicaciones que afirman ser del mismo desarrollador
Una forma concreta de utilizar todo esto en conjunto: supongamos que tiene dos copias de una aplicación que dicen ser de la misma empresa, una del sitio del desarrollador y otra de un enlace que alguien le envió. Ejecute codesign -dvvv en ambos y compare la línea Team Identifier: es una cadena de diez caracteres vinculada a una cuenta de desarrollador de Apple específica y, a diferencia de un nombre para mostrar o un identificador de paquete, no es algo que una segunda parte pueda reproducir casualmente sin acceso al certificado de firma de esa cuenta. Si las dos copias muestran identificadores de equipo diferentes, no estás viendo dos versiones de la misma aplicación; Estás viendo dos firmantes diferentes, uno de los cuales no es quien afirma la descarga. Continúe con spctl --assess -vv en la copia sospechosa: una fuente de certificación notarial no coincidente o ausente en la copia que dice ser idéntica a un original certificado ante notario es la confirmación, no solo una pista.
Leyendo el panorama completo y las señales de alerta reales
- Ninguna cadena
Authority, o una cadena que no termine en Apple Root CA: la aplicación no tiene una identidad de desarrollador responsable detrás de ella. codesign --verifyfalla, especialmente con un mensaje que nombra un archivo anidado específico: algo dentro del paquete cambió después de firmarlo.spctl --assessdevuelverejected, o el Identificador de equipo encodesign -dvvvno coincide con el desarrollador que espera para ese producto.- Una bandera de cuarentena que fue claramente eliminada de un archivo que usted no descargó, o que llegó a través de un canal inusual (un script, un archivo adjunto de correo electrónico renombrado para que parezca otra cosa).
- Derechos que están completamente abiertos (acceso completo al disco, validación de biblioteca deshabilitada, acceso a la red sin restricciones) en una aplicación cuyo propósito declarado obviamente no los necesita.
Ninguna de estas comprobaciones analiza lo que realmente hace la aplicación una vez que se está ejecutando y conectada a la red; ese es un tipo diferente de pregunta, que se responde observando su tráfico en lugar de su firma. Una firma limpia y un boleto de notarización válido son un piso real y significativo: dicen que Apple vio este conjunto exacto de bytes y no encontró problemas de firma de código en el momento de la verificación. Son el comienzo de la confianza en una aplicación, no el final.
El papel de FireAI y de HisnLabs
A clean signature and a stapled ticket say an app hasn’t been tampered with since Apple checked it — they say nothing about what it connects to afterward, which is the question FireAI’s per-app rules and on-device review are built to keep answering, signature by signature, connection by connection.
FireAI es el propio producto de HisnLabs: un cortafuegos con IA integrada para Mac. Muestra, en lenguaje claro, cada conexión que hacen tus aplicaciones y te deja decidir qué sale de tu Mac; su IA funciona en el propio equipo, así que tu tráfico nunca se envía a HisnLabs ni a nadie más. El equipo de investigación en seguridad de HisnLabs es quien mantiene esas decisiones fiables: cataloga qué dominios son simple telemetría frente a un servicio real, sigue el país y la red detrás de una conexión, y entrena el modelo local (la función Autopilot) con tráfico real, sin que nada salga de tu Mac.
Puedes leer las decisiones técnicas detrás de esto, o probar FireAI durante 17 días, en FireAI, de HisnLabs.
