Control de Acceso Roto
Control de Acceso Roto
Control de Acceso Roto
información o la funcionalidad. Los controles de acceso rotos permiten a los atacantes eludir la
autorización y realizar tareas como si fueran usuarios privilegiados, como los administradores. Por
ejemplo, una aplicación web podría permitir a un usuario cambiar la cuenta en la que ha iniciado
sesión simplemente cambiando parte de una URL, sin ninguna otra verificación.
Los controles de acceso se pueden asegurar al garantizar que una aplicación web use tokens de
autorización *y establezca controles estrictos sobre ellos.
El control de acceso (o autorización) determina qué usuarios se comunican con qué sistemas y
recursos dentro de su empresa. Cuando se pierde el control de acceso, cualquiera puede enviar
solicitudes a sus aplicaciones de red. Esta pérdida significa que el acceso no autorizado a la
funcionalidad y los recursos del sistema ha creado una vulnerabilidad explotable que abre a su
empresa a resultados perjudiciales y potencialmente costosos.
Las restricciones de control de acceso existen para delimitar las acciones de los usuarios
autenticados, pero éstas no siempre se aplican correctamente. Una de las habilidades esenciales
de los atacantes es la explotación del control de acceso. De lograrlo, pueden acceder, de forma no
autorizada, a funcionalidades y/o datos, cuentas de otros usuarios, ver archivos sensibles,
modificar datos, cambiar derechos de acceso y permisos, y otras acciones relacionadas con la
divulgación, modificación o incluso, destrucción de datos o del mismo sistema.
Las debilidades del control de acceso son comunes dado que no existen métodos automatizados
para detectarlas, y si no se comienza por establecer, desde un principio, con claridad, qué usuarios
tendrán qué permisos, es fácil caer en error o no detectar éstos. Además, la pérdida del control de
acceso es a menudo un problema que surge en las aplicaciones o páginas web que han aumentado
gradualmente de tamaño. En lugar de diseñar deliberadamente esquemas que regulen el acceso
desde el principio, los desarrolladores los agregan a medida que crece la aplicación, a lo largo del
tiempo. En los casos en que el control de acceso no está centralizado, esto a menudo resulta en un
esquema muy complejo que es difícil de entender por completo. Un esquema complejo, a su vez,
conduce a errores y vulnerabilidades y estas vulnerabilidades son altamente explotables.
Elevación de privilegios
Acceder a una API sin control de acceso mediante el uso de verbos POST, PUT y DELETE.
Permitir que la clave primaria se cambie a la de otro usuario, pudiendo ver o editar la cuenta de
otra persona
Cómo prevenir la Pérdida de Control de Acceso?
Lo primero es diseñar la aplicación estableciendo políticas de acceso claras para cada archivo y
tipos de usuarios/administradores. El control de acceso debe implementarse y ejecutarse a través
de una matriz de control de acceso, que definirá las reglas para cada tipo de usuario. Estos puntos
de acceso deben ser probados rigurosamente creando diferentes cuentas e intentando acceder a
áreas no autorizadas.
Restringir el almacenamiento en caché. El almacenamiento en caché del lado del cliente ayuda a
acelerar los sitios web, pero otros pueden volver a acceder a esta información. Use encabezados
http y metaetiquetas para evitar que se recarguen las páginas restringidas
Finalmente, un ciclo de desarrollo seguro debe incluir una prueba de penetración antes de lanzar
el sistema a producción y mientras éste esté operando.
Tener una guía escrita que describa los diversos permisos necesarios es indispensable. Es
altamente probable que si se carece de esta guía, la aplicación sea vulnerable a Pérdida de Control
de Acceso!
Para detectar las posibilidades de Pérdida de Control de Acceso es necesario efectuar revisiones
manuales del código, puesto que herramientas automatizadas son inefectivas para detectar estos
errores en la programación. Es imprescindible, además, comprender cómo los usuarios y
administradores se autentican y acceden al sitio (lo que suele suceder en un portal de acceso
remoto), por lo que las pruebas de penetración hechas por una entidad independiente se hacen
ultranecesarias, y éstas deben incluir una auditoría exhaustiva de todos los datos accesibles y sus
permisos otorgados.
En 2012, hackers maliciosos obtuvieron acceso a los servidores de IRS (el SII estadounidense) en
Carolina del Sur a través de una contraseña de administrador predeterminada, robando 3.6
millones de números de seguridad social.
Un sitio web que enumera su rol de usuario en la url, por ejemplo, http: // sitio web / usuario /
cuenta. Un atacante simplemente puede cambiar la URL a http: // sitio web / administración /
cuenta y eludir las contraseñas u otros controles.
Un ataque de fuerza bruta podría dañar un panel de administración si éste tuviese una contraseña
débil o predeterminada.
Las referencias inseguras de objetos directos son variables que pueden ser manipuladas por el
destinatario y utilizadas para recuperar más datos. Por ejemplo, un usuario puede obtener una
lista de contraseñas o acceder a otros archivos con comandos simples en la ventana de la url.
Al igual que con cualquier tecnología nueva, las aplicaciones web vienen acompañadas con una
nueva variedad
al momento del desarrollo de las aplicaciones, y, a su vez, han surgido nuevas tecnologías que
introdujeron nuevas posibilidades de explotación. Por otra parte, algunos problemas han perdido
importancia en la medida que se
Como parte de los mecanismos básicos de seguridad de las aplicaciones, los controles de acceso se
encuentran
contar con algún mecanismo que le permita decidir si permite la ejecución de la acción indicada en
una solicitud
Cuando las funcionalidades asociadas al control de acceso son deficientes, un atacante puede, a
menudo, comprometer la aplicación completa, tomando el control de la funcionalidad de
administración y teniendo acceso a datos sensibles que pertenecen a otros usuarios. Como ya se
comentara, la capacidad de los atacantes de quebrar los
controles de acceso es una de las categorías que se encuentra con mayor frecuencia dentro de las
vulnerabilidades
de las aplicaciones web, afectando a un 78% de las aplicaciones recientemente testeadas; si bien
puede resultar
gestión de sesión, pero que fracasan por la desatención habida al momento de adoptar controles
de acceso efectivos por encima de los mismos.
Las vulnerabilidades de control de acceso son, conceptualmente, muy simples: la aplicación está
permitiendo que
un usuario lleve a cabo algo que no debe; las diferencias entre las debilidades derivan de las
diferentes maneras en
las que se manifiesta este defecto fundamental, y de las diferentes técnicas que se requieren para
detectar dicho defecto. A continuación se describen todas estas técnicas, mostrando de qué forma
un atacante puede explotar diferentes tipos de comportamiento dentro de una aplicación para
ejecutar acciones no autorizadas y tener acceso a
datos protegidos.
Vulnerabilidades comunes
Los controles de acceso se pueden dividir en dos grandes categorías: vertical y horizontal [4]. Los
primeros permiten que diferentes tipos de usuarios tengan acceso a diferentes partes de la
funcionalidad de una aplicación; en
el caso más simple, generalmente comprende una división entre usuarios ordinarios y usuarios
administradores;
en casos más complejos, los controles de acceso verticales pueden involucrar roles de usuarios con
granulometría
fina (fine-graned) en base a los que se otorga acceso a funcionalidades específicas, en el que cada
usuario tiene
asignado un único rol o una combinación de roles diferentes. Los segundos permiten que los
usuarios tengan acceso a un determinado subconjunto de una amplio rango de recursos del
mismo tipo (por ejemplo, en una aplicación de workflow, un usuario particular puede tener
permitido actualizar las tareas asignadas pero sólo leer las tareas asignadas a otros usuarios).
En muchos casos, los controles de acceso verticales y horizontales se entrelazan; por ejemplo, una
aplicación de
planificación de recursos puede permitir que cada auxiliar de cuentas facture a una unidad
organizacional específica pero no a otras; por otro lado, puede permitir que el responsable facture
a cualquier unidad; de manera similar,
puede permitir que los auxiliares paguen facturas por montos bajos, en tanto que los montos
mayores deben ser
pagados por el responsable; puede permitir que el director financiero visualice los pagos y cobros
de cada unidad
Como ya se indicara, los controles de acceso son quebrados en caso que cualquier usuario sea
capaz de acceder a
funcionalidades o a recursos para los que no posee autorización. Existen dos grandes tipos de
ataques contra los
controles de acceso, que se corresponden con las dos categorías de control principales: (i)
escalamiento de privilegio vertical, ocurre cuando un usuario puede ejecutar funcionalidades que
no están permitidas al rol que tiene
anterior, un auxiliar puede pagar facturas de cualquier monto); (ii) escalamiento de privilegio
horizontal, ocurre
cuando un usuario puede visualizar o modificar recursos sobre los que no posee privilegios (por
ejemplo, si un
usuario puede utilizar una aplicación webmail para leer el correo electrónico de otras personas, o
si, en el ejemplo
anterior, un auxiliar puede facturar para una unidad organizacional distinta de la asignada).
Resulta común encontrar casos en los que una vulnerabilidad en la separación horizontal de
privilegios de la aplicación puede conducir inmediatamente a un ataque de escalamiento vertical;
por ejemplo, si un usuario descubre una
manera de establecer una contraseña diferente de usuario, entonces dicho usuario puede atacar
una cuenta de admi-
nistrador y tomar el control de la aplicación. En los casos descriptos hasta ahora, el quiebre de los
controles de acceso permiten a usuarios que se han autenticado a sí mismos ante la aplicación
dentro del contexto de un usuario particular, ejecutar acciones o acceder a datos para los que
dicho contexto no los autoriza. Sin embargo, en los casos
más serios de quiebre del control de acceso, resulta posible que usuarios completamente no
autorizados obtenga acceso a funcionalidades o a datos que se espera sólo sean accedidos por
usuarios autenticados privilegiados.
En muchos casos de quiebre de controles de acceso, funcionalidad y recursos sensibles pueden ser
accedidos por
cualquier que conozca el URL relevante. Por ejemplo, existen muchas aplicaciones en las cuales
cualquiera que
visite un URL específico es capaz de hacer uso total de sus funcionalidades de administrador; en
esta situación,
por lo general la aplicación obliga a un control de acceso sólo en el siguiente caso: los usuarios que
han accedido a
la aplicación como administradores verán un enlace hacia este URL sobre su interface de usuario,
en tanto que los
demás usuarios, no; esta diferencia “cosmética” es el único mecanismo existente para “proteger”
una funcionalidad sensible contra su uso no autorizado. Algunas veces, el URL que otorga acceso a
funcionalidades potentes
puede ser menos fácil de conjeturar, e incluso puede resultar de alguna manera críptico; en este
caso, las funcionalidades de administrador están protegidas por el supuesto que el atacante no
conoce o no puede descubrir dicho
URL; esta aplicación puede resultar más difícil de comprometer por parte de una persona externa
de la organización, dado que resulta menos probable que lo adivine.
Se cae en el error de afirmar que ningún usuario de bajo privilegio conocerá el URL porque no se lo
referencia en
ningún lugar dentro de la aplicación; la ausencia de algún control de acceso genuino sigue siendo
una vulnerablidad seria, independientemente de cuán fácil pueda ser conjeturarlo, ya que un URL
no posee el estatus de secreto,
tanto dentro de la propia aplicación como en las manos de los usuarios: se lo visualiza en la
pantalla, aparece en
los historiales del navegador, genera registros de eventos de los servidores web y los servidores
proxy, los usuarios los pueden marcar entre los preferidos o enviarlos a través de correo
electrónico; además, no se los modifica
periódicamente como se debe hacer con las contraseñas; cuando los usuarios cambian de roles, y
se requiere disminuir su acceso a la funcionalidad de administración, no hay manera de “borrar”
su conocimiento de un URL
particular.
En algunas aplicaciones en las que la funcionalidad sensible está oculta por URLs que no son
triviales de conjeturar, un atacante puede ser capaz de identificarlos mediante la inspección del
código del lado del cliente. Muchas
aplicaciones utilizan JavaScript para construir dinámicamente la interface de usuario dentro del
cliente; generalmente esto trabaja estableciendo diferentes flags de acuerdo al estatus del
usuario, y adicionando luego elementos
individuales a la interface de usuario en base a dichos flags; en este caso, el atacante puede
sencillamente revisar el
mismos; en otros casos, los comentarios HTML pueden contener referencias acerca de URLs que
no están vinculados en el contexto que se despliega en la pantalla.
Cuando se utiliza una funcionalidad de una aplicación para obtener acceso a un recurso específico,
es muy común
ver que se pasa un identificador del recurso solicitado dentro de un parámetro de la solicitud, ya
sea dentro de un
URL query string o del cuerpo de una solicitud POST. Por ejemplo, una aplicación puede utilizar
este mecanismo
para desplegar un documento particular que le pertenece a un usuario particular; en este caso,
cuando dicho usuario inicia una sesión con la aplicación, se despliega un vínculo hacia el
documento sobre la página desde donde se
ofrece dicha funcionalidad; otros usuarios no pueden visualizar ese vínculo. Sin embargo, si se
quiebran los controles de acceso, cualquier usuario que solicite el URL relevante puede ser capaz
de visualizar el documento exactamente de la misma manera que si fuera el usuario autorizado.
Este tipo de vulnerabilidad frecuentemente se presenta cuando la aplicación principal posee una
interface con un
sistema externo o con un componente del back-end; puede resultar dificultoso compartir un
modelo de seguridad
basado en sesión entre diferentes sistemas (que pueden estar basados en tecnologías diferentes).
Ante este problema, frecuentemente los desarrolladores toman un atajo y se alejan del modelo,
utilizando parámetros enviados
En el ejemplo anterior, un atacante que intenta ganar acceso no autorizado necesita conocer no
sólo el nombre de
la página de la aplicación sino también el identificador del documento que desea visualizar;
algunas veces, los
otros casos, pueden ser muy fácilmente conjeturados -por ejemplo, si se generan como números
secuenciales.
Como ya se indicara, los URLs no poseen el estatus de secretos, y lo mismo ocurre con los
identificadores de recursos. Frecuentemente, un atacante que desea descubrir los identificadores
de los recursos de otro usuario podrá
descubrir algún lugar de la aplicación que los revela, tales como registros de acceso. Aún cuando
estos identificadores no sean fácilmente conjeturables, sigue siendo un mecanismo vulnerable
para el control de acceso apropiado; en los casos en que el identificador es fácilmente predecible,
el problema es todavía más serio y más sencillo
de ser explotado.
Los registros de eventos de una aplicación a menudo son una mina de oro en cuanto a la
información que poseen,
ya que generalmente contienen numerosos ítems de datos que se pueden utilizar como
identificadores para comprobar funcionalidad, a la que se accede de esta manera; usualmente, los
identificadores que se encuentran dentro
como un parámetro (nuevamente, en esta situación, los controles de acceso pueden ejecutarse
con no mayor robustez que en presencia/ausencia de un URL específicos en las interfaces de los
diferentes tipos de usuario); si un
atacante puede determinar el identificador correspondiente a una función sensible, puede tener la
capcidad de acceder al mismo de la misma manera que si fuera un usuario más privilegiado.
del envío de múltiples solicitudes enviadas desde el cliente hacia el servidor; por ejemplo, una
función que adiciona un nuevo usuario puede requerir la selección de esta opción desde un menú
de mantenimiento de usuarios, o la
selección del departamente y el rol de usuario a partir de listas desplegables, y luego ingresar el
nombre de usuario
Es común encontrar aplicaciones en las que se han realizado esfuerzos para proteger este tipo de
funcionalidad
sensible contra el acceso no autorizado, pero donde los controles de acceso utilizado son pasibles
de quiebre debido a suposiciones erróneas acerca de la manera en que ha de ser utilizada la
funcionalidad. En el ejemplo anterior,
usuario nuevo, la aplicación puede verificar que el usuario posee los privilegios requeridos, y
bloquear el acceso
en caso que no los posea; sin embargo, si el atacante accede directamente a la etapa en que se
especifica el departamente del usuario, este control de acceso no será efectivo. El desarrollador ha
presupuesto inconscientemente
que cualquier usuario que haya alcanzado las últimas etapas del proceso debe tener privilegios
relevantes debido a
que fue verificado en las etapas iniciales; el resultado es que cualquier usuario de la aplicación
puede adicionar
una cuenta de usuario administrador, y de esta manera, ganar control pleno de la aplicación,
accediendo a muchas
Este tipo de vulnerabilidad se puede encontrar en aplicaciones de seguridad crítica, como el caso
de aplicaciones
etapas, en especial para evitar que los usuarios accidentalmente cometan errores cuando solicitan
una transferencia; el proceso de múltiples etapas comprende la captura de diferentes ítems de
datos que el usuario especifica en
cada una de ellas, datos que son chequeados estrictamente cuando se ingresan por primera vez y
luego generalmente se los pasa a la etapa subsiguientes, utilizando campos ocultos de un HTML
form. Sin embargo, si la aplicación no revalida todos estos datos en la etapa final, entonces el
atacante está en condiciones de eludir los chequeos del servidor. Por ejemplo, la aplicación podría
verificar que la cuenta origen seleccionada para la transferencia pertenece al usuario actual y
luego pedir detalles acerca de la cuenta destino y el monto de la transferencia;
si un usuario intercepta la solicitud POST final del proceso y modifica el número de cuenta origen,
pueden ejecu-
tar un escalamiento de privilegio horizontal y transferir fondos desde una cuenta que pertenece a
un usuario diferente.
En la mayoría de los casos, los usuarios ganan acceso a una funcionalidad y a recursos protegidos
mediante la
creación de solicitudes vía páginas dinámicas que se ejecutan sobre el servidor; es responsabilidad
de cada una de
estas páginas ejecutar los chequeos adecuados de control de acceso, y confirmar que el usuario
posee los privilegios relevantes para ejecutar la acción que está intentando. Sin embargo, en
algunos casos, las solicitudes por recursos protegidos se realizan directamente hacia recursos
estáticos, los cuales se encuentran alojados dentro del
web root del servidor. Por ejemplo, una aplicación que permite la publicación en línea puede
permitirle a los usuarios navegar por su catálogo de libros y comprar ebooks descargables; una vez
realizado el pago, el usuario es dirigido hacia un URL de descarga que apunta a un recurso
completamente estático (el ebook adquirido), el cual no
se ejecuta sobre el servidor, y su contenido es devuelto directamente por el servidor web; por lo
tanto, el recurso
en sí mismo no puede implementar ninguna lógica que le permita verificar que el usuario
solicitante posee los privilegios requeridos. Cuando se accede de esta manera a recursos estáticos,
resulta muy probable que no existan
controles de acceso efectivos que los proteja y que cualquiera que conozca el esquema de
nombres del URL puede explotarlo para acceder a cualquier recurso que desee.
de software que ofrecen la descarga de archivos binarios, y funcionalidad administrativas que dan
acceso a archivos de registro estáticos u otros datos sensibles recolectados dentro de la aplicación.
de control de acceso se toman a partir de los parámetros de solicitud enviados por el cliente; en
algunas versiones
de este modelo, la aplicación determina un rol de usuario o un nivel de acceso en el momento que
el usuario inicia
la sesión y a partir de este momento transmite esa información vía el cliente dentro de un campo
HTML form
oculto, una cookie o un parámetro predefinido de HTTP query string. Cuando se procesa cada una
de las subsiguientes solicitudes, la aplicación lee este parámetro de solicitud y decide qué acceso
otorgarle al usuario de manera acorde. Por ejemplo, un administrador que utiliza una aplicación
puede visualizar URLs que contienen parámetros ligados a su rol, mientras que los URLs
visualizados por usuarios ordinarios contienen parámetros diferentes, o ningún parámetro;
cualquier usuario que esté en conocimiento del parámetro asignado a los administradores puede
sencillamente declararlo en sus propias solicitudes y de esta manera obtener acceso a
funcionalidades
de administrador.
En algunas circunstancias, este tipo de control de acceso puede ser difícil de detectar si no se
utiliza la aplicación
como un usuario que posee alto nivel de privilegio y así identificar qué solicitudes se realizan;
existen técnicas que
permiten descubrir parámetros de solicitud ocultos que resultan exitosas en el descubrimiento del
mecanismo sólo
En otros modelos de control de acceso no seguros, la aplicación utiliza la cabecera HTTP ‘Referer’
en base a la
cual toma decisiones de control de acceso. Por ejemplo, una aplicación puede realizar un estricto
control de acceso
al menú principal de administración, en base a los privilegios de usuario; pero cuando un usuario
realiza una solicitud por una función de administración particular, la aplicación puede
simplemente chequear que esta solicitud
fue referenciada desde la página del menú de administración y asumir que, si es así, entonces el
usuario debe
haber accedido a dicha página y por lo tanto posee los privilegios requeridos. Desde ya que este
modelo es pasible
de ser quebrado debido a que la cabecera HTTP ‘Referer’ se encuentra completamente bajo
control del usuario,
al momento de examinar los controles de acceso de una aplicación incluyen: (i) ¿las
funcionalidades de la aplicación le otorgan acceso a usuarios particulares a un subconjunto
particular de datos que les pertenecen?; (ii) ¿existen diferentes niveles de usuarios, tales como
administradores, supervisores, invitados, entre otros, a los que se le
otorgan acceso a diferentes funcionalidades?; (iii) ¿los administradores utilizan una funcionalidad
que está construida dentro de la misma aplicación, la que tiene como finalidad configurar y
monitorear la propia aplicación?;
(iv) ¿es posible identificar qué funcionalidades o recursos de datos dentro de la aplicación
permiten escalar hasta
La manera más sencilla y efectiva de testear la efectividad de los controles de acceso de una
aplicación es acceder
a la aplicación utilizando diferentes cuentas, y determinar si los recursos y las funcionalidad que
pueden ser accedidas legítimamente por una cuenta pueden ser accedidas ilegítimamente por
otra.
A continuación se presenta una secuencia de acciones que se puede ejecutar para explotar el
conjunto de vulnerabilidades descriptas: (i) si la aplicación segrega el acceso de usuario en
diferentes niveles de funcionalidad, en
primer lugar se utilizará una cuenta alto privilegio para localizar todas las funcionalidades
disponibles y luego intentar acceder a las mismas utilizando una cuenta de menor privilegio; (ii) si
la aplicación segrega el acceso de
usuario a los diferentes recursos (tales como documentos), utilizar dos cuentas diferentes de nivel
de usuario para
se debe encontrar un documento que puede ser legítimamente accedido por un usuario pero no
por el otro, e intentar accederlo utilizando la cuenta del segundo usuario, ya sea mediante la
solicitud de un URL relevante o enviando los mismos parámetros POST dentro de la sesión del
segundo usuario); (iii) si es posible automatizar algunos
de estos testeos ejecutando una herramienta tipo spider dos o más veces sobre la aplicación,
utilizando un contexto de usuario diferentes cada vez, y también en un contexto que no requiere
autenticación (por ejemplo, ejecutar el
spider como administrador, y luego obtener un token de sesión para un usuario de menor
privilegio y volver a enviar los mismos vínculos pero reemplazando el token de sesión priviligiado
por el token de menor privilegio); (iv)
si al ejecutar la sesión con el spider como un usuario ordinario se descubren funcionalidades
privilegiadas a las
que sólo el administrador debería tener acceso, entonces esto puede representar una
vulnerabilidad (no obstante, la
todos los usuarios los mismos vínculos de navegación y devuelven un mensaje “acceso denegado”
(dentro de una
En caso que se disponga solamente de una cuenta de nivel de usuario con la cual se accede a la
aplicación (o no se
accede), entonces se requiere de un trabajo adicional para testear la efectividad de los controles
de acceso; de
hecho, para realizar un testeo abarcativo, se necesita realizar un trabajo más avanzado, cualquiera
sea el caso, debido a que puede exitir una funcionalidad pobremente protegida que no está
vinculada explícitamente desde la interface de ningún usuario de la aplicación (tal como una
funcionalidad antigua que no ha sido aún removida, o una
funcionalidad nueva que ya ha sido desplegada pero que aún no ha quedado disponible a los
usuarios).
Nuevamente, se presenta a continuación una secuencia de acciones que se puede ejecutar para
explotar el conjunto de vulnerabilidades en un contexto más exigente: (i) hacer uso de técnicas de
descubrimiento de contenido para
sensibles; (ii) cuando se identifican páginas de aplicación que probablemente presentan diferentes
funcionalidades
funcionalidad principales para las que el usuario en uso posee acceso, tratar de remover o de
modificar el contenido de dicha cabecera, y así determinar si la solicitud continúa resultado
exitosa; de no ser así, la aplicación puede
estar confiando en la cabecera HTTP ‘Referer’ de una manera no segura; (iv) analizar todos los
HTML y scripts
del lado del cliente para detectar referencias hacia funcionalidades ocultas o que se pueden
manipular del lado del
Una vez que se han enumerado todas las funcionalidades, resulta necesario testear si la
segregación por usuario
para el acceso a los recursos se encuentra garantizada; en cada instancia donde la aplicación le
otorga a un usuario
acceso a un subconjunto de recursos del mismo tipo (tales como documentos o correos
electrónicos), pueden existir oportunidades para que dicho usuario gane acceso no autorizado a
otros recursos.
En este contexto, se proponen los siguientes pasos de testeo: (i) cuando la aplicación emplea
identificadores de
cuál recurso está solicitando un usuario, intentar descubrir los identificadores para los que no se
posee acceso autorizado; (ii) si resulta posible generar una serie de tales identificadores en una
rápida sucesión (por ejemplo, mediante la creación de múltiples documentos u órdenes nuevos),
utilizar las técnicas indicadas anteriormente para
número relativamente pequeño, probar con otros números comprendidos en un rango cerrado, o
con números
aleatorios de la misma cantidad de dígitos; (iv) si se lograr establecer que los controles de acceso
son quebrables, y
que los identificadores de recurso son predecibles, se puede montar un ataque automatizado a fin
de recolectar recursos sensibles e información; se recomienda el empleo de técnicas bespoke
automatizadas.
En cada instancia en que una aplicación dé la impresión de estar forzando los controles de acceso
de manera efectiva, pero dicha impresión no resulte totalmente convincente, se la debe
comprobar más a fondo para determinar si
de acceso; (ii) tratar de determinar cualquier lugar donde la aplicación efectivamente asume que si
el usuario ha
alcanzado un punto particular, entonces debe haber arribado a través de medios legítimos; tratar
de alcanzar ese
punto por otras vías utilizando una cuenta de menor privilegio, a fin de detectar si es posible algún
tipo de ataque
de escalamiento de privilegios.
En caso que los recursos protegidos por la aplicación sean accedidos, en última instancia, a través
de URLs asociados a los propios archivos, se deberá testear si es posible que usuarios no
autorizados soliciten directamente estos URLs. Para ello se recomiendan los siguientes testeos: (i)
realizar el proceso normal que permite acceder a un
recurso estático protegido, a fin de obtener un ejemplo del URL mediante el que dicho recurso se
recupera finalmente; (ii) utilizando un contexto de diferente usuario (por ejemplo, un usuario de
menor o ningún privilegio sobre el recurso) intentar acceder al mismo en forma directa empleando
el URL identificado; (iii) si este ataque resulta exitoso, intentar comprender el esquema de nombre
que está siendo usado para los archivos estáticos protegidos y, si es posible, construir un ataque
automatizado para “rastrillar” la aplicación en busca de contenido que
Los controles de acceso es una de las áreas de seguridad de aplicaciones web que resulta más fácil
de comprender,
de su implementación. En primer lugar, existen muchas trampas que se deben evitar, las que
generalmente surgen
misma: (i) no contar con la ignorancia de los usuarios respecto de los URLs o de los identificadores
utilizados para especificar los recursos de la aplicación, sino asumir que conocen todos los URLs y
los identificadores empleados por la aplicación, y asegurar que los controles de acceso de la
misma son suficientes por sí mismos para prevenir accesos no autorizados; (ii) no confiar en
ningún parámetro enviado por el usuario para conceder privilegios
de acceso; (iii) no asumir que los usuarios accederán a las páginas de la aplicación solamente en la
secuencia prevista; (iv) no confiar en que el usuario no manipula indebidamente los datos que son
transmitidos a través del
cliente, y si algunos de estos datos han sido validados y luego transmitidos, no basarse en los datos
transmitidos
efectivos dentro de las aplicaciones web: (1) evaluar y documentar explícitamente los
requerimientos de control
de acceso para cada funcionalidad de la aplicación; se debe incluir tanto quién puede legitimar el
uso de la funcionalidad y a qué recursos pueden acceder los usuarios particulares a través de la
funcionalidad; (2) conducir las decisiones de control de acceso desde la sesión de usuario; (3)
utilizar un componente de aplicación centralizado para verificar los controles de acceso; (4)
procesar todas las solicitudes de cada cliente particular a través de este
componente, a fin de validar que el usuario que está realizando la solicitud tiene permitido el
acceso a la funcionalidad y a los recursos solicitados; (5) utilizar técnicas sistemáticas para
asegurar que no existen excepciones al
punto anterior; una solución efectiva es obligar a que todas las páginas de la aplicación
implementen una interface
que es consultada por el mecanismo de control de acceso centralizado; de esta manera, al obligar
a los desarrolladores a codificar explícitamente la lógica de control de acceso en todas las páginas,
no habrá excusas ante omisiones; (6) en el caso de una funcionalidad particularmente sensible, tal
como páginas de administración, y en caso
que se trate de una intranet, se pueden establecer restricciones de acceso adicionales basadas en
alguna información única del puesto de trabajo, a fin de asegurar que sólo los usuarios ubicados
en dichos puestos tienen la capacidad de acceder a la funcionalidad, independientemente de la
identidad conque han iniciado la sesión; (7) si se
necesita proteger contenido estático, existen dos métodos para proporcionar acceso a los mismos:
(i) los archivos
estáticos pueden ser accedidos indirectamente mediante el pasaje de un nombre de archivo a una
página dinámica
del lado del servidor, la que implementa la lógica de control de acceso; (ii) el acceso directo a
archivos dinámicos
puede ser controlado utilizando autenticación HTTP u otras características del servidor de
aplicación para encapsular la solicitud y chequear los permisos para el recurso antes de otorgar
acceso; (8) los identificadores que especifican a cuál recurso desea acceder un usuario son
vulnerables de manipulación siempre que son transmitidos a
través del cliente; los servidores sólo deberán confiar en la integridad de los datos del lado del
servidor; en cada
oportunidad que los identificadores son transmitidos a través del cliente, necesitan ser revalidados
a fin de asegurar que el usuario está autorizado a acceder al recurso solicitado; (9) en el caso de
funcionalidades de aplicaciones
registrar todos los eventos de acceso a datos sensibles o de acciones sensibles que se ejecutan;
estos registros permiten la detección y la investigación de potenciales brechas en el control de
acceso.
base poco sistemática, adicionando código a las páginas individuales en aquellos casos que hayan
registrado un
requerimiento de algún tipo de control de acceso, cortando y pegando el mismo código de una
página a otra para
en el mecanismo de control de acceso resultante: muchos casos en los que se requieren controles
son pasados por
alto, los controles diseñados para un área pueden no operar de la manera esperada en otra área, y
las modificaciones introducidas en algunos lugares de la aplicación pueden quebrar los controles
existentes al ser violadas las suposiciones en las que se basan éstos.
A diferencia de esta solución, el método que se describió anteriormente que hace uso de un
componente de aplicación centralizado para forzar la aplicación de los controles de acceso posee
muchos beneficios: (1) incrementa la
claridad de los controles de acceso dentro de la aplicación, y de esta manera permite que los
diferentes desarrolladores comprendan más rápidamente los controles realizados por los demás;
(2) vuelve más eficiente y confiable el
mantenimiento, ya que la mayoría de los cambios necesitarán aplicarse una sola vez, a un único
componente compartido, y no requerirá ser replicado en múltiples lugares; (3) mejora la
adaptabilidad, de tal manera que a medida
que van surgiendo nuevos requerimientos de control de acceso se los puede reflejar fácilmente a
través de la interface de aplicación existente implementada por cada página de aplicación; (4)
presenta una menor cantidad de errores y omisiones que si el código de control de acceso
estuviera implementado por partes a lo largo de toda la aplicación
Los inconvenientes relacionados con el acceso no sólo incumben a las aplicaciones web en sí
mismas sino tam-
en comprometer las defensas de una capa, el ataque aún puede ser bloqueado por las defensas de
otra capa.
URL path completo en base a los roles de usuario definidos en la capa del servidor de aplicación;
(ii) la aplicación
puede emplear una cuenta de base de datos diferente cuando realiza acciones de diferentes
usuarios (para los usuarios que sólo consultan datos, se deberá utilizar una cuenta con privilegios
de sólo lectura); (iii) se puede implementar control fine-grained sobre el acceso a las diferentes
tablas de la base de datos dentro de la misma base, utilizando una tabla de privilegios; (iv) las
cuentas de sistema operativos que se utilizan para ejecutar cada componente dentro de la
infraestructura deben estar restringidas a los mínimos privilegios que requiere el componente.
En el caso de una aplicación compleja con requerimientos críticos de seguridad, este tipo de
defensas en profundidad se puede diseñar con la ayuda de una matriz, en la que se definen los
diferentes roles de usuario dentro de la
aplicación y los diferentes privilegios, en cada capa, que deberían se asignados a cada rol.
Dentro de un modelo de seguridad de este tipo, se puede observar el uso de varios conceptos
relativos al control
de acceso [6]: (1) control sistemático, la matriz de privilegios individuales se almacena como una
tabla dentro de
la base de datos, y se aplica en forma sistemática para forzar las decisiones de control de acceso;
la clasificación
de los roles de usuario proporciona un medio rápido para la realización de ciertas verificaciones de
control de acceso, y esto también se aplica de manera sistemática; este tipo de control puede
alcanzar un nivel de granularidad
muy fino y se puede conformar una lógica arbitrariamente compleja embebida dentro del proceso
de toma de decisión de control de acceso que forma parte de la aplicación; (2) control de acceso
discrecional (DAC), existen
dos modelos: (i) DAC cerrado, en el cual el acceso está denegado a menos que se otorgue
explícitamente, y (ii)
DAC abierto, en el que el acceso está permitido a menos que lo quite explícitamente; (3) control
de acceso basado en rol (RBAC), en el que existen roles con nombres, los cuales contienen
diferentes conjuntos de privilegios
particulares, y cada usuario está asignado a uno de estos roles; ésta es una vía rápida para la
asignación y aplicación forzada de los diferentes privilegios y es necesario para ayudar en la
gestión del control de acceso en aplicaciones complejas; el empleo de roles para la verficación
anticipada de acceso de las solicitudes de usuario permite
que muchas solicitudes no autorizadas sean rápidamente rechazadas con una mínima cantidad de
procesamiento
(un ejemplo de esta solución es la protección de URL paths a los que pueden acceder un tipo de
usuario específico); cuando se diseñan mecanismos de control basado en roles, resulta necesario
balancear el número de roles de
tal manera que sigan siendo una herramiento útil en la gestión de privilegios dentro de un
aplicación; (4) control
declarativo, emplea diferentes cuentas para los diferentes grupos de usuarios, y cada cuenta
posee el mínimo nivel
de privilegio necesario para llevar a cabo las acciones que el grupo correspondiente tiene
permitido ejecutar; este
tipo de controles se declaran por fuera de la aplicación; aún en el caso que un usuario descubra
una brecha en los
controles de acceso implementados dentro de la capa de aplicación tal que le permita ejecutar
una acción sensible
(como adicionar una usuario nuevo) se verá impedido de hacerlo debido a que la cuenta de base
de datos que está
utilizando no posee los privilegios requeridos dentro de la misma; un medio diferente de aplicar
control de acceso
declarativo existe en la capa del servidor de aplicación, vía el empleo de descriptores de archivos,
los cuales se
aplican durante el proceso de despliegue de la aplicación; sin embargo, éstos pueden ser
instrumentos relativamente toscos, que no siempre escalan adecuadamente en la gestión de
privilegios de granulometría fina existentes
Cuando se intenta atacar una aplicación que emplea un modelo de privilegios multi-capa de este
tipo, es probable
que puedan ser prevenidos muchos de los errores más obvios que se producen en el empleo de
controles de acceso; lo que se debe determinar es que si se eluden los controles implementados
dentro de la aplicación resulta imposible ir mucho más allá debido a la protección existente en
otras capas; con esto en mente, aún están disponibles
líneas de ataques potenciales. Lo más importante es comprender las limitaciones de cada tipo de
control, y en qué
susceptible de ataques basados en inyección; (ii) los roles definidos en la capa de aplicación a
menudo están toscamente definidos y pueden ser incompletos; (iii) cuando los componentes de
aplicación se ejecutan utilizando
cuentas del sistema operativo con bajos privilegios, las mismas aún pueden poseer la capacidad de
muchos tipos
de datos potenciales sensibles dentro del sistema de archivos del servidor; cualquier
vulnerabilidad que otorgue
arbitrariamente acceso a los archivos aún se puede ser explotadas; (iv) las vulnerabilidades
existentes en el software del servidor de aplicación por lo general serán capaces de hacer fracasar
todos los controles de acceso implementados dentro de la capa de aplicación; no obstante, aún
puede persistir un acceso limitado a la base de datos y
al sistema operativo; (v) una única vulnerabilidad explotable en el control de acceso ubicada en el
lugar preciso
descubre una manera de modificar el rol asociado al usuario con que se está llevando adelante el
ataque, entonces
es posible que volviendo a iniciar la sesión con dicha cuenta se le otorgue un acceso mejorado
tanto a la capa de
están están plagadas de vulnerabilidades [7, 8]. Comprender las amenazas de seguridad que se
ciernen sobre estas
Esto significa que los detalles del alcance de la seguridad de las aplicaciones web no es estático; en
tanto las vulnerabilidades más antiguas y bien comprendidas, tal como inyección de SQL,
continúan apareciendo, su preponderancia está disminuyendo gradualmente. Más aún, las
instancias que aún perduran se están volviendo más difíciles de encontrar y de explotar. Se está
investigando muy activamente en técnicas avanzadas que atacan manifestaciones más sutiles de
vulnerabilidades que hace algunos años podían ser muy fácilmente detectadas y explotadas
del servidor de la aplicación hacia los usuarios. Los últimos tipos de ataques aún aprovechan
defectos dentro de la
aplicación misma, pero que generalmente involucran algún tipo de interacción con otro usuario y
comprometen
las acciones del mismo con la aplicación vulnerable. Esta es una tendencia que se está
reproduciendo en otras área
campo de batalla clave en el que continúa el proceso de aprendizaje. De todos los ataques
existentes, aquéllos contra otros usuarios están evolucionando más rápidamente, y son objeto de
la mayoría de las investigaciones en la
actualidad.
¿En qué se basa esta relevancia significativa de la que gozan las aplicaciones web? Son varios los
factores técnicos y comerciales que colaboran en la revolución ocurrida en la manera de cómo se
utilizar la Internet: (i) HTTP,
el protocolo de comunicaciones central para acceder al World Wide Web, es liviano y sin-
conexión; introduce resiliencia en la comunicación de eventos de error y evita la necesidad que el
servidor mantenga abierta una conexión de red para cada usuario como es en el caso de muchas
aplicaciones legacy cliente-servidor; además,
HTTP puede ser proxeado y tunelizado con otros protocolos, haciendo posible una comunicación
segura en cualquier configuración distribuida; (ii) todos los usuarios web ya cuentan con un
navegador instalado en su puesto de
trabajo; las aplicaciones web despliegan su interface de usuario dinámicamente dentro del
contexto del navegador,
scripting del lado del cliente permite que las aplicaciones muevan parte de su procesamiento hacia
el lado del
cliente, y las capacidades de los navegadores se puedan extender de manera arbitraria utilizando
componentes del
cliente delgado donde resulte necesario; (iv) las tecnologías y los lenguajes básicos utilizados para
desarrollar aplicaciones web son relativamente simples; se dispone de un amplio rango de
plataformas y herramientas de desarrollo que facilitan la construcción de aplicaciones de alta
eficacia por parte de desarrolladores de relativa experiencia, y se puede acceder a una importante
cantidad de código fuente abierto y otros recursos para su incorporación en aplicaciones
desarrolladas a medida.
Al igual que con cualquier tecnología nueva, las aplicaciones web vienen acompañadas con una
nueva variedad
al momento del desarrollo de las aplicaciones, y, a su vez, han surgido nuevas tecnologías que
introdujeron nuevas posibilidades de explotación. Por otra parte, algunos problemas han perdido
importancia en la medida que se
Quiebre de los controles de acceso (78%). Esto comprende los casos en que la aplicación fracaza
en proteger adecuadamente el acceso a sus datos y sus funcionalidades, potencialmente
permitiendo que un atacante
visualice datos sensibles de otro usuario hospedados en el servidor, o lleve a cabo acciones
privilegiadas.