Los codificadores conquistan la infraestructura de seguridad como serie de código: El control de acceso a nivel de función que falta

Publicado el 11 de mayo de 2020
por el doctor Matias Madou
ESTUDIO DE CASO

Los codificadores conquistan la infraestructura de seguridad como serie de código: El control de acceso a nivel de función que falta

Publicado el 11 de mayo de 2020
por el doctor Matias Madou
Ver recurso
Ver recurso

Ha llegado el momento de la siguiente entrega de nuestra serie Infrastructure as Code, los blogs que llevarán a los desarrolladores como usted a un nivel completamente nuevo de conciencia de la seguridad a la hora de desplegar una infraestructura segura dentro de su propia organización.

Ah, por cierto... ¿cómo te fue con el reto de la desconfiguración de seguridad en el blog anterior? Si quieres seguir adelante y abordar una vulnerabilidad de control de acceso de nivel funcional que falta ahora mismo, dirígete a la plataforma:

(El enlace anterior le llevará al desafío de Kubernetes, pero una vez que esté en la plataforma, utilice el menú desplegable para elegir también entre Ansible, CloudFormation, Terraform o Docker. Tú eliges).

Casi todas las aplicaciones desplegadas hoy en día tienen algún tipo de mecanismo de control de acceso que comprueba si un usuario tiene o no permiso para realizar las funciones solicitadas. Es prácticamente la piedra angular de una buena seguridad, además de la funcionalidad, cuando se crea una aplicación. De hecho, todas las aplicaciones web necesitan controles de acceso para que usuarios con diferentes privilegios puedan utilizar el programa.

Sin embargo, pueden surgir problemas cuando esas mismas funciones de verificación para el control de acceso no se realizan a nivel de la infraestructura, o están mal configuradas. Sin un control de acceso a nivel de infraestructura en perfecto orden, se abre toda una empresa a los piratas informáticos, que pueden utilizar esa vulnerabilidad como su puerta de entrada para el fisgoneo no autorizado o un ataque completo.

De hecho, explotar las vulnerabilidades de control de acceso a funciones ausentes o mal configuradas es extremadamente fácil. Los atacantes ni siquiera necesitan ser demasiado hábiles. Sólo necesitan saber qué comandos ejecutan funciones dentro de cualquier marco que soporte la aplicación. Si lo saben, es sólo una cuestión de prueba y error. Pueden enviar continuamente peticiones que no deberían estar permitidas, y en cuanto una de ellas tenga éxito, el sitio web, la aplicación, el servidor o incluso toda la red en cuestión podrían quedar expuestos.

¿Cómo funcionan los exploits de control de acceso a nivel de funciones faltantes?

Hay algunas formas en las que los controles de acceso a nivel de función pueden colarse en una organización. Por ejemplo, el acceso a nivel de función puede dejarse en manos de una aplicación y no ser verificado por la infraestructura subyacente. O bien, el control de acceso a nivel de infraestructura puede estar mal configurado. En algunos casos, los administradores asumen que los usuarios no autorizados no sabrán cómo llegar a los recursos de la infraestructura que sólo los usuarios de nivel superior deberían poder ver y utilizan un modelo de "seguridad por oscuridad" que rara vez funciona.

Para un ejemplo de seguridad por oscuridad, la siguiente URL es probablemente vulnerable a un ataque:

http://companywebsite.com/app/NormalUserHomepage

Si un usuario autentificado emplea una técnica llamada Forced URL Browsing, podría intentar llegar a una página que sólo se muestra a los administradores. Un ejemplo podría ser:

http://companywebsite.com/app/AdminPages

Si no existe una verificación del lado del servidor, simplemente se les mostrará la página de administración (si su nombre coincide con la solicitud) y entonces tendrán acceso a cualquier función adicional que los administradores hagan desde la nueva página. Si el servidor devuelve un error de "página no encontrada" al atacante, éste puede simplemente seguir intentándolo hasta que descubra el nombre de la página de administración.

Para los atacantes, explotar la falta de controles de acceso a nivel de función es un proceso similar. En lugar de intentar navegar por páginas no autorizadas, envían solicitudes de funciones. Por ejemplo, podrían intentar crear un nuevo usuario con derechos de administrador. Así que su solicitud sería algo así, dependiendo del marco de trabajo:

POST/action/createuser name=hacker&pw=password&role=admin

Si no existe un control de acceso a nivel de función, entonces el ejemplo anterior tendría éxito y se crearía una nueva cuenta de administrador. Una vez que el atacante vuelva a iniciar sesión como el nuevo administrador, tendría el mismo acceso y permisos que cualquier otro administrador en esa red o servidor.

La solución a la falta de controles de acceso a nivel de función

Debido a que es tan fácil para los atacantes explotar las vulnerabilidades de control de acceso a nivel de funciones faltantes, es crítico que se encuentren, se arreglen y se prevengan. Afortunadamente, esto no es excesivamente difícil con algunos conocimientos y una formación básica en seguridad de la Infraestructura como Código.

La principal protección vendrá de la implementación de la autorización basada en roles a nivel de infraestructura. Nunca confíes en que las aplicaciones se encarguen de esa función. Incluso si lo hacen, tener una autorización del lado de la infraestructura garantizará que no se pierda nada. Lo ideal es que la autorización provenga de un lugar centralizado (por ejemplo, AWS IAM, Azure IAM, etc.) que se incorpore a la rutina de su organización y se aplique a cada nueva aplicación. Estos procesos de autorización pueden provenir del propio framework o de cualquier número de módulos externos fáciles de usar.

Por último, su organización debería adoptar el concepto de mínimo privilegio. Todas las acciones y funciones deben ser denegadas por defecto, y el proceso de autorización debe utilizarse para dar a los usuarios válidos permiso para hacer lo que necesiten. Sólo se les debe dar el permiso suficiente para realizar la función requerida, y sólo durante el tiempo necesario.

La falta de controles de acceso a nivel de función puede ser devastadora. Pero, afortunadamente, si incorpora a su organización buenas prácticas de autorización a nivel de infraestructura, puede evitar fácilmente que este problema se produzca.

¿Crees que estás preparado para detectar un error de control de acceso en la naturaleza? Compara estos fragmentos de código de Docker; uno vulnerable y otro seguro:


Vulnerable:

FROM quay.io/prometheus/busybox:latest
ARG VERSION=0.12.1
ARG FILENAME=mysqld_exporter-${VERSION}.linux-amd64
ARG URL=https://github.com/prometheus/mysqld_exporter/releases/download/v
RUN wget $URL$VERSION/$FILENAME.tar.gz && \
   tar -xvf $FILENAME.tar.gz && \
   mv $FILENAME/mysqld_exporter /bin/mysqld_exporter
COPY .my.cnf /home/.my.cnf
COPY ./scripts/entrypoint.sh ~/entrypoint.sh
USER root
EXPOSE 9104
ENTRYPOINT  [ "sh", "~/entrypoint.sh" ]
CMD  [ "/bin/mysqld_exporter" ]

Seguro:

FROM quay.io/prometheus/busybox:latest
ARG VERSION=0.12.1
ARG FILENAME=mysqld_exporter-${VERSION}.linux-amd64
ARG URL=https://github.com/prometheus/mysqld_exporter/releases/download/v
RUN wget $URL$VERSION/$FILENAME.tar.gz && \
   tar -xvf $FILENAME.tar.gz && \
   mv $FILENAME/mysqld_exporter /bin/mysqld_exporter
COPY .my.cnf /home/.my.cnf
COPY ./scripts/entrypoint.sh ~/entrypoint.sh
USER nobody
EXPOSE 9104
ENTRYPOINT  [ "sh", "~/entrypoint.sh" ]
CMD  [ "/bin/mysqld_exporter" ]

Aprende más, desafíate a ti mismo

Consulte las páginas del Secure Code Warrior páginas del blog para obtener más información sobre esta vulnerabilidad y sobre cómo proteger a su organización y a sus clientes de los estragos de otros fallos y vulnerabilidades de seguridad.

Y si te lo perdiste antes, puedes probar un reto de seguridad gamificado de IaC en la plataforma Secure Code Warrior para mantener todos tus conocimientos de ciberseguridad perfeccionados y actualizados.

Estén atentos al próximo capítulo.

Ver recurso
Ver recurso

Autor

Doctor Matias Madou

Matías es un investigador y desarrollador con más de 15 años de experiencia práctica en seguridad de software. Ha desarrollado soluciones para empresas como Fortify Software y su propia empresa Sensei Security. A lo largo de su carrera, Matías ha dirigido múltiples proyectos de investigación sobre seguridad de aplicaciones que han dado lugar a productos comerciales y cuenta con más de 10 patentes en su haber. Cuando está lejos de su escritorio, Matias ha servido como instructor para la formación de seguridad de aplicaciones avanzadas courses y regularmente habla en conferencias mundiales como la Conferencia RSA, Black Hat, DefCon, BSIMM, OWASP AppSec y BruCon.

Matías es doctor en Ingeniería Informática por la Universidad de Gante, donde estudió la seguridad de las aplicaciones mediante la ofuscación de programas para ocultar el funcionamiento interno de una aplicación.

¿Quieres más?

Sumérjase en nuestras últimas ideas sobre codificación segura en el blog.

Nuestra amplia biblioteca de recursos tiene como objetivo potenciar el enfoque humano de la mejora de la codificación segura.

Ver blog
¿Quieres más?

Obtenga las últimas investigaciones sobre la seguridad impulsada por los desarrolladores

Nuestra amplia biblioteca de recursos está repleta de recursos útiles, desde libros blancos hasta seminarios web, que le ayudarán a iniciarse en la codificación segura orientada a los desarrolladores. Explórela ahora.

Centro de recursos

Los codificadores conquistan la infraestructura de seguridad como serie de código: El control de acceso a nivel de función que falta

Publicado el 11 de mayo de 2020
Por el doctor Matias Madou

Ha llegado el momento de la siguiente entrega de nuestra serie Infrastructure as Code, los blogs que llevarán a los desarrolladores como usted a un nivel completamente nuevo de conciencia de la seguridad a la hora de desplegar una infraestructura segura dentro de su propia organización.

Ah, por cierto... ¿cómo te fue con el reto de la desconfiguración de seguridad en el blog anterior? Si quieres seguir adelante y abordar una vulnerabilidad de control de acceso de nivel funcional que falta ahora mismo, dirígete a la plataforma:

(El enlace anterior le llevará al desafío de Kubernetes, pero una vez que esté en la plataforma, utilice el menú desplegable para elegir también entre Ansible, CloudFormation, Terraform o Docker. Tú eliges).

Casi todas las aplicaciones desplegadas hoy en día tienen algún tipo de mecanismo de control de acceso que comprueba si un usuario tiene o no permiso para realizar las funciones solicitadas. Es prácticamente la piedra angular de una buena seguridad, además de la funcionalidad, cuando se crea una aplicación. De hecho, todas las aplicaciones web necesitan controles de acceso para que usuarios con diferentes privilegios puedan utilizar el programa.

Sin embargo, pueden surgir problemas cuando esas mismas funciones de verificación para el control de acceso no se realizan a nivel de la infraestructura, o están mal configuradas. Sin un control de acceso a nivel de infraestructura en perfecto orden, se abre toda una empresa a los piratas informáticos, que pueden utilizar esa vulnerabilidad como su puerta de entrada para el fisgoneo no autorizado o un ataque completo.

De hecho, explotar las vulnerabilidades de control de acceso a funciones ausentes o mal configuradas es extremadamente fácil. Los atacantes ni siquiera necesitan ser demasiado hábiles. Sólo necesitan saber qué comandos ejecutan funciones dentro de cualquier marco que soporte la aplicación. Si lo saben, es sólo una cuestión de prueba y error. Pueden enviar continuamente peticiones que no deberían estar permitidas, y en cuanto una de ellas tenga éxito, el sitio web, la aplicación, el servidor o incluso toda la red en cuestión podrían quedar expuestos.

¿Cómo funcionan los exploits de control de acceso a nivel de funciones faltantes?

Hay algunas formas en las que los controles de acceso a nivel de función pueden colarse en una organización. Por ejemplo, el acceso a nivel de función puede dejarse en manos de una aplicación y no ser verificado por la infraestructura subyacente. O bien, el control de acceso a nivel de infraestructura puede estar mal configurado. En algunos casos, los administradores asumen que los usuarios no autorizados no sabrán cómo llegar a los recursos de la infraestructura que sólo los usuarios de nivel superior deberían poder ver y utilizan un modelo de "seguridad por oscuridad" que rara vez funciona.

Para un ejemplo de seguridad por oscuridad, la siguiente URL es probablemente vulnerable a un ataque:

http://companywebsite.com/app/NormalUserHomepage

Si un usuario autentificado emplea una técnica llamada Forced URL Browsing, podría intentar llegar a una página que sólo se muestra a los administradores. Un ejemplo podría ser:

http://companywebsite.com/app/AdminPages

Si no existe una verificación del lado del servidor, simplemente se les mostrará la página de administración (si su nombre coincide con la solicitud) y entonces tendrán acceso a cualquier función adicional que los administradores hagan desde la nueva página. Si el servidor devuelve un error de "página no encontrada" al atacante, éste puede simplemente seguir intentándolo hasta que descubra el nombre de la página de administración.

Para los atacantes, explotar la falta de controles de acceso a nivel de función es un proceso similar. En lugar de intentar navegar por páginas no autorizadas, envían solicitudes de funciones. Por ejemplo, podrían intentar crear un nuevo usuario con derechos de administrador. Así que su solicitud sería algo así, dependiendo del marco de trabajo:

POST/action/createuser name=hacker&pw=password&role=admin

Si no existe un control de acceso a nivel de función, entonces el ejemplo anterior tendría éxito y se crearía una nueva cuenta de administrador. Una vez que el atacante vuelva a iniciar sesión como el nuevo administrador, tendría el mismo acceso y permisos que cualquier otro administrador en esa red o servidor.

La solución a la falta de controles de acceso a nivel de función

Debido a que es tan fácil para los atacantes explotar las vulnerabilidades de control de acceso a nivel de funciones faltantes, es crítico que se encuentren, se arreglen y se prevengan. Afortunadamente, esto no es excesivamente difícil con algunos conocimientos y una formación básica en seguridad de la Infraestructura como Código.

La principal protección vendrá de la implementación de la autorización basada en roles a nivel de infraestructura. Nunca confíes en que las aplicaciones se encarguen de esa función. Incluso si lo hacen, tener una autorización del lado de la infraestructura garantizará que no se pierda nada. Lo ideal es que la autorización provenga de un lugar centralizado (por ejemplo, AWS IAM, Azure IAM, etc.) que se incorpore a la rutina de su organización y se aplique a cada nueva aplicación. Estos procesos de autorización pueden provenir del propio framework o de cualquier número de módulos externos fáciles de usar.

Por último, su organización debería adoptar el concepto de mínimo privilegio. Todas las acciones y funciones deben ser denegadas por defecto, y el proceso de autorización debe utilizarse para dar a los usuarios válidos permiso para hacer lo que necesiten. Sólo se les debe dar el permiso suficiente para realizar la función requerida, y sólo durante el tiempo necesario.

La falta de controles de acceso a nivel de función puede ser devastadora. Pero, afortunadamente, si incorpora a su organización buenas prácticas de autorización a nivel de infraestructura, puede evitar fácilmente que este problema se produzca.

¿Crees que estás preparado para detectar un error de control de acceso en la naturaleza? Compara estos fragmentos de código de Docker; uno vulnerable y otro seguro:


Vulnerable:

FROM quay.io/prometheus/busybox:latest
ARG VERSION=0.12.1
ARG FILENAME=mysqld_exporter-${VERSION}.linux-amd64
ARG URL=https://github.com/prometheus/mysqld_exporter/releases/download/v
RUN wget $URL$VERSION/$FILENAME.tar.gz && \
   tar -xvf $FILENAME.tar.gz && \
   mv $FILENAME/mysqld_exporter /bin/mysqld_exporter
COPY .my.cnf /home/.my.cnf
COPY ./scripts/entrypoint.sh ~/entrypoint.sh
USER root
EXPOSE 9104
ENTRYPOINT  [ "sh", "~/entrypoint.sh" ]
CMD  [ "/bin/mysqld_exporter" ]

Seguro:

FROM quay.io/prometheus/busybox:latest
ARG VERSION=0.12.1
ARG FILENAME=mysqld_exporter-${VERSION}.linux-amd64
ARG URL=https://github.com/prometheus/mysqld_exporter/releases/download/v
RUN wget $URL$VERSION/$FILENAME.tar.gz && \
   tar -xvf $FILENAME.tar.gz && \
   mv $FILENAME/mysqld_exporter /bin/mysqld_exporter
COPY .my.cnf /home/.my.cnf
COPY ./scripts/entrypoint.sh ~/entrypoint.sh
USER nobody
EXPOSE 9104
ENTRYPOINT  [ "sh", "~/entrypoint.sh" ]
CMD  [ "/bin/mysqld_exporter" ]

Aprende más, desafíate a ti mismo

Consulte las páginas del Secure Code Warrior páginas del blog para obtener más información sobre esta vulnerabilidad y sobre cómo proteger a su organización y a sus clientes de los estragos de otros fallos y vulnerabilidades de seguridad.

Y si te lo perdiste antes, puedes probar un reto de seguridad gamificado de IaC en la plataforma Secure Code Warrior para mantener todos tus conocimientos de ciberseguridad perfeccionados y actualizados.

Estén atentos al próximo capítulo.

Nos gustaría contar con su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación segura. Siempre trataremos sus datos personales con el máximo cuidado y nunca los venderemos a otras empresas con fines de marketing.

Enviar
Para enviar el formulario, habilite las cookies "Analytics". Siéntase libre de desactivarlas de nuevo una vez que haya terminado.