¿Cómo comprobar si existen vulnerabilidades en tus imágenes Dockers?

By albert
2 Ene 2020

En la entrada de hoy os vamos a hablar de AquaAqua, es una solución capaz de incorporarse a nuestra cadena de CI/CD para añadir seguridad a nuestro despliegue y proporcionarnos seguridad a tiempo real en los entornos convencionales, basados en containers e incluso en soluciones serverless. 
Hoy, para introducirnos a esta solución, os presentaremos Microscanner, una solución OpenSource. Microscanner permite verificar las imágenes docker y buscar en ellas las vulnerabilidades conocidas. ¿Que podemos obtener de esto? Si hacemos un buen control de las imágenes que estamos usando  antes de ser publicadas, podremos detectar antes los fallos y reducir el riesgo de ser atacados. Parece perfecto ¿no? Pero ¿Y cómo podemos poner esto en práctica? Muy fácil. Para hacerlo debemos obtener un token de Aqua. Tenemos 2 métodos para conseguirlo:

  • Desde la página web
  • Vía comandos: $ docker run –rm -it aquasec/microscanner –register <email address>

En los dos métodos, Aqua nos mandará un correo eléctronico con nuestro token.
Y ahora un ejemplo práctico. Imaginémonos que nuestros contenedores están basados en la distribución Alpine de Linux y empiezan de la siguiente manera:

FROM alpine:3.3

Como véis, es una versión antigua… y algo nos hace suponer que vulnerable. ¡Veámoslo!
Lo primero que debemos hacer es añadir a nuestro Dockerfile las líneas para ejecutar Microscanner cuando estemos construyendo nuestra imágen:

RUN apk add –no-cache ca-certificates && update-ca-certificates

ADD https://get.aquasec.com/microscanner /

RUN chmod +x /microscanner

ARG token

RUN /microscanner ${token}

Posteriormente, en la ejecución del comando $docker build –build-arg=token=<token> –no-cache ., veremos si la imágen que estamos construyendo tiene o no vulnerabilidades.
Aquí la salida del comando:

2019-11-18 21:39:34.279 INFO Contacting CyberCenter… {«registry»: «», «image»: «»}

2019-11-18 21:39:34.954 INFO CyberCenter connection established {«registry»: «», «image»: «», «api_version»: «4»}

2019-11-18 21:39:35.246 INFO Processing results… {«registry»: «», «image»: «»}

2019-11-18 21:39:35.980 INFO Applying image assurance policies… {«registry»: «», «image»: «»}

{

  «scan_started»: {

    «seconds»: 1574113173,

    «nanos»: 860814600

  },

  «scan_duration»: 2,

  «digest»: «1c9a6f618dc0090e9969bb497f06ae87b934b8cbde810d8c36176c9e060f50e8»,

  «os»: «alpine»,

  «version»: «3.3.3»,

  «resources»: [

    {

      «resource»: {

        «format»: «apk»,

        «name»: «busybox»,

        «version»: «1.24.2-r2»,

        «arch»: «x86_64»,

        «cpe»: «pkg:/alpine:3.3.3:busybox:1.24.2-r2»,

        «license»: «GPL2»,

        «name_hash»: «1a0be787cebd01a5ca5d163e1502c1c6»

      },

      «scanned»: true,

      «vulnerabilities»: [

        {

          «name»: «CVE-2015-9261»,

          «description»: «huft_build in archival/libarchive/decompress_gunzip.c in BusyBox before 1.27.2 misuses a pointer, causing segfaults and an application crash during an unzip operation on a specially crafted ZIP file.»,

          «nvd_score»: 4.3,

          «nvd_score_version»: «CVSS v2»,

          «nvd_vectors»: «AV:N/AC:M/Au:N/C:N/I:N/A:P»,

          «nvd_severity»: «medium»,

          «nvd_url»: «https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-9261»,

          «vendor_score»: 4.3,

          «vendor_score_version»: «CVSS v2»,

          «vendor_vectors»: «AV:N/AC:M/Au:N/C:N/I:N/A:P»,

          «vendor_severity»: «medium»,

          «publish_date»: «2018-07-26»,

          «modification_date»: «2018-09-24»,

          «nvd_score_v3»: 5.5,

          «nvd_vectors_v3»: «CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H»,

          «nvd_severity_v3»: «medium»

        },

        {

          «name»: «CVE-2016-2147»,

          «description»: «Integer overflow in the DHCP client (udhcpc) in BusyBox before 1.25.0 allows remote attackers to cause a denial of service (crash) via a malformed RFC1035-encoded domain name, which triggers an out-of-bounds heap write.»,

          «nvd_score»: 5,

          «nvd_score_version»: «CVSS v2»,

          «nvd_vectors»: «AV:N/AC:L/Au:N/C:N/I:N/A:P»,

          «nvd_severity»: «medium»,

          «nvd_url»: «https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2147»,

          «vendor_score»: 5,

          «vendor_score_version»: «CVSS v2»,

          «vendor_vectors»: «AV:N/AC:L/Au:N/C:N/I:N/A:P»,

          «vendor_severity»: «medium»,

          «publish_date»: «2017-02-09»,

          «modification_date»: «2018-07-27»,

          «nvd_score_v3»: 7.5,

          «nvd_vectors_v3»: «CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H»,

          «nvd_severity_v3»: «high»

        },

        {

          «name»: «CVE-2016-2148»,

          «description»: «Heap-based buffer overflow in the DHCP client (udhcpc) in BusyBox before 1.25.0 allows remote attackers to have unspecified impact via vectors involving OPTION_6RD parsing.»,

          «nvd_score»: 7.5,

          «nvd_score_version»: «CVSS v2»,

          «nvd_vectors»: «AV:N/AC:L/Au:N/C:P/I:P/A:P»,

          «nvd_severity»: «high»,

          «nvd_url»: «https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2148»,

          «vendor_score»: 7.5,

          «vendor_score_version»: «CVSS v2»,

          «vendor_vectors»: «AV:N/AC:L/Au:N/C:P/I:P/A:P»,

          «vendor_severity»: «high»,

          «publish_date»: «2017-02-09»,

          «modification_date»: «2018-07-27»,

          «nvd_score_v3»: 9.8,

          «nvd_vectors_v3»: «CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H»,

          «nvd_severity_v3»: «critical»

        }

      ]

    }

  ],

  «image_assurance_results»: {

    «disallowed»: true,

    «audit_required»: true,

    «policy_failures»: [

      {

        «policy_id»: 1,

        «policy_name»: «Default»,

        «blocking»: true,

        «controls»: [

          «max_severity»

        ]

      }

    ],

    «checks_performed»: [

      {

        «failed»: true,

        «policy_id»: 1,

        «policy_name»: «Default»,

        «control»: «max_severity»,

        «maximum_severity_allowed»: «high»,

        «maximum_severity_found»: «high»

      }

    ]

  },

  «vulnerability_summary»: {

    «total»: 3,

    «high»: 1,

    «medium»: 2,

    «low»: 0,

    «negligible»: 0,

    «sensitive»: 0,

    «malware»: 0,

    «score_average»: 5.6,

    «max_score»: 7.5

  },

  «scan_options»: {},

  «initiating_user»: «token»,

  «data_date»: 1543020471,

  «changed_result»: false,

  «function_metadata»: {}

}

The command ‘/bin/sh -c /microscanner ${token}’ returned a non-zero code: 4

Como véis, tenemos 3 vulnerabilidades, de las cuales 1 de gravedad alta y 2 de gravedad media…muy bien nuestro contenedor no está. 
Algo nos hace sospechar que una posible solución es actualizar nuestra versión de Alpine. Si hacemos tal proceso y actualizamos a la versión edge, tendremos como resultado:

2019-11-18 21:52:06.694 INFO Contacting CyberCenter… {«registry»: «», «image»: «»}

2019-11-18 21:52:08.034 INFO CyberCenter connection established {«registry»: «», «image»: «», «api_version»: «4»}

2019-11-18 21:52:08.548 INFO Processing results… {«registry»: «», «image»: «»}

{

  «scan_started»: {

    «seconds»: 1574113926,

    «nanos»: 422513000

  },

  «scan_duration»: 2,

  «digest»: «35baec0a7a172f715e6bc8eb6a667047c75d5f7f2932df581c33e790a2648280»,

  «os»: «alpine»,

  «version»: «3.11_alpha20191114»,

  «image_assurance_results»: {

    «checks_performed»: [

      {

        «policy_id»: 1,

        «policy_name»: «Default»,

        «control»: «max_severity»,

        «maximum_severity_allowed»: «high»

      }

    ]

  },

  «vulnerability_summary»: {

    «total»: 0,

    «high»: 0,

    «medium»: 0,

    «low»: 0,

    «negligible»: 0,

    «sensitive»: 0,

    «malware»: 0

  },

  «scan_options»: {},

  «partial_results»: true,

  «initiating_user»: «token»,

  «data_date»: 1543020471,

  «changed_result»: false,

  «function_metadata»: {}

}

Ahora ¡sí! Versión limpia de vulnerabilidades…al menos por ahora. 
Y es de aquí la importancia de añadir escaneos a nuestras imágenes. La seguridad es un proceso y este proceso debe de estar en continua revisión. Aqua nos ofrece esta solución OpenSource y en A2Secure podemos asesorarte en su integración. ¡La seguridad empieza en tí!
Autor: Carlos Morell

Los comentarios están cerrados.