Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + tecnología especializada

Usar Estructuras Condicionales

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en RPG 7.1 al utilizar estructuras condicionales seguras. Para evitar fallos o comportamientos no deseados en la aplicación es necesario abarcar todos los casos posibles en las condiciones.

Necesidad

Usar estructuras condicionales contemplando todos los escenarios posibles.

Contexto

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

  1. Se dispone de una aplicación desarrollada en RPG.

  2. La aplicación utiliza estructuras condicionales como if , if - elseif o select.

  3. No se ha definido escenarios por defecto ante condiciones no contempladas por la aplicación.

Solución

Las estructuras condicionales se utilizan para definir el comportamiento de la aplicación ante un escenario dado. Esto permite la toma de decisiones según las condiciones definidas en el código. Sin embargo ¿Qué ocurre cuando ocurre una condición o escenario no es considerado por la aplicación?

Dada esta situación, si la aplicación no ha definido un escenario por defecto, dejará de funcionar correctamente, mostrando valores aleatorios en unos casos o deteniéndose por completo en otros. Esto puede ser aprovechado por los atacantes para vulnerar la aplicación.

En cada estructura condicional empleada en una aplicación RPG, se recomienda contemplar todos los posibles escenarios. Para ello se define los siguientes criterio:

  • Todos los condicionales if o if elseif deben contar con su respectivo else.

  • Todas las sentencias select deben considerar el escenario Other.

A continuación presentamos un ejemplo mostrando el uso correcto del condicional if:

  1. Definimos escenarios válidos, el escenario por defecto y los mensajes:

    ifexample
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
            *************** Beginning of data *************************************
    0001.00 D char           S              1A   Inz('A')
    0002.00 D msg1           S             20A   Inz('Si vale A')
    0003.00 D msg2           S             20A   Inz('Opción por defecto')
    0004.00
    0005.00 C                   If          char = 'B'
    0006.00 C     msg1          Dsply
    0007.00 C                   Else
    0008.00 ** Opción por defecto
    0009.00 C     msg2          Dsply
    0010.00 C                   EndIf
    0011.00
    0012.00 C                   Return
    0013.00
    0014.00
            ****************** End of data ****************************************
    
  2. En el programa anterior, se observa que hay código tanto en el caso de que la variable tome el valor B como si no lo hace.

De forma similar se aborda la sentencia if-elseif. Aquí se evalúan dos posibles condiciones válidas.

  1. Consideramos los escenarios válidos y definimos los mensajes.

ifelseifexample
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
        *************** Beginning of data *************************************
0001.00 D edad            S             15P 5
0002.00 D msg             S             50A
0003.00
0004.00 C     *Entry        PList
0005.00 C                   Parm                    edad
0006.00 **
0007.00 **                  Eval      edad   = edad  - 1
0008.00 C                   If        edad   < 18 AND edad > 0
0009.00 C                   Eval      msg    = 'Menor de edad'
0010.00 C                   ElseIf    edad   > 17 AND edad < 120
0011.00 C                   Eval      msg    = 'Mayor de edad'
0012.00 ** Opción segura por defecto
0013.00 C                   Else
0014.00 C                   Eval      msg    = 'Edad no valida'
0015.00 C                   Endif
0016.00 C     msg           Dsply
0017.00 C                   Return
        ****************** End of data ****************************************
  1. Cabe aclarar que para el correcto funcionamiento del programa, es necesario pasar como parámetro el valor que desee usar en las comparaciones. Ejemplo: CALL PROG2B -1.

  2. En el programa anterior se ve como se manejan los casos especiales en los cuales para la edad ingresada por una persona el programa determina si esta es mayor o menor de edad, sin admitir valores negativos o mayores a 120.

Finalmente con la estructura condicional Select también se crea una condición por defecto.

  1. A continuación se muestra un ejemplo del uso correcto de la sentencia Select

selectexample
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 FMT D  DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
        *************** Beginning of data *************************************
0001.00 D entry           S             15P 5
0002.00 D msg             S             50A
0003.00
0004.00 C     *Entry        PList
0005.00 C                   Parm                    entry
0006.00 **
0007.00 C                   Select
0008.00 C                   When      entry < 100
0009.00 C                   Eval      msg = 'Menor que cien'
0010.00 C                   When      entry > 100
0011.00 C                   Eval      msg = 'Mayor que cien'
0012.00 C                   Other
0013.00 ** Opción segura por defecto
0014.00 C                   Eval      msg = 'Exactamente cien'
0015.00 C                   EndSl
0016.00 C     msg           Dsply
0017.00 C                   Return
        ****************** End of data ****************************************
  1. Recuerde pasar como parámetro el valor que desee usar en las comparaciones. Ejemplo: CALL PROG2C 99.

En el programa anterior se considera, mediante la cláusula Other, los casos que no correspondían a ninguno de los When especificados.




Haz un comentario

Estado de los servicios - Términos de Uso