Skip to main content

Usar la API de Snyk para encontrar y corregir vulnerabilidades

Escrito por
Headshot of Josh Emerson

Josh Emerson

3 de enero de 2018

0 minutos de lectura
Rompecabezas dibujado a mano con piezas estampadas y una pieza negra central que muestra una cara blanca similar a la de un animal

Ilustración de Lou Reade.

En esta publicación del blog, aprenderás a usar la API de Snyk para obtener todos los problemas asociados con un proyecto. Esto puede ser útil por varios motivos; en particular, puedes incluirlos en tus informes y paneles, y darles visibilidad a los equipos de gestión y desarrollo sobre el estado de sus vulnerabilidades desde los portales y flujos de trabajo que ya usan.

En los siguientes pasos, usaremos la API para:

  • Obtener la lista de organizaciones a las que tienes acceso

  • Obtener todos los proyectos de una organización

  • Obtener la lista de problemas de tus proyectos

Requisitos previos

La API de Snyk está disponible para clientes de uno de nuestros planes de pago. Para comenzar a usarla, inicia sesión o crea una cuenta y obtén tu clave de API en https://app.snyk.io. Puedes consultar todos los endpoints que ofrece la API en https://snyk.docs.apiary.io.

Si todavía no creaste proyectos, puedes hacerlo ejecutando snyk monitor con la herramienta de línea de comandos de Snyk, o agregar proyectos desde distintas fuentes (como GitHub, GitLab y Heroku) en el sitio web.

También tendrás que copiar tu clave de API desde https://snyk.io/account y usarla en todos los lugares que se indican a continuación.

Obtener organizaciones

El primer paso es usar el endpoint de organizaciones en https://snyk.io/api/v1/orgs.

curl --include \
     --header "Content-Type: application/json; charset=utf-8" \
     --header "Authorization: token <API_KEY>" \
  'https://snyk.io/api/v1/orgs'

Esto devolverá una lista de tus organizaciones.

{
  "orgs": [
    {
      "name": "defaultOrg",
      "id": "689ce7f9-7943-4a71-b704-2ba575f01089"
    },
    {
      "name": "My Other Org",
      "id": "a04d9cbd-ae6e-44af-b573-0556b0ad4bd2"
    }
  ]
}

Obtener proyectos

Ahora, toma el ID de la organización cuyos problemas de proyectos quieres consultar y úsalo en el endpoint de la API de proyectos: https://snyk.io/api/v1/org//projects (reemplaza org por el ID de tu organización).

curl --include \
     --header "Content-Type: application/json" \
     --header "Authorization: token <API_KEY>" \
  'https://snyk.io/api/v1/org/<ORG_ID>/projects'

Esto devolverá una lista de tus proyectos.

{
  "org": {
    "name": "defaultOrg",
    "id": "689ce7f9-7943-4a71-b704-2ba575f01089"
  },
  "projects": [
    {
      "name": "atokeneduser/goof",
      "id": "6d5813be-7e6d-4ab8-80c2-1e3e2a454545"
    },
    {
      "name": "atokeneduser/clojure",
      "id": "af127b96-6966-46c1-826b-2e79ac49bbd9"
    }
  ]
}

Obtener problemas de proyectos

Ahora que tenemos una lista de proyectos, podemos obtener los problemas de cualquiera que nos interese mediante el endpoint de problemas que se muestra a continuación. Reemplaza el ID por el del proyecto del que quieres consultar los problemas:

curl --include \
     --request POST \
     --header "Content-Type: application/json" \
     --header "Authorization: token <API_KEY>" \
  'https://snyk.io/api/v1/org/orgId/project/<PROJECT_ID>/aggregated-issues'

Esto devolverá una respuesta JSON que incluye un objeto issues con un arreglo de vulnerabilidades y (si las licencias están habilitadas para tu organización) un arreglo de problemas de licencias detectados en el proyecto cuando se tomó la última instantánea.

El endpoint de la API de problemas de proyectos también permite filtrar por tipo de problema (vulnerabilidad o problema de licencia), gravedad (alta, media o baja) y si el problema se ignoró o corrigió. Si solo quisiéramos consultar vulnerabilidades de gravedad alta que no se hayan corregido ni ignorado, podríamos hacer la siguiente solicitud:

'https://snyk.io/api/v1/org/orgId/project/<PROJECT_ID>/aggregated-issues'curl --include \
     --request POST \
     --header "Content-Type: application/json" \
     --header "Authorization: token <API_KEY>" \
     --data-binary '{
       "filters": {
        "severities": [ "high" ],
        "types": [ "vuln" ],
        "ignored": false,
        "patched": false
      }
    }' \
  'https://snyk.io/api/v1/org/orgId/project/<PROJECT_ID>/aggregated-issues'

La respuesta ya no incluirá problemas de licencias y solo mostrará vulnerabilidades de gravedad alta que no se hayan ignorado ni corregido.

Usar la respuesta

Una vez que hayas obtenido los problemas de proyectos, tendrás una carga útil JSON como la siguiente:

{
  "ok": false,
  "issues": {
    "vulnerabilities": [
      {
        "id": "npm:ms:20170412",
        "url": "https://snyk.io/vuln/npm:ms:20170412",
        "title": "Regular Expression Denial of Service (ReDoS)",
        "type": "vuln",
        "description": "## Overview\n[`ms`](https://www.npmjs.com/package/ms) is a tiny millisecond conversion utility.\n\nAffected versions of this package are vulnerable to Regular Expression Denial of Service (ReDoS) due to an incomplete fix for previously reported vulnerability [npm:ms:20151024](https://snyk.io/vuln/npm:ms:20151024). The fix limited the length of accepted input string to 10,000 characters, and turned to be insufficient making it possible to block the event loop for 0.3 seconds (on a typical laptop) with a specially crafted string passed to `ms()` function.\n\n*Proof of concept*\n```js\nms = require('ms');\nms('1'.repeat(9998) + 'Q') // Takes about ~0.3s\n```\n\n**Note:** Snyk's patch for this vulnerability limits input length to 100 characters. This new limit was deemed to be a breaking change by the author.\nBased on user feedback, we believe the risk of breakage is _very_ low, while the value to your security is much greater, and therefore opted to still capture this change in a patch for earlier versions as well.  Whenever patching security issues, we always suggest to run tests on your code to validate that nothing has been broken.\n\nFor more information on `Regular Expression Denial of Service (ReDoS)` attacks, go to our [blog](https://snyk.io/blog/redos-and-catastrophic-backtracking/).\n\n## Disclosure Timeline\n- Feb 9th, 2017 - Reported the issue to package owner.\n- Feb 11th, 2017 - Issue acknowledged by package owner.\n- April 12th, 2017 - Fix PR opened by Snyk Security Team.\n- May 15th, 2017 - Vulnerability published.\n- May 16th, 2017 - Issue fixed and version `2.0.0` released.\n- May 21th, 2017 - Patches released for versions `>=0.7.1, <=1.0.0`.\n\n## Remediation\nUpgrade `ms` to version 2.0.0 or higher.\n\n## References\n- [GitHub PR](https://github.com/zeit/ms/pull/89)\n- [GitHub Commit](https://github.com/zeit/ms/pull/89/commits/305f2ddcd4eff7cc7c518aca6bb2b2d2daad8fef)\n",
        "from": [
          "mongoose@4.2.4",
          "mquery@1.6.3",
          "debug@2.2.0",
          "ms@0.7.1"
        ],
        "package": "ms",
        "version": "0.7.1",
        "severity": "low",
        "language": "js",
        "packageManager": "npm",
        "semver": {
          "unaffected": ">=2.0.0",
          "vulnerable": "<2.0.0"
        },
        "publicationTime": "2017-05-15T06:02:45.497Z",
        "disclosureTime": "2017-04-11T21:00:00.000Z",
        "isUpgradable": true,
        "isPatchable": true,
        "identifiers": {
          "CVE": [],
          "CWE": [
            "CWE-400"
          ],
          "ALTERNATIVE": [
            "SNYK-JS-MS-10509"
          ]
        },
        "credit": [
          "Snyk Security Research Team"
        ],
        "CVSSv3": "CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L",
        "cvssScore": 3.7,
        "patches": [
          {
            "id": "patch:npm:ms:20170412:0",
            "urls": [
              "https://s3.amazonaws.com/snyk-rules-pre-repository/snapshots/develop/patches/npm/ms/20170412/ms_100.patch"
            ],
            "version": "=1.0.0",
            "comments": [],
            "modificationTime": "2017-05-16T10:12:18.990Z"
          },
          {
            "id": "patch:npm:ms:20170412:1",
            "urls": [
              "https://s3.amazonaws.com/snyk-rules-pre-repository/snapshots/develop/patches/npm/ms/20170412/ms_072-073.patch"
            ],
            "version": "=0.7.2 || =0.7.3",
            "comments": [],
            "modificationTime": "2017-05-16T10:12:18.990Z"
          },
          {
            "id": "patch:npm:ms:20170412:2",
            "urls": [
              "https://s3.amazonaws.com/snyk-rules-pre-repository/snapshots/develop/patches/npm/ms/20170412/ms_071.patch"
            ],
            "version": "=0.7.1",
            "comments": [],
            "modificationTime": "2017-05-16T10:12:18.990Z"
          }
        ],
        "isIgnored": true,
        "isPatched": false,
        "upgradePath": [
          "mongoose@4.10.2",
          "mquery@2.3.1",
          "debug@2.6.8",
          "ms@2.0.0"
        ]
      }
    ],
    "licenses": []
  },
  "dependencyCount": 250,
  "packageManager": "npm"
}

Supongamos que quieres mostrar el nombre de la vulnerabilidad, el paquete vulnerable y la URL para obtener más información sobre cada vulnerabilidad. Como ejemplo, con jq, podrías hacer lo siguiente:

curl --request POST \
   --header "Content-Type: application/json" \
   --header "Authorization: token <API_KEY>" \
  'https://snyk.io/api/v1/org/orgId/project/<PROJECT_ID>/issues' \
  | jq '"Vulnerability: \(.issues.vulnerabilities[].title) in \(.issues.vulnerabilities[].package)@\(.issues.vulnerabilities[].version) - \(.issues.vulnerabilities[].url)"'

Y obtendrías el siguiente resultado:

Regular Expression Denial of Service (ReDoS) in ms@0.7.1 - https://snyk.io/vuln/npm:ms:20170412

La API de informes

En una próxima publicación del blog, mostraremos cómo puedes usar la API de informes empresarial para ir más allá de lo que permite el endpoint de problemas de proyectos. Si quieres visualizar problemas a lo largo del tiempo, consultar el tiempo de resolución y aprovechar funciones de filtrado más avanzadas, escríbenos a enterprise@snyk.io para probar nuestra API de informes.