Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Definir Permisos Usando AccessController

Nuestros ethical hackers, teniendo como base el principio del mínimo privilegio, explican la manera de establecer políticas de seguridad en una aplicación realizada en Java haciendo uso de la clase AccessController y el archivo de políticas java.policy.

Necesidad

Definir permisos personalizados obligatorios usando AccessController en Java.

Contexto

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

  1. Se desarrolla una aplicación en Java.

Solución

La arquitectura de seguridad de Java permite el ajuste de los permisos que requiere la una aplicación usando un fichero de políticas en el que se definen los permisos que tendrá la aplicación para acceder a los recursos del sistema.

Durante la ejecución de la aplicación, cuando esta solicita acceso a un recurso del sistema, el código del gestor de recursos invoca a un método especial de la clase AccessController el cual evalúa la petición y decide si debe concederse o no el acceso. Si se concede el permiso, la ejecución continua, en caso contrario lanza una excepción de seguridad [1].

Los permisos constan de un objetivo y de una acción. Por ejemplo, para acceder a una propiedad del sistema el objetivo puede ser una propiedad específica y las acciones pueden ser leer o escribir el valor de la propiedad.

  1. Para crear un permiso personalizado se debe crear una clase que herede de java.security.BasicPermission, la cual representa la implementación de un permiso básico donde se especifique el nombre del objetivo [2].

    custompermission.java
    1
    2
    3
    4
    5
    6
    import java.security.BasicPermission;
    
    public class CustomPermission extends BasicPermission
    {
      ...
    }
    
  2. Para crear una instancia de la clase java.security.BasicPermission, se debe invocar al constructor de esta clase pasandole como parámetro el nombre del objetivo involucrado en el permiso.

    1
    2
    3
    4
    public CustomPermission(String perm)
    {
      super(perm);
    }
    
  3. La clase CustomPermission debe estar alojada en el directorio src/api.

  4. Luego se crea la clase API, la cual expone el método llamado metodoControlado, donde el código que invoque este servicio debe tener concedido los privilegios necesarios para poder ejecutarlo.

  5. Para este punto se invoca el método AccessController.checkPermission para determinar si el código tiene concedido el permiso para realizar una acción especifica. En el caso de no concederse el permiso, este método genera una excepción de tipo AccessControlException [3].

    api.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    import java.security.AccessController;
    
    public class API
    {
      public static void metodoControlado ()
      {
        AccessController.checkPermission(new CustomPermission("permiso"));
        System.out.println("El metodo pudo ser ejecutado satisfactoriamente");
      }
    }
    
  6. La clase API debe estar alojada en el directorio src/api.

  7. Finalmente, se crea la clase que invoque el servicio metodoControlado de la clase API, la cual debe tener los permisos necesarios para poder realizar la invocación de manera satisfactoria.

    cli.java
    1
    2
    3
    4
    5
    6
    7
    public class CLI
    {
      public static void main(String[] args)
      {
        API.metodoControlado();
      }
    }
    
  8. La clase CLI debe estar alojada en el directorio src/autorizado.

  9. Se debe crear el archivo de políticas java.policy, donde el campo codeBase indica la ubicación del código fuente otorgándole el permiso al código que se encuentre en esa ubicación. Para este caso, los códigos que se encuentran en las ubicaciones src/api y src/autorizado tienen habilitado el permiso.

    policy.java
    1
    2
    3
    4
    5
    6
    7
    8
    grant codebase "file:src/api"
    {
      permission CustomPermission "permiso";
    };
    grant codebase "file:src/autorizado"
    {
      permission CustomPermission "permiso";
    };
    
  10. Para ejecutar el programa utilizando el archivo de políticas java.policy, se debe ingresar el comando mostrado a continuación.

    ejecutar.shell
    1
    2
    3
    $ java -classpath src/api:src/autorizado -Djava.security.manager -
    Djava.security.policy==java.policy CLI
    El metodo pudo ser ejecutado satisfactoriamente
    
  11. El comando anterior habilita la ejecución del gestor de seguridad, en este, se especifica el nombre del archivo de políticas y se establece la ubicación del código a ejecutar.

  12. Si no se concede el permiso CustomPermission para el código ubicado en la ruta /src/autorizado dentro del archivo de políticas, al ejecutarse el método AccessController.checkPermission, este lanza una excepción del tipo AccessControlException.

    ejecutar2.shell
    1
    2
    3
    4
    5
    6
    7
    $ java -classpath src/api:src/autorizado -Djava.security.policy==java.policys CLI
    Exception in thread "main" java.security.AccessControlException: access denied
    (CustomPermission permiso)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
    at java.security.AccessController.checkPermission(AccessController.java:553)
    at API.metodoControlado(API.java:7)
    at CLI.main(CLI.java:8)
    



Haz un comentario

Estado de los servicios - Términos de Uso