Variables externas en bloques doPrivileged
- Carácter del recurso: Obligatorio
- Tecnologías: Java
Descripción
Es importante no permitir las operaciones de las entradas externas en un bloque doPrivileged (). Esto se debe a que un atacante podría suministrar entradas maliciosas que pueden provocar ataques de escalada de privilegios y proporcionarle un control no deseado sobre la aplicación.
Ejemplos
Un código vulnerable sería el siguiente, que acepta un argumento de entrada:
private void privilegedMethod(final String filename) throws FileNotFoundException {
try {
FileInputStream fis = (FileInputStream) AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public FileInputStream run() throws FileNotFoundException {
return new FileInputStream(filename);
}
}
);
// do something with the file and then close it
} catch (PrivilegedActionException e) {
// forward to handler and log
}
}
Un atacante podría proporcionar el nombre de un archivo de contraseñas sensibles, con la ruta de acceso y, por tanto, forzar a realizar las operaciones en el archivo incorrecto.
Una manera de protegerse de ataques de este tipo sería de la siguiente manera:
Indicando explícitamente el nombre del archivo y limitando las variables utilizadas en el bloque privilegiado en el mismo método. Esto asegura que ningún archivo malicioso se puede cargar mediante la explotación de los privilegios del código correspondiente:
private void privilegedMethod() throws FileNotFoundException {
try {
FileInputStream fis = (FileInputStream) AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public FileInputStream run() throws FileNotFoundException {
return new FileInputStream("/usr/home/filename");
}
}
);
// do something with the file and then close it
} catch (PrivilegedActionException e) {
// forward to handler and log
}
}
Contenidos relacionados
Código | Título | Tipo | Carácter | |
---|---|---|---|---|
LIBP-0254 | Control de acceso | Libro de pautas | Directriz | Obligatoria |