GmtCheck


 img_labs_GMTCheck_t

10/02/14. Versión 0.1

GMT Check

Existen millones de applets maliciosos (ficheros .jar) y apps de Android ahí fuera. ¿De dónde vienen? ¿De qué país? ¿Al menos, cuál es su zona horaria? Puede ser relevante conocer si provienen de Rusia, Brasil, China, la India o Estados Unidos. Veamos cómo.

Los fichero ZIP
Los APK (apps de Android) y los applets (y programas Java)vienen todos del mismo formato: son un fichero ZIP. Esto quiere decir que comparten buena parte de las especificaciones PKZIP. A la hora de crear un fichero ZIP, el atributo “fecha” de cada fichero se almacena dentro del fichero ZIP. Se puede comprobar simplemente abriendo un fichero ZIP con cualquier herramienta. 

img_labs_GMTCheck_01
La forma en la que se almacena este dato es curiosa. La parte interesante es que el atributo “fecha y hora” con el que se almacenan es el mismo que el del sistema en el que se han compilado. También, que hay ficheros que se crean justo cuando se compila el programa, como el manifiesto (.mf). Pero, no se da ningún “offset” a esa hora, así que este dato por sí mismo, no permite saber si el fichero apk o jar está un país concreto. Un fichero dentro del fichero ZIP creado a las 23:45 no significa nada por sí solo. ¿Las 23:45 de qué país?

Ficheros firmados y certificados
Algunos applets se firman, de forma que pueden escapar de la sandbox de java y atacar a los usuarios. Los apk siempre están firmados, porque Google Play y Android dicen que así debe ser. Cuando están firmados, se añade un certificado dentro de los ficheros ZIP. Este certificado está en una estructura PKCS, que es un fichero con extensión (entre otras) RSA o DSA en el directorio META-INF. Los certificados puede que estén autofirmados. Esto es gratis y los atacantes no tienen que demostrar a nadie quiénes son en realidad. 

img_labs_GMTCheck_02 

Atacantes y certificados
Los atacantes odian los certificados firmados por CAs, pero les encantan los certificados autofirmados. Son gratis y desechables. Pueden crear un certificado autofirmado ad-hoc para una app y nunca usarlo más. Por ejemplo Eclipse ayuda en esta tarea de crear certificados ad-hoc a la hora de compilar ficheros apk, como último paso antes de enviarlo a Google Play.

Los certificados se almacenan dentro de los ficheros apk cuando se crean. Y aquí está el truco. Se almacenan en UTC. En formato YYMMDDHHMMSSZ. La Z corresponde a “hora zulú”, que es UTC o a efectos prácticos, casi igual que GMT+0.

Poniéndolo todo junto
Así que por un lado tenemos la fecha de sistema del creador, y por otro la hora GMT+0. Solo tenemos que asumir que el certificado y los ficheros son creados justo en el mismo momento para hacer las cuentas y calcular el “offset” de la zona horaria.

Si un fichero manifest o de firmas (que son los últimos creados en la compilación de un fichero jar o apk) contiene la fecha de sistema 16:00, 1 de enero de 2014, y la hora UTC del certificado especifica que fue creado a las 15:00 del 1 de enero de 2014, si asumimos que se crearon en el mismo momento, podríamos decir (a menos que el atacante haya modificado su hora de sistema) que el atacante vive en una zona horaria GMT+1. 

gmtcheck

 

Hemos creado una herramienta que realiza el cálculo. Lee un fichero jar o apk y, si está firmado:

  • Intentará extraer el fichero UTC de un certificado.
  • Intentará leer la hora del último fichero creado en la compilación (normalmente el fichero .sf en el directorio META-INF).
  • Hará las cuentas y dirá en qué zona horaria vive el desarrollador, asumiendo que la creación del certificado y la compilación han ocurrido en el mismo momento (minuto arriba, minuto abajo).