|
1 | 1 | package com.datadog.iast.sink
|
2 | 2 |
|
3 | 3 | import com.datadog.iast.IastModuleImplTestBase
|
| 4 | +import com.datadog.iast.IastRequestContext |
| 5 | +import com.datadog.iast.model.Source |
| 6 | +import com.datadog.iast.overhead.Operations |
| 7 | +import com.datadog.iast.propagation.PropagationModuleImpl |
| 8 | +import com.datadog.iast.taint.Ranges |
| 9 | +import datadog.trace.api.gateway.RequestContext |
| 10 | +import datadog.trace.api.gateway.RequestContextSlot |
| 11 | +import datadog.trace.bootstrap.instrumentation.api.AgentSpan |
4 | 12 |
|
5 |
| -class AbstractSinkModuleTest extends IastModuleImplTestBase { |
| 13 | +import static com.datadog.iast.model.VulnerabilityType.SSRF |
| 14 | +import static datadog.trace.api.iast.SourceTypes.REQUEST_PARAMETER_VALUE |
| 15 | + |
| 16 | +class AbstractSinkModuleTest extends IastModuleImplTestBase { |
6 | 17 |
|
7 | 18 | final StackTraceElement ignoredPackageClassElement = element("org.springframework.Ignored")
|
8 | 19 | final StackTraceElement notIgnoredPackageClassElement = element("datadog.smoketest.NotIgnored")
|
9 | 20 | final StackTraceElement notInIastExclusionTrie = element("not.in.iast.exclusion.Class")
|
10 | 21 |
|
| 22 | + private IastRequestContext ctx |
| 23 | + private AgentSpan span |
| 24 | + |
| 25 | + void setup() { |
| 26 | + ctx = new IastRequestContext() |
| 27 | + final reqCtx = Mock(RequestContext) { |
| 28 | + getData(RequestContextSlot.IAST) >> ctx |
| 29 | + } |
| 30 | + span = Mock(AgentSpan) { |
| 31 | + getRequestContext() >> reqCtx |
| 32 | + } |
| 33 | + tracer.activeSpan() >> span |
| 34 | + } |
11 | 35 |
|
12 | 36 | void 'filter ignored package element from stack'() {
|
13 | 37 |
|
@@ -43,6 +67,31 @@ class AbstractSinkModuleTest extends IastModuleImplTestBase {
|
43 | 67 | result == expected
|
44 | 68 | }
|
45 | 69 |
|
| 70 | + void 'test reporting evidence on objects'() { |
| 71 | + given: |
| 72 | + final sink = registerDependencies(new SinkModuleBase() {}) |
| 73 | + final propagation = new PropagationModuleImpl() |
| 74 | + final input = new String(source.value) |
| 75 | + ctx.getTaintedObjects().taint(source.value, Ranges.forCharSequence(input, source)) |
| 76 | + |
| 77 | + when: |
| 78 | + propagation.taintIfTainted(toReport, input) |
| 79 | + final evidence = sink.checkInjection(span, ctx, SSRF, toReport) |
| 80 | + |
| 81 | + then: |
| 82 | + 1 * overheadController.consumeQuota(Operations.REPORT_VULNERABILITY, span) >> true |
| 83 | + evidence.ranges.length == 1 |
| 84 | + |
| 85 | + final range = evidence.ranges[0] |
| 86 | + final taintedEvidence = evidence.value.toString().substring(range.start, range.start + range.length) |
| 87 | + taintedEvidence == input |
| 88 | + |
| 89 | + where: |
| 90 | + source | toReport |
| 91 | + new Source(REQUEST_PARAMETER_VALUE, 'url', 'datadog.com') | new URL('https://datadog.com/index.html') |
| 92 | + new Source(REQUEST_PARAMETER_VALUE, 'url', 'datadog.com') | new URI('https://datadog.com/index.html') |
| 93 | + } |
| 94 | + |
46 | 95 | private StackTraceElement element(final String declaringClass) {
|
47 | 96 | return new StackTraceElement(declaringClass, "method", "fileName", 1)
|
48 | 97 | }
|
|
0 commit comments