From eb5ccffdcd26ff45768c6855960f22ac8ac3e96f Mon Sep 17 00:00:00 2001 From: Rhys Arkins <rhys@arkins.net> Date: Sat, 9 Mar 2019 07:16:12 +0100 Subject: [PATCH] fix: update GitHub vulnerability alerts parsing Closes #3340 --- lib/platform/github/index.js | 24 ++++++++------ lib/workers/repository/init/vulnerability.js | 33 +++++++++++++++---- .../__snapshots__/vulnerability.spec.js.snap | 9 +++-- .../repository/init/vulnerability.spec.js | 16 +++++++-- 4 files changed, 60 insertions(+), 22 deletions(-) diff --git a/lib/platform/github/index.js b/lib/platform/github/index.js index af1d74cf44..7612bc202d 100644 --- a/lib/platform/github/index.js +++ b/lib/platform/github/index.js @@ -1481,17 +1481,21 @@ async function getVulnerabilityAlerts() { const query = ` query { repository(owner:"${config.repositoryOwner}", name:"${config.repositoryName}") { - vulnerabilityAlerts(last: 100) { - edges { - node { - externalIdentifier - externalReference - packageName - affectedRange - fixedIn - } - } + vulnerabilityAlerts(last: 100) { + edges { + node { + dismissReason + vulnerableManifestFilename + vulnerableManifestPath + vulnerableRequirements + securityVulnerability { + package { name ecosystem } + firstPatchedVersion { identifier } + vulnerableVersionRange + } + } } + } } }`; const options = { diff --git a/lib/workers/repository/init/vulnerability.js b/lib/workers/repository/init/vulnerability.js index ed7746752e..6d5956a1ce 100644 --- a/lib/workers/repository/init/vulnerability.js +++ b/lib/workers/repository/init/vulnerability.js @@ -20,17 +20,36 @@ async function detectVulnerabilityAlerts(input) { } const config = { ...input }; const alertPackageRules = alerts + .filter(alert => !alert.dismissReason) + .filter( + alert => + alert.securityVulnerability && + alert.securityVulnerability.firstPatchedVersion && + alert.securityVulnerability.package + ) .map(alert => { - if (!alert.fixedIn) { - logger.info({ alert }, 'Vulnerability alert has no fixedIn version'); - return null; - } const rule = {}; - rule.packageNames = [alert.packageName]; + const languageMapping = { + MAVEN: ['java'], + NPM: ['js'], + NUGET: ['dotnet'], + PIP: ['python'], + RUBYGEMS: ['ruby'], + }; + const languages = + languageMapping[alert.securityVulnerability.package.ecosystem]; + if (languages) { + rule.languages = languages; + } + rule.packageNames = [alert.securityVulnerability.package.name]; // Raise only for where the currentVersion is vulnerable - rule.matchCurrentVersion = `< ${alert.fixedIn}`; + rule.matchCurrentVersion = `< ${ + alert.securityVulnerability.firstPatchedVersion.identifier + }`; // Don't propose upgrades to any versions that are still vulnerable - rule.allowedVersions = `>= ${alert.fixedIn}`; + rule.allowedVersions = `>= ${ + alert.securityVulnerability.firstPatchedVersion.identifier + }`; rule.force = { ...config.vulnerabilityAlerts, vulnerabilityAlert: true, diff --git a/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap b/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap index 81370c8986..c4793b921d 100644 --- a/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap +++ b/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap @@ -3,7 +3,7 @@ exports[`workers/repository/init/vulnerability detectVulnerabilityAlerts() returns alerts 1`] = ` Array [ Object { - "allowedVersions": ">= 1.1.0", + "allowedVersions": ">= 1.8.3", "force": Object { "commitMessageSuffix": "[SECURITY]", "groupName": null, @@ -12,9 +12,12 @@ Array [ "schedule": Array [], "vulnerabilityAlert": true, }, - "matchCurrentVersion": "< 1.1.0", + "languages": Array [ + "js", + ], + "matchCurrentVersion": "< 1.8.3", "packageNames": Array [ - "some-package", + "electron", ], }, ] diff --git a/test/workers/repository/init/vulnerability.spec.js b/test/workers/repository/init/vulnerability.spec.js index b6ca18b0bb..bc0dde2981 100644 --- a/test/workers/repository/init/vulnerability.spec.js +++ b/test/workers/repository/init/vulnerability.spec.js @@ -31,8 +31,20 @@ describe('workers/repository/init/vulnerability', () => { platform.getVulnerabilityAlerts.mockReturnValue([ {}, { - packageName: 'some-package', - fixedIn: '1.1.0', + dismissReason: null, + vulnerableManifestFilename: 'package-lock.json', + vulnerableManifestPath: 'package-lock.json', + vulnerableRequirements: '= 1.8.2', + securityVulnerability: { + package: { + name: 'electron', + ecosystem: 'NPM', + }, + firstPatchedVersion: { + identifier: '1.8.3', + }, + vulnerableVersionRange: '>= 1.8, < 1.8.3', + }, }, {}, ]); -- GitLab