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 TAL al utilizar estructuras condicionales seguras. Para evitar ataques y fallos en la aplicación es necesario definir escenarios por defecto, considerando todos los posibles escenarios.

Necesidad

Usar estructuras condicionales contemplando todos los escenarios posibles y valores por defecto en TAL.

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 TAL.

  2. La aplicación utiliza estructuras condicionales, como if o switch.

  3. El código debe definir opciones por defecto seguras (ej: default en switchs) [1].

  4. El código debe ser invocado en algún escenario [2].

Solución

La validación de entradas es un proceso esencial en toda aplicación. Esta validación es aplicable a cualquier lenguaje de programación. Para el caso de TAL podemos mejorar la seguridad de nuestra aplicación, al agregar escenarios por defecto para cada uno de los casos posibles. Para ello utilizamos los condicionales propios del lenguaje. En cada estructura condicional empleada en una aplicación TAL, se recomienda contemplar todos los posibles escenarios, como se muestra a continuación:

  1. Iniciamos la aplicación copiando la sección INITIALIZER del archivo EXTDECS:

    INITIALIZER
    1
    ?SOURCE $SYSTEM.SYSTEM.EXTDECS (INITIALIZER)
    
  2. En el procedimiento principal encontramos la lógica del programa:

    1
    PROC fluidproc MAIN;
    
  3. Declaramos las variables de ejemplo: id, role y constantes que indican si el usuario es anonymous (anónimo), guest (invitado), restricted (restringido), admin (administrador) o root (super administrador):

    1
    2
    3
    4
    BEGIN
      INT id;
      INT role;
      LITERAL anonymous, guest, restricted, admin, root;
    
  4. Los posibles valores que puede tomar id y su respectivo rol son:

    Tabla 1. Roles e IDs definidos por la aplicación.

    ID

    Rol

    0 - 10

    Anonymous.

    11 - 20

    Guest.

    21 - 50

    Restricted.

    51 - 90

    Admin.

    98 - 99

    root.

  5. Inicializamos el programa. Para ello ejecutamos la sentencia INITIALIZER:

    1
    CALL INITIALIZER;
    
  6. Establecemos un id arbitrario:

    1
    id := 100;
    
  7. La palabra clave CASE es usada para ejecutar cierto código dependiendo del contenido de una variable, en este caso, la variable id:

    1
    CASE id OF
    
  8. Si el contenido de la variable id se encuentra en el rango 0..10, significa que es anónimo:

    1
    2
    BEGIN
      0..10     -> role := anonymous;
    
  9. De la misma manera se definen los demás roles, dependiendo del rango del id: Entre 11 y 20 es invitado, Entre 21 y 50 restringido, y así sucesivamente hasta llegar a super administrador, sólo con los ids 98 y 99:

    1
    2
    3
    4
      11..20    -> role := guest;
      21..50    -> role := restricted;
      51..90    -> role := admin;
      98, 99    -> role := root;
    
  10. La sentencia OTHERWISE sirve para controlar escenarios no contemplados, si el id no se encuentra definido en las anteriores etiquetas, el valor que el rol toma por defecto es el de anónimo:

    1
    2
      OTHERWISE -> role := anonymous;
    END;
    
  11. Si la sentencia OTHERWISE no es especificada y el valor no se encuentra en los valores anteriormente definidos, el programa arroja un error de ejecución como puede ser observado a continuación:

    1
    2
    3
    4
    5
    $SYSTEM fluidattacks 1> RUN fluidattacksP
    ABENDED: 0,161
    CPU time: 0:00:00.001
    -1: Process trapped
    TRAP NO=02:  (UC.00)  P=%000040  L=%000000  S=%000002
    
  12. Debe usarse de igual manera la sentencia ELSE en el momento de usar condicionales. Note que para este ejemplo, si no tiene en cuenta la sentencia ELSE, el rol que toma el id 100 es el de super administrador, aún sabiendo que el valor 100 no está especificado:

    1
    2
    3
    4
    5
      IF id > 98 THEN
        role := root
      ELSE
        role := anonymous;
      END;
    


Haz un comentario

Estado de los servicios - Términos de Uso