1
1
package com.datadog.iast.propagation
2
2
3
3
import com.datadog.iast.IastModuleImplTestBase
4
+ import com.datadog.iast.model.Source
5
+ import com.datadog.iast.taint.TaintedObjects
4
6
import datadog.trace.api.gateway.RequestContext
5
7
import datadog.trace.api.gateway.RequestContextSlot
8
+ import datadog.trace.api.iast.SourceTypes
9
+ import datadog.trace.api.iast.Taintable
6
10
import datadog.trace.api.iast.propagation.StringModule
7
11
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
8
12
import datadog.trace.bootstrap.instrumentation.api.AgentTracer
@@ -16,6 +20,7 @@ import static com.datadog.iast.taint.TaintUtils.fromTaintFormat
16
20
import static com.datadog.iast.taint.TaintUtils.getStringFromTaintFormat
17
21
import static com.datadog.iast.taint.TaintUtils.taint
18
22
import static com.datadog.iast.taint.TaintUtils.taintFormat
23
+ import static com.datadog.iast.taint.TaintUtils.taintObject
19
24
20
25
@CompileDynamic
21
26
class StringModuleTest extends IastModuleImplTestBase {
@@ -1298,6 +1303,65 @@ class StringModuleTest extends IastModuleImplTestBase {
1298
1303
"==>my_o<==u==>tput<====>my_o<==u==>tput<==" | ' out' | ' ==> in <= = ' | 0 | "==>my_o<==u==>tput<====>my_o<==u==>tput<=="
1299
1304
}
1300
1305
1306
+ void ' test valueOf with (#param) and make sure IastRequestContext is called' () {
1307
+ given:
1308
+ final taintedObjects = ctx.getTaintedObjects()
1309
+ def paramTainted = addFromTaintFormat(taintedObjects, param)
1310
+ def result = String.valueOf(paramTainted)
1311
+
1312
+ when:
1313
+ module.onStringValueOf(paramTainted, result)
1314
+ def taintedObject = taintedObjects.get(result)
1315
+
1316
+ then:
1317
+ 1 * tracer.activeSpan() >> span
1318
+ taintFormat(result, taintedObject.getRanges()) == expected
1319
+
1320
+ where:
1321
+ param | expected
1322
+ "==>test<==" | "==>test<=="
1323
+ sb("==>test<==") | "==>test<=="
1324
+ sbf("==>my_input<==") | "==>my_input<=="
1325
+ }
1326
+
1327
+ void ' test valueOf with taintable object and make sure IastRequestContext is called' () {
1328
+ given:
1329
+ final taintedObjects = ctx.getTaintedObjects()
1330
+ final source = taintedSource()
1331
+ final param = taintable(taintedObjects, source)
1332
+ final result = String.valueOf(param)
1333
+
1334
+ when:
1335
+ module.onStringValueOf(param, result)
1336
+ final taintedObject = taintedObjects.get(result)
1337
+
1338
+ then:
1339
+ 1 * tracer.activeSpan() >> span
1340
+ taintFormat(result, taintedObject.getRanges()) == "==>my_input<=="
1341
+ }
1342
+
1343
+ void ' test valueOf with special objects and make sure IastRequestContext is called' () {
1344
+ given:
1345
+ final taintedObjects = ctx.getTaintedObjects()
1346
+ final source = taintedSource()
1347
+ final param = new Object() {
1348
+ @Override
1349
+ String toString() {
1350
+ return "my_input"
1351
+ }
1352
+ }
1353
+ taintObject(taintedObjects, param, source)
1354
+ final result = String.valueOf(param)
1355
+
1356
+ when:
1357
+ module.onStringValueOf(param, result)
1358
+ final taintedObject = taintedObjects.get(result)
1359
+
1360
+ then:
1361
+ 1 * tracer.activeSpan() >> span
1362
+ taintFormat(result, taintedObject.getRanges()) == "==>my_input<=="
1363
+ }
1364
+
1301
1365
private static Date date(final String pattern, final String value) {
1302
1366
return new SimpleDateFormat(pattern).parse(value)
1303
1367
}
@@ -1310,11 +1374,44 @@ class StringModuleTest extends IastModuleImplTestBase {
1310
1374
return new StringBuilder(string)
1311
1375
}
1312
1376
1313
- private static StringBuilder sbf() {
1377
+ private static StringBuffer sbf() {
1314
1378
return sbf(' ' )
1315
1379
}
1316
1380
1317
1381
private static StringBuffer sbf(final String string) {
1318
1382
return new StringBuffer(string)
1319
1383
}
1384
+
1385
+ private static Source taintedSource(String value = ' value' ) {
1386
+ return new Source(SourceTypes.REQUEST_PARAMETER_VALUE, ' name' , value)
1387
+ }
1388
+
1389
+ private static Taintable taintable(TaintedObjects tos, Source source = null) {
1390
+ final result = new MockTaintable()
1391
+ if (source != null) {
1392
+ taintObject(tos, result, source)
1393
+ }
1394
+ return result
1395
+ }
1396
+
1397
+ private static class MockTaintable implements Taintable {
1398
+ private Source source
1399
+
1400
+ @SuppressWarnings(' CodeNarc ' )
1401
+ @Override
1402
+ Source $$DD$getSource() {
1403
+ return source
1404
+ }
1405
+
1406
+ @SuppressWarnings(' CodeNarc ' )
1407
+ @Override
1408
+ void $$DD$setSource(Source source) {
1409
+ this.source = source
1410
+ }
1411
+
1412
+ @Override
1413
+ String toString() {
1414
+ return "my_input"
1415
+ }
1416
+ }
1320
1417
}
0 commit comments