Skip to content

Commit bc87e9e

Browse files
authored
Merge pull request #69 from turingsecure/68-environmental-score-fix
68 environmental score fix
2 parents 8f6ab71 + 3afb6e2 commit bc87e9e

File tree

4 files changed

+36
-26
lines changed

4 files changed

+36
-26
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h1 align="center">cvss.js by <a href="https://turingpoint.eu" target="_blank">turingpoint.</a></h1>
22
<p>
3-
<img alt="Version" src="https://img.shields.io/badge/version-1.4.2-blue.svg?cacheSeconds=2592000" />
3+
<img alt="Version" src="https://img.shields.io/badge/version-1.4.3-blue.svg?cacheSeconds=2592000" />
44
<a href="#" target="_blank">
55
<img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg" />
66
</a>

lib/score.js

+9-12
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const calculateISCBase = function (vectorObject) {
5858
*/
5959
function getEnvironmentalScore(vector) {
6060
const vectorObject = util.getVectorObject(vector);
61-
const scopeChanged = vectorObject.MS === "C";
61+
const scopeChanged = vectorObject.MS === "X" ? vectorObject.S === "C" : vectorObject.MS === "C";
6262
const modifiedISCBase = calculateISCModifiedBase(vectorObject);
6363
const modifiedExploitability = calculateModifiedExploitability(vectorObject, scopeChanged);
6464
const modifiedISC = calculateISC(modifiedISCBase, scopeChanged, vector);
@@ -94,10 +94,9 @@ function getEnvironmentalScore(vector) {
9494

9595
const calculateISC = function (iscBase, scopeChanged, vector) {
9696
if (!scopeChanged) return 6.42 * iscBase;
97-
if (util.getVersion(vector) === "3.0"){
97+
if (util.getVersion(vector) === "3.0") {
9898
return 7.52 * (iscBase - 0.029) - 3.25 * Math.pow(iscBase - 0.02, 15);
99-
}
100-
else if (util.getVersion(vector) === "3.1"){
99+
} else if (util.getVersion(vector) === "3.1") {
101100
return 7.52 * (iscBase - 0.029) - 3.25 * Math.pow(iscBase * 0.9731 - 0.02, 13);
102101
}
103102
};
@@ -142,8 +141,7 @@ const calculateModifiedExploitability = function (vectorObject, scopeChanged) {
142141

143142
if (!mavValue || mavValue.abbr === "X") mavValue = util.findMetricValue("AV", vectorObject);
144143
if (!macValue || macValue.abbr === "X") macValue = util.findMetricValue("AC", vectorObject);
145-
if (!mprMetrics || mprMetrics.abbr === "X")
146-
mprMetrics = util.findMetricValue("PR", vectorObject);
144+
if (!mprMetrics || mprMetrics.abbr === "X") mprMetrics = util.findMetricValue("PR", vectorObject);
147145
if (!muiValue || muiValue.abbr === "X") muiValue = util.findMetricValue("UI", vectorObject);
148146

149147
const mprValue = scopeChanged ? mprMetrics.numerical.changed : mprMetrics.numerical.unchanged;
@@ -153,18 +151,17 @@ const calculateModifiedExploitability = function (vectorObject, scopeChanged) {
153151

154152
/**
155153
* Chooses the correct way to round numbers depending on the CVSS version number
156-
*
154+
*
157155
* @param {Number} num The number to round
158156
* @param {Number} precision The number of decimal places to preserve (only affects CVSS 3.0)
159157
* @param {String} vector The vector currently being parsed
160-
*
158+
*
161159
* @returns {num} The rounded number
162160
*/
163161
function roundUp(num, precision, vector) {
164-
if (util.getVersion(vector) === "3.0"){
162+
if (util.getVersion(vector) === "3.0") {
165163
return util.roundUpApprox(num, precision);
166-
}
167-
else if (util.getVersion(vector) === "3.1") {
164+
} else if (util.getVersion(vector) === "3.1") {
168165
return util.roundUpExact(num);
169166
}
170167
}
@@ -173,4 +170,4 @@ module.exports = {
173170
getScore,
174171
getTemporalScore,
175172
getEnvironmentalScore
176-
};
173+
};

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@turingpointde/cvss.js",
3-
"version": "1.4.2",
3+
"version": "1.4.3",
44
"description": "A tiny library to work with cvss vectors",
55
"scripts": {
66
"build": "webpack",

test/cvss.spec.js

+25-12
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,16 @@ describe("Environmental score tests", () => {
111111
"CVSS:3.0/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L/CR:H/IR:H/MS:C/MC:H/MI:H/MA:H"
112112
);
113113
expect(vector6.getEnvironmentalScore()).toBe(8.0);
114-
114+
115115
const vector7 = CVSS(
116116
"CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L/CR:H/IR:H/MS:C/MC:H/MI:H/MA:H"
117117
);
118118
expect(vector7.getEnvironmentalScore()).toBe(8.1);
119+
120+
const vector8 = CVSS(
121+
"CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:L/E:X/RL:X/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MPR:X/MUI:X/MS:X/MC:X/MI:X/MA:X"
122+
);
123+
expect(vector8.getEnvironmentalScore()).toBe(6.5);
119124
});
120125

121126
it("Should return base score when all environmental metrics are not defined", () => {
@@ -169,15 +174,16 @@ describe("Rating Tests", () => {
169174
});
170175

171176
it("Should be able to discern individual ratings (base, temp, env) even if these don't match", () => {
172-
const vector = CVSS("CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N/E:U/RL:O/RC:U/CR:H/IR:H/AR:H/MAV:N/MAC:L/MPR:N/MUI:N/MS:U/MC:H/MI:H/MA:H");
177+
const vector = CVSS(
178+
"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N/E:U/RL:O/RC:U/CR:H/IR:H/AR:H/MAV:N/MAC:L/MPR:N/MUI:N/MS:U/MC:H/MI:H/MA:H"
179+
);
173180
expect(vector.getScore()).toBe(4.3);
174181
expect(vector.getRating()).toBe("Medium");
175182
expect(vector.getTemporalScore()).toBe(3.5);
176183
expect(vector.getTemporalRating()).toBe("Low");
177184
expect(vector.getEnvironmentalScore()).toBe(7.8);
178185
expect(vector.getEnvironmentalRating()).toBe("High");
179186
});
180-
181187
});
182188

183189
describe("Vector Object Tests", () => {
@@ -509,13 +515,20 @@ describe("Create vector from object", () => {
509515

510516
describe("Clean Vector String Test", () => {
511517
it("Should return the clean vector as string", () => {
512-
expect(CVSS("CVSS:3.0/AV:L/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:N/E:P/RL:W/RC:X/CR:X/IR:X/AR:M/MAV:A/MAC:X/MPR:X/MUI:N/MS:X/MC:X/MI:X/MA:X").getCleanVectorString())
513-
.toBe("CVSS:3.0/AV:L/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:N/E:P/RL:W/AR:M/MAV:A/MUI:N");
514-
515-
expect(CVSS("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N/E:X/RL:X/RC:X").getCleanVectorString())
516-
.toBe("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N");
517-
518-
expect(CVSS("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N/E:X/RL:X/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MPR:X/MUI:X/MS:X/MC:X/MI:X/MA:X").getCleanVectorString())
519-
.toBe("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N");
518+
expect(
519+
CVSS(
520+
"CVSS:3.0/AV:L/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:N/E:P/RL:W/RC:X/CR:X/IR:X/AR:M/MAV:A/MAC:X/MPR:X/MUI:N/MS:X/MC:X/MI:X/MA:X"
521+
).getCleanVectorString()
522+
).toBe("CVSS:3.0/AV:L/AC:L/PR:H/UI:N/S:U/C:N/I:H/A:N/E:P/RL:W/AR:M/MAV:A/MUI:N");
523+
524+
expect(
525+
CVSS("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N/E:X/RL:X/RC:X").getCleanVectorString()
526+
).toBe("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N");
527+
528+
expect(
529+
CVSS(
530+
"CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N/E:X/RL:X/RC:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MPR:X/MUI:X/MS:X/MC:X/MI:X/MA:X"
531+
).getCleanVectorString()
532+
).toBe("CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N");
520533
});
521-
});
534+
});

0 commit comments

Comments
 (0)