Los codificadores conquistan la infraestructura de seguridad como serie de código: El control de acceso a nivel de función que falta
Los codificadores conquistan la infraestructura de seguridad como serie de código: El control de acceso a nivel de función que falta
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.
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.
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.
Los codificadores conquistan la infraestructura de seguridad como serie de código: El control de acceso a nivel de función que falta
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.