Skip to content

Commit 0530c81

Browse files
David HallDavid Hall
authored andcommitted
pscanrules: Support for example alerts
Signed-off-by: David Hall <[email protected]>
1 parent 08b3a8e commit 0530c81

File tree

2 files changed

+64
-29
lines changed

2 files changed

+64
-29
lines changed

addOns/pscanrules/src/main/java/org/zaproxy/zap/extension/pscanrules/ContentSecurityPolicyMissingScanRule.java

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
*/
2020
package org.zaproxy.zap.extension.pscanrules;
2121

22+
import java.util.Arrays;
23+
import java.util.List;
2224
import java.util.Map;
2325
import net.htmlparser.jericho.Source;
2426
import org.apache.logging.log4j.LogManager;
@@ -62,41 +64,15 @@ public void scanHttpResponseReceive(HttpMessage msg, int id, Source source) {
6264
}
6365

6466
if (!hasCspHeader(msg) && !CspUtils.hasMetaCsp(source)) {
65-
newAlert()
66-
.setRisk(Alert.RISK_MEDIUM)
67-
.setConfidence(Alert.CONFIDENCE_HIGH)
68-
.setDescription(getAlertAttribute("desc"))
69-
.setSolution(getAlertAttribute("soln"))
70-
.setReference(getAlertAttribute("refs"))
71-
.setCweId(693) // CWE-693: Protection Mechanism Failure
72-
.setWascId(15) // WASC-15: Application Misconfiguration
73-
.raise();
67+
alertMissingCspHeader().raise();
7468
}
7569

7670
if (hasObsoleteCspHeader(msg)) {
77-
newAlert()
78-
.setName(getAlertAttribute("obs.name"))
79-
.setRisk(Alert.RISK_INFO)
80-
.setConfidence(Alert.CONFIDENCE_HIGH)
81-
.setDescription(getAlertAttribute("obs.desc"))
82-
.setSolution(getAlertAttribute("soln"))
83-
.setReference(getAlertAttribute("refs"))
84-
.setCweId(693) // CWE-693: Protection Mechanism Failure
85-
.setWascId(15) // WASC-15: Application Misconfiguration
86-
.raise();
71+
alertObsoleteCspHeader().raise();
8772
}
8873

8974
if (hasCspReportOnlyHeader(msg)) {
90-
newAlert()
91-
.setName(getAlertAttribute("ro.name"))
92-
.setRisk(Alert.RISK_INFO)
93-
.setConfidence(Alert.CONFIDENCE_HIGH)
94-
.setDescription(getAlertAttribute("ro.desc"))
95-
.setSolution(getAlertAttribute("soln"))
96-
.setReference(getAlertAttribute("ro.refs"))
97-
.setCweId(693) // CWE-693: Protection Mechanism Failure
98-
.setWascId(15) // WASC-15: Application Misconfiguration
99-
.raise();
75+
alertCspReportOnlyHeader().raise();
10076
}
10177

10278
LOGGER.debug("\tScan of record {} took {}ms", id, System.currentTimeMillis() - start);
@@ -121,6 +97,14 @@ public Map<String, String> getAlertTags() {
12197
return ALERT_TAGS;
12298
}
12399

100+
@Override
101+
public List<Alert> getExampleAlerts() {
102+
return Arrays.asList(
103+
alertMissingCspHeader().build(),
104+
alertObsoleteCspHeader().build(),
105+
alertObsoleteCspHeader().build());
106+
}
107+
124108
private static boolean hasCspHeader(HttpMessage msg) {
125109
return !msg.getResponseHeader()
126110
.getHeaderValues(HttpFieldsNames.CONTENT_SECURITY_POLICY)
@@ -137,4 +121,36 @@ private static boolean hasCspReportOnlyHeader(HttpMessage msg) {
137121
.getHeaderValues("Content-Security-Policy-Report-Only")
138122
.isEmpty();
139123
}
124+
125+
private AlertBuilder buildAlert(int risk) {
126+
return newAlert()
127+
.setRisk(risk)
128+
.setConfidence(Alert.CONFIDENCE_HIGH)
129+
.setCweId(693) // CWE-693: Protection Mechanism Failure
130+
.setWascId(15); // WASC-15: Application Misconfiguration
131+
}
132+
133+
private AlertBuilder alertMissingCspHeader() {
134+
return buildAlert(Alert.RISK_MEDIUM)
135+
.setName(getAlertAttribute("name"))
136+
.setDescription(getAlertAttribute("desc"))
137+
.setSolution(getAlertAttribute("soln"))
138+
.setReference(getAlertAttribute("refs"));
139+
}
140+
141+
private AlertBuilder alertObsoleteCspHeader() {
142+
return buildAlert(Alert.RISK_INFO)
143+
.setName(getAlertAttribute("obs.name"))
144+
.setDescription(getAlertAttribute("obs.desc"))
145+
.setSolution(getAlertAttribute("soln"))
146+
.setReference(getAlertAttribute("refs"));
147+
}
148+
149+
private AlertBuilder alertCspReportOnlyHeader() {
150+
return buildAlert(Alert.RISK_INFO)
151+
.setName(getAlertAttribute("ro.name"))
152+
.setDescription(getAlertAttribute("ro.desc"))
153+
.setSolution(getAlertAttribute("soln"))
154+
.setReference(getAlertAttribute("ro.refs"));
155+
}
140156
}

addOns/pscanrules/src/test/java/org/zaproxy/zap/extension/pscanrules/ContentSecurityPolicyMissingScanRuleUnitTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.hamcrest.Matchers.equalTo;
2424
import static org.hamcrest.Matchers.is;
2525

26+
import java.util.List;
2627
import java.util.Map;
2728
import org.apache.commons.httpclient.URI;
2829
import org.junit.jupiter.api.Test;
@@ -295,6 +296,24 @@ void shouldReturnExpectedMappings() {
295296
is(equalTo(CommonAlertTag.OWASP_2017_A06_SEC_MISCONFIG.getValue())));
296297
}
297298

299+
@Test
300+
void shouldReturnExampleAlerts() {
301+
// Given / When
302+
List<Alert> alerts = rule.getExampleAlerts();
303+
long countMediums =
304+
rule.getExampleAlerts().stream()
305+
.filter(alert -> Alert.RISK_MEDIUM == alert.getRisk())
306+
.count();
307+
long countInfos =
308+
rule.getExampleAlerts().stream()
309+
.filter(alert -> Alert.RISK_INFO == alert.getRisk())
310+
.count();
311+
// Then
312+
assertThat(alerts.size(), is(equalTo(3)));
313+
assertThat(countMediums, is(equalTo(1L)));
314+
assertThat(countInfos, is(equalTo(2L)));
315+
}
316+
298317
private void assertContentSecurityPolicyAlertRaised() {
299318
assertThat(alertsRaised.size(), is(1));
300319
assertCSPAlertAttributes(alertsRaised.get(0), "", Alert.RISK_MEDIUM);

0 commit comments

Comments
 (0)