Joven hacker sonriendo

Cifrar Código Fuente

Necesidad

Cifrar código fuente para depurar programas en COBOL y RPG.

Contexto

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

  1. Se está desarrollando una aplicación en COBOL o RPG.

  2. La aplicación requiere depurarse en entornos de producción sin exponer el código fuente.

  3. El código fuente no debe ser accesible en ambientes de producción (ej: compilación, ofuscación)[1].

Solución

Para el ejemplo se usará un programa sencillo hecho en COBOL:

  1. Se define la primer división IDENTIFICATION DIVISION de todo programa en COBOL:

    coboldebug.cbl
    1
    2
    3
    4
    5
           IDENTIFICATION DIVISION.
          ******************
          * Identification *
          ******************
           PROGRAM-ID. COBOLDEBUG.
    

    En este caso mediante la instrucción PROGRAM-ID, se denomina al programa bajo el nombre de COBOLDEBUG.

  2. La siguiente división a definir es la de DATA DIVISION. En esta división se declaran nombres de campos, registros, variables, etc. Es decir, se especifica cada tipo de dato utilizado por el programa[2].

    1
    2
    3
    4
    5
    6
          ********
          * Data *
          ********
           DATA DIVISION.
           WORKING-STORAGE SECTION.
           01 W01-COUNT PIC 9(02).
    

    Como se observa en el código anterior, la sección WORKING-STORAGE de DATA DIVISION contiene la variable W01-COUNT, cuya utilidad en este caso es almacenar el valor de la línea que se imprimirá en pantalla:

  3. En la división PROCEDURE DIVISION, se definen todos los procesos necesarios para que el programa funcione. Es decir, se especifia el algoritmo del programa[3]. Para este caso, recorremos de uno en uno la variable W01-COUNT empezando en 1 y terminando en 9:

    1
    2
    3
    4
    5
    6
    7
    8
    9
          ********
          * Main *
          ********
           PROCEDURE DIVISION.
           MAIN.
           PERFORM VARYING W01-COUNT FROM 1 BY 1 UNTIL W01-COUNT > 9
           DISPLAY "Linea " W01-COUNT
           END-PERFORM.
           STOP RUN.
    
  4. La salida del anterior programa es similar a la siguiente:

    1
    2
    3
    4
    5
    Linea 01
    Linea 02
    ...
    Linea 08
    Linea 09
    
  5. Ahora se requiere depurar el programa en entornos de producción, si se compila normalmente con la opción DBGVIEW(*LIST), una copia del código fuente es adjuntada con el programa, lo que le permitiría a un atacante obtener el código fuente original de las aplicaciones compiladas. Para evitar que la copia exacta del código se adjunte con el programa, se debe usar la opción DBGENCKEY[4], la cual permite que se adjunte una copia del código fuente cifrada con una clave proporcionada por el usuario. En el momento de depuración, dicha clave es requerida para descifrar el código fuente, si la clave no coincide no es posible recuperar dicho código.

  6. A través del comando CRTBNDCBL se compila y se crea el programa COBOL (CRTBNDRPG para programas en RPG), el argumento para DBGVIEW debe ser *LIST y para DBGENCKEY es la contraseña (De máximo 16 caracteres) con la cual el código fuente será cifrado:

    1
    2
    3
    4
    5
    6
    CRTBNDCBL
    PGM(FLUID/COBOLDEBUG)
    SRCFILE(FLUID/QRPGSRC)
    SRCMBR(COBOLDEBUG)
    DBGVIEW(*LIST)
    DBGENCKEY('$ecr3t-K3y')
    
  7. Para depurar el programa se ejecuta el siguiente comando:

    1
    STRDBG COBOLDEBUG
    
  8. En este momento la aplicación solicita la clave para descifrar el código fuente:

    clave
  9. Si la clave es correcta podremos ver el código fuente y depurar normalmente el programa:

    depuracion

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. coboldebug.cbl >> contiene todas las instrucciones COBOL del programa.

Referencias

  1. REQ.0154: El código fuente debe estar ofuscado en ambiente de producción.

  2. Data Division.

  3. Procedure Division.

  4. Encrypting the debug listing view.




Haz un comentario