Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + tecnología especializada

Firmar Archivos JAR

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al firmar los archivos JAR usando un certificado digital. Ésto permite verificar la identidad del creador de la aplicación, garantizando la integridad y el no repudio del software.

Necesidad

Firmar archivos JAR (firmar código móvil)

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se tiene código Java empaquetado en archivos JAR.

Solución

Un archivo JAR (por sus siglas en inglés, Java ARchive) es un tipo de archivo que permite ejecutar aplicaciones escritas en el lenguaje de programación Java.

La firma de un archivo JAR tiene como principal objetivo permitir a la persona que lo ejecuta la verificación de la identidad de su creador con el fin de que el usuario de la aplicación pueda discernir si la misma es confiable o no, y por tanto, decida hacer uso de esta. En pocas palabras, El firmado digital de un JAR permite garantizar la integridad y el no repudio del software por parte de la persona que lo utilizará.

La firma del archivo JAR se hace a través de un certificado digital. Un certificado digital se define como un fichero informático generado por una entidad de servicios de certificación que asocia unos datos de identidad a una persona física, organismo o empresa, confirmando, de esta manera, su identidad digital.

Además, hay que tener presente que los certificados se deben almacenar en keystores y para un mejor uso, cada certificado puede ser referenciado mediante un alias, que, por lo general, suele ser el nombre de la persona que firma la clave.

  1. Para cuestiones de ejemplo de crear la firma, se utilizará la siguiente clase que será empaquetada en un JAR. Además, esta clase contiene un método sensible.

    CLI.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    package com.fluidattacks;
    
    class CLI
    {
      public static void main(String[] argumentos)
      {
        System.out.println("public static void main");
      }
      protected static void metodoProtegido()
      {
        System.out.println("protected static void metodoProtegido");
      }
    }
    
  2. Lo primero que se debe hacer es generar un par de certificados (llave pública y privada) los cuales deben ser almacenados en un keystore.

    1
    2
    keytool -keystore keystore -alias fluidattacks -genkey \  -dname "cn=Technology, ou=Engineering,
      o=Fluid Attacks, c=CO" \ -keypass keypass -storepass storepass
    
  3. Luego, se procede a compilar la clase.

    1
    2
    export CLASSPATH=src
    javac src/com/fluidattacks/CLI.java
    
  4. Se debe crear el archivo MANIFEST.MF requerido al momento de crear el .jar.

    1
    2
    3
    4
    5
    $ cat META-INF/MANIFEST.MF
    
    Main-Class: com.fluidattacks.CLI
    Name: com/fluidattacks/
    Sealed: true
    
  5. Se empaqueta entonces el programa compilado en un archivo JAR. El archivo será paquete-1.0.jar, el cual usaremos para firmar.

    1
    2
    3
    4
    5
    6
    $ jar -cvfm paquete-1.0.jar META-INF/MANIFEST.MF -C src .added manifest
    
    adding: com/(in = 0) (out= 0)(stored 0%)
    adding: com/fluidattacks/(in = 0) (out= 0)(stored 0%)
    adding: com/fluidattacks/CLI.java(in = 262) (out= 144)(deflated 45%)
    adding: com/fluidattacks/CLI.class(in = 551) (out= 348)(deflated 36%)
    
  6. Finalmente, procedemos a firmar el paquete generado paquete-1.0.jar con el alias fluidattacks alojado en el keystore previamente creado:

    1
    2
    jarsigner -keystore keystore -storepass storepass -keypass keypass \
       -signedjar paquete-firmado-1.0.jar paquete-1.0.jar fluidattacks
    
  7. Se procede a ejecutar el programa para verificar su funcionamiento.

    1
    2
    $ java -jar paquete-1.0.jar
    public static void main
    
  8. Adicionalmente, es posible utilizar la herramienta jarsigner para verificar la firma de un paquete. Para el ejemplo, se verificará la firma de paquete paquete-1.0.jar.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ jarsigner -keystore keystore -certs -verbose -verify paquete-firmado-1.0.jar
    
     297 Thu Nov 24 10:45:14 COT 2011 META-INF/MANIFEST.MF
     347 Thu Nov 24 10:45:14 COT 2011 META-INF/fluidattacksSIG.SF
     978 Thu Nov 24 10:45:14 COT 2011 META-INF/fluidattacksSIG.DSA
     0 Thu Nov 24 10:45:12 COT 2011 META-INF/
     0 Fri Sep 17 11:18:22 COT 2010 com/
     0 Fri Sep 17 11:18:22 COT 2010 com/fluidattacks/
     smk 262 Tue Nov 11 11:31:06 COT 2008 com/fluidattacks/CLI.java
     X.509, CN=Technology, OU=Engineering, O=Fluid Attacks, C=CO (Fluid Attacks)
     [certificate will expire on 2/22/12 10:45 AM]
     smk 551 Thu Nov 24 10:45:10 COT 2011 com/fluidattacks/CLI.class
     X.509, CN=Technology, OU=Engineering, O=Fluid Attacks, C=CO (Fluid Attacks)
     [certificate will expire on 2/22/12 10:45 AM]
     s = signature was verified
     m = entry is listed in manifest
     k = at least one certificate was found in keystore
     i = at least one certificate was found in identity scope
     jar verified.
    



Haz un comentario

Estado de los servicios - Términos de Uso