Skip to main content

Schwachstellen mit der Snyk API finden und beheben

Artikel von
Headshot of Josh Emerson

Josh Emerson

3. Januar 2018

0 Min. Lesezeit
Handgezeichnetes Puzzle mit gemusterten Teilen und einem zentralen schwarzen Teil mit einem weißen, tierähnlichen Gesicht

Illustration von Lou Reade.

In diesem Blogbeitrag erfahren Sie, wie Sie mit der Snyk API alle Probleme eines bestimmten Projekts abrufen. Das kann aus verschiedenen Gründen hilfreich sein – insbesondere, wenn Sie die Daten in Ihre Berichte und Dashboards übernehmen möchten, damit Management und Entwicklungsteams über die Portale und Workflows, die sie bereits nutzen, Einblick in den Schwachstellenstatus erhalten.

In den folgenden Schritten verwenden wir die API, um:

  • die Liste der Organisationen abzurufen, auf die Sie Zugriff haben

  • alle Projekte einer Organisation abzurufen

  • die Liste der Probleme in Ihren Projekten abzurufen

Voraussetzungen

Die Snyk API ist für Kundinnen und Kunden mit einem unserer kostenpflichtigen Pläne verfügbar. Um mit der API zu beginnen, melden Sie sich an oder erstellen Sie ein Konto und rufen Sie Ihren API-Schlüssel unter https://app.snyk.io ab. Alle von der API bereitgestellten Endpunkte finden Sie unter https://snyk.docs.apiary.io.

Falls Sie noch keine Projekte angelegt haben, können Sie dies mit snyk monitor über das Snyk-Befehlszeilentool tun oder Projekte aus verschiedenen Quellen (z. B. GitHub, GitLab und Heroku) über die Website hinzufügen.

Kopieren Sie außerdem Ihren API-Schlüssel unter https://snyk.io/account und verwenden Sie ihn an allen unten angegebenen Stellen.

Organisationen abrufen

Rufen Sie zunächst den Endpunkt für Organisationen unter https://snyk.io/api/v1/orgs auf.

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

Dadurch wird eine Liste Ihrer Organisationen zurückgegeben.

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

Projekte abrufen

Verwenden Sie nun die ID der Organisation, deren Projektprobleme Sie anzeigen möchten, für den Projects-API-Endpunkt unter https://snyk.io/api/v1/org//projects (ersetzen Sie durch die ID Ihrer Organisation).

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

Dadurch wird eine Liste Ihrer Projekte zurückgegeben.

{
  "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"
    }
  ]
}

Projektprobleme abrufen

Nachdem Sie nun eine Liste der Projekte haben, können Sie die Probleme für jedes gewünschte Projekt abrufen, indem Sie den unten gezeigten Issues-Endpunkt aufrufen. Ersetzen Sie dabei durch die ID des Projekts, dessen Problemliste Sie anzeigen möchten:

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'

Dadurch wird eine JSON-Antwort zurückgegeben, die ein issues-Objekt mit einem Array von Schwachstellen enthält. Wenn Lizenzen für Ihre Organisation aktiviert sind, umfasst die Antwort außerdem ein Array mit Lizenzproblemen, die beim letzten Snapshot im Projekt gefunden wurden.

Der API-Endpunkt für Projektprobleme unterstützt außerdem Filter nach Problemtyp (Schwachstelle oder Lizenzproblem), Schweregrad (hoch, mittel oder niedrig) und danach, ob ein Problem ignoriert oder behoben wurde. Wenn Sie nur Schwachstellen mit hohem Schweregrad anzeigen möchten, die weder ignoriert noch behoben wurden, können Sie folgende Anfrage senden:

'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'

Die Antwort enthält nun keine Lizenzprobleme mehr und zeigt nur Schwachstellen mit hohem Schweregrad an, die weder ignoriert noch behoben wurden.

Die Antwort verwenden

Nachdem Sie die Projektprobleme abgerufen haben, erhalten Sie eine JSON-Nutzlast wie die folgende:

{
  "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"
}

Angenommen, Sie möchten den Namen der Schwachstelle, das betroffene Paket und die URL mit weiteren Informationen zu jeder Schwachstelle anzeigen. Mit jq könnten Sie beispielsweise Folgendes tun:

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)"'

Das Ergebnis sieht dann so aus:

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

Die Reporting API

In einem Folgebeitrag zeigen wir Ihnen, wie Sie mit der Reporting API für Unternehmen über die Möglichkeiten des Endpunkts für Projektprobleme hinausgehen können. Wenn Sie Probleme im Zeitverlauf darstellen, die Zeit bis zur Behebung nachvollziehen und leistungsfähigere Filterfunktionen nutzen möchten, schreiben Sie an enterprise@snyk.io, um unsere Reporting API auszuprobieren.