Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Atacando Aplicaciones, APIs, Apps Móviles, Servidores Redes, Dispositivos IoT
SCI: Sistemas de Control Industrial
COS: Centro de Operaciones de Seguridad

Generar Cadenas Aleatorias

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en COBOL al generar cadenas aleatorias. Los elementos aleatorios son muy utilizados en aplicaciones criptográficas y contribuyen a mejorar la seguridad general de la aplicación.

Necesidad

Generar cadenas aleatorias en COBOL.

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.

  2. La aplicación debe generar cadenas aleatorias para diferentes usos.

  3. Los archivos generados en directorios públicos deben tener nombre aleatorio[1].

Solución

  1. En la siguiente solución se muestra la forma de generar números aleatorios que siguen una distribución rectangular usando la función nativa RANDOM de COBOL. Para dicho propósito, se debe calcular una semilla la cual, sirve para inicializar el generador de números aleatorios. No generar una semilla y obtener el valor directamente podría generar problemas de seguridad ya que los números aleatorios podrían ser fácilmente predecibles.

  2. Se da inicio a la solución definiendo la división IDENTIFICATION DIVISION[2],[3]:

    cobolrandf.cbl
    1
    2
    3
    4
    5
           IDENTIFICATION DIVISION.
          ******************
          * Identification *
          ******************
           PROGRAM-ID. COBOLRANDF.
    
  3. Se definen nueve variables:

    • W01-RANDOM en la que finalmente se va a almacenar el número aleatorio.

    • W02-CURRENT-DATE-DATA que va a contener la fecha actual de ejecución del programa.

    • W03-IDAY y W04-SVAL, variables de uso temporal cuyo fin es facilitar el cálculo de los segundos transcurridos desde el primero de enero de 1970.

    • W05-CHARSET el conjunto de caracteres definidos para la cadena aleatoria.

    • W06-RANDOMNAME contiene la cadena aleatoria de 40 caracteres.

    • W07-COUNT contador usado para formar la cadena aleatoria.

    • W08-POS posición obtenida del generador de números aleatorios, según esta posición se extrae un caracter del conjunto de caracteres definido.

    • W09-RANDOMINT variable temporal usada para representar el número aleatorio de forma entera.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
          ********
          * Data *
          ********
           DATA DIVISION.
    
           WORKING-STORAGE SECTION.
           01 W01-RANDOM PIC S9V9(10).
           01 W02-CURRENT-DATE-DATA.
               05 W02-CURRENT-DATE.
                   10 W02-CURRENT-YEAR   PIC 9(04).
                   10 W02-CURRENT-MONTH  PIC 9(02).
                   10 W02-CURRENT-DAY    PIC 9(02).
               05 W02-CURRENT-TIME.
                   10 W02-CURRENT-HOURS  PIC 9(02).
                   10 W02-CURRENT-MINUTE PIC 9(02).
                   10 W02-CURRENT-SECOND PIC 9(02).
                   10 W02-CURRENT-MILLIS PIC 9(02).
               05 W02-DIFF-FROM-GMT      PIC X(05).
           01 W03-IDAY                   PIC 9(12).
           01 W04-SVAL                   PIC 9(12).
           01 W05-CHARSET                PIC X(62).
           01 W06-RANDOMNAME             PIC X(40).
           01 W07-COUNT                  PIC 9(02).
           01 W08-POS                    PIC 9(03).
           01 W09-RANDOMINT              PIC 9(18).
    
  4. Se inicia el proceso obteniendo la fecha actual de ejecución del programa:

    1
    2
    3
    4
    5
    6
          ********
          * Main *
          ********
           PROCEDURE DIVISION.
           MAIN.
               MOVE FUNCTION CURRENT-DATE TO W02-CURRENT-DATE-DATA.
    
  5. Se calcula el número de días transcurridos desde 1970 (sin contar los años bisiestos):

    1
           COMPUTE W03-IDAY = 365 * (W02-CURRENT-YEAR - 1970).
    
  6. Según el valor del mes, se va acumulando esos días con los días transcurridos en el actual año:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
           EVALUATE W02-CURRENT-MONTH
               WHEN 1  COMPUTE W03-IDAY = W03-IDAY + 0
               WHEN 2  COMPUTE W03-IDAY = W03-IDAY + 31
               WHEN 3  COMPUTE W03-IDAY = W03-IDAY + 59
               WHEN 4  COMPUTE W03-IDAY = W03-IDAY + 90
               WHEN 5  COMPUTE W03-IDAY = W03-IDAY + 120
               WHEN 6  COMPUTE W03-IDAY = W03-IDAY + 151
               WHEN 7  COMPUTE W03-IDAY = W03-IDAY + 181
               WHEN 8  COMPUTE W03-IDAY = W03-IDAY + 212
               WHEN 9  COMPUTE W03-IDAY = W03-IDAY + 243
               WHEN 10 COMPUTE W03-IDAY = W03-IDAY + 273
               WHEN 11 COMPUTE W03-IDAY = W03-IDAY + 304
               WHEN 12 COMPUTE W03-IDAY = W03-IDAY + 365
               WHEN OTHER COMPUTE W03-IDAY = W03-IDAY + 0
           END-EVALUATE.
    
  7. Se acumula el número de días transcurridos:

    1
           COMPUTE W03-IDAY = W03-IDAY + (W02-CURRENT-DAY - 1).
    
  8. Luego se obtiene el número de segundos transcurridos desde el 1 de enero de 1970, esto ayudará a generar una semilla de forma segura:

    1
    2
    3
           COMPUTE W04-SVAL = W02-CURRENT-SECOND +
                             (60 * W02-CURRENT-MINUTE) +
                             (3600 * (W02-CURRENT-HOURS + (24 * W03-IDAY))).
    
  9. Se establece el conjunto de caracteres que contendrá la cadena aleatoria:

    1
    2
    3
    4
    5
           STRING "0123456789"
                  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                  "abcdefghijklmnopqrstuvwxyz"
           DELIMITED BY SIZE
           INTO W05-CHARSET.
    
  10. Se realiza una iteración desde uno hasta cuarenta:

    1
           PERFORM VARYING W07-COUNT FROM 1 BY 1 UNTIL W07-COUNT > 40
    
  11. Modificamos el valor de la semilla por cada iteración:

    1
           COMPUTE W04-SVAL      = W04-SVAL + W07-COUNT
    
  12. Generamos el número aleatorio de acuerdo a la semilla:

    1
           COMPUTE W01-RANDOM    = FUNCTION RANDOM(W04-SVAL)
    
  13. Obtenemos la parte entera del número aleatorio:

    1
           COMPUTE W09-RANDOMINT = W01-RANDOM * 65535
    
  14. A través de la función MOD,[4] se obtiene un número aleatorio entre 1 y 62:

    1
    2
           COMPUTE W08-POS       = FUNCTION MOD(W09-RANDOMINT, 62)
           COMPUTE W08-POS       = W08-POS + 1
    
  15. Este número permite escoger aleatoriamente un carácter del conjunto de caracteres. Lo concatenamos al final de la cadena aleatoria y terminamos el ciclo:

    1
    2
    3
    4
    5
               STRING W06-RANDOMNAME W05-CHARSET(W08-POS:1)
               DELIMITED BY SPACE
               INTO W06-RANDOMNAME
    
           END-PERFORM.
    
  16. Mediante la instrucción DISPLAY se despliega en pantalla la cadena aleatoria:

    1
    2
    3
           DISPLAY "Cadena aleatoria: " W06-RANDOMNAME.
    
           STOP RUN.
    
  17. Las siguientes son algunas de las cadenas generadas al momento de llevar a cabo la prueba:

    1
    2
    3
    4
    5
    6
    fYN8rU5c5VrAOahlmibQCuZ9hBbyGVhpttqjZL4i
    VNCyfKvRuLgyEOWaaXQG2kOzW0Qm5KVdijfZPBtY
    QJ8ucGqOrGcvALSWXUMCxgKwTwMj1HSaefcVK6pU
    NG4rYCnKnDZs6IPTTPJ8ucHrPtJfxDOWbbYRH3mQ
    G8yjR5gCg6SkzAIMLIC1nVAkHmBXr5HPTUQKAweJ
    C4ufN1c9c2Pgv6EIIF8yjS6hEh7Un2DLPQNH7taG
    

Descargas

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

  1. cobolrandf.cbl contiene todas las instrucciones COBOL del programa explicado anteriormente.




Haz un comentario

Estado de los servicios - Términos de Uso