11package com.datadog.iast.securitycontrol
22
3+ import com.datadog.iast.IastModuleImplTestBase
4+ import com.datadog.iast.sink.XssModuleImpl
5+ import static com.datadog.iast.taint.TaintUtils.addFromTaintFormat
36import datadog.trace.api.iast.InstrumentationBridge
47import datadog.trace.api.iast.VulnerabilityMarks
8+ import static datadog.trace.api.iast.VulnerabilityMarks.NOT_MARKED
9+ import datadog.trace.api.iast.VulnerabilityTypes
510import datadog.trace.api.iast.propagation.PropagationModule
611import datadog.trace.api.iast.securitycontrol.SecurityControl
712import datadog.trace.api.iast.securitycontrol.SecurityControlFormatter
8- import datadog.trace.test.util.DDSpecification
13+ import static datadog.trace.api.iast.telemetry.IastMetric.SUPPRESSED_VULNERABILITIES
14+ import datadog.trace.api.iast.telemetry.IastMetricCollector
915import foo.bar.securitycontrol.SecurityControlStaticTestSuite
1016import foo.bar.securitycontrol.SecurityControlTestSuite
1117import net.bytebuddy.agent.ByteBuddyAgent
1218
1319import java.lang.instrument.Instrumentation
1420
15- class IastSecurityControlTransformerForkedTest extends DDSpecification {
21+ class IastSecurityControlTransformerForkedTest extends IastModuleImplTestBase {
1622
1723 // static methods
1824 private static final String STATIC_SANITIZER = ' SANITIZER:XSS:foo.bar.securitycontrol.SecurityControlStaticTestSuite:sanitize'
@@ -43,6 +49,7 @@ class IastSecurityControlTransformerForkedTest extends DDSpecification{
4349 private static final String INPUT_VALIDATOR_VALIDATE_SELECTED_LONG = ' INPUT_VALIDATOR:XSS:foo.bar.securitycontrol.SecurityControlTestSuite:validateSelectedLong:0'
4450
4551
52+ private IastMetricCollector mockCollector
4653
4754 def setupSpec () {
4855 final staticConfig = " ${ STATIC_SANITIZER} ;${ STATIC_SANITIZE_VALIDATE_OBJECT} ;${ STATIC_SANITIZE_INPUTS} ;${ STATIC_SANITIZE_MANY_INPUTS} ;${ STATIC_SANITIZE_INT} ;${ STATIC_SANITIZE_LONG} ;${ STATIC_INPUT_VALIDATOR_VALIDATE_ALL} ;${ STATIC_INPUT_VALIDATOR_VALIDATE_OVERLOADED} ;${ STATIC_INPUT_VALIDATOR_VALIDATE_RETURNING_INT} ;${ STATIC_INPUT_VALIDATOR_VALIDATE_OBJECT} ;${ STATIC_INPUT_VALIDATOR_VALIDATE_LONG} ;${ STATIC_INPUT_VALIDATOR_VALIDATE_SELECTED_LONG} "
@@ -55,26 +62,31 @@ class IastSecurityControlTransformerForkedTest extends DDSpecification{
5562 instrumentation. addTransformer(new IastSecurityControlTransformer (securityControls), true )
5663 }
5764
65+ void setup () {
66+ mockCollector = Mock (IastMetricCollector )
67+ ctx. collector = mockCollector
68+ }
69+
5870
5971 void ' test sanitize' (){
6072 given :
61- final iastModule = Mock (PropagationModule )
62- InstrumentationBridge . registerIastModule(iastModule )
73+ final propagationModule = Mock (PropagationModule )
74+ InstrumentationBridge . registerIastModule(propagationModule )
6375 final marks = (VulnerabilityMarks . XSS_MARK | VulnerabilityMarks . CUSTOM_SECURITY_CONTROL_MARK )
6476
6577 when :
6678 SecurityControlStaticTestSuite . &" $method " . call(* args)
6779
6880 then :
69- expected * iastModule . markIfTainted( toSanitize, marks)
81+ expected * propagationModule . markIfTainted( toSanitize, marks)
7082 0 * _
7183
7284 when :
7385 final suite = new SecurityControlTestSuite ()
7486 suite. &" $method " . call(* args)
7587
7688 then :
77- expected * iastModule . markIfTainted( toSanitize, marks)
89+ expected * propagationModule . markIfTainted( toSanitize, marks)
7890 0 * _
7991
8092 where :
@@ -89,16 +101,16 @@ class IastSecurityControlTransformerForkedTest extends DDSpecification{
89101
90102 void ' test validate' (){
91103 given :
92- final iastModule = Mock (PropagationModule )
93- InstrumentationBridge . registerIastModule(iastModule )
104+ final propagationModule = Mock (PropagationModule )
105+ InstrumentationBridge . registerIastModule(propagationModule )
94106 final marks = (VulnerabilityMarks . XSS_MARK | VulnerabilityMarks . CUSTOM_SECURITY_CONTROL_MARK )
95107
96108 when :
97109 SecurityControlStaticTestSuite . &" $method " . call(* args)
98110
99111 then :
100112 for (final validate : toValidate){
101- expected * iastModule . markIfTainted(validate, marks)
113+ expected * propagationModule . markIfTainted(validate, marks)
102114 }
103115 0 * _
104116
@@ -108,7 +120,7 @@ class IastSecurityControlTransformerForkedTest extends DDSpecification{
108120
109121 then :
110122 for (final validate : toValidate){
111- expected * iastModule . markIfTainted(validate, marks)
123+ expected * propagationModule . markIfTainted(validate, marks)
112124 }
113125 0 * _
114126
@@ -128,4 +140,36 @@ class IastSecurityControlTransformerForkedTest extends DDSpecification{
128140 ' validateSelectedLong' | [1L ] | args | 0
129141 ' validateSelectedLong' | [1L , 2L ] | [args[0 ]] | 0
130142 }
143+
144+ void ' test metrics' () {
145+ setup :
146+ final iastModule = new XssModuleImpl (dependencies)
147+ final param = mapTainted(s, mark)
148+
149+ when :
150+ iastModule. onXss(param as String )
151+
152+ then :
153+ expected * mockCollector. addMetric(SUPPRESSED_VULNERABILITIES , VulnerabilityTypes . XSS , 1 )
154+
155+ where :
156+ s | mark | expected
157+ null | NOT_MARKED | 0
158+ ' /var' | NOT_MARKED | 0
159+ ' /==>var<==' | NOT_MARKED | 0
160+ ' /==>var<==' | VulnerabilityMarks . XSS_MARK | 0
161+ ' /==>var<==' | VulnerabilityMarks . SQL_INJECTION_MARK | 0
162+ ' /==>var<==' | combine(VulnerabilityMarks . SQL_INJECTION_MARK , VulnerabilityMarks . CUSTOM_SECURITY_CONTROL_MARK ) | 0
163+ ' /==>var<==' | combine(VulnerabilityMarks . XSS_MARK , VulnerabilityMarks . CUSTOM_SECURITY_CONTROL_MARK ) | 1
164+ }
165+
166+ private static int combine (int mark1 , int mark2 ) {
167+ return mark1 | mark2 // Perform the bitwise OR
168+ }
169+
170+ private String mapTainted (final String value , final int mark ) {
171+ final result = addFromTaintFormat(ctx. taintedObjects, value, mark)
172+ objectHolder. add(result)
173+ return result
174+ }
131175}
0 commit comments