Skip to content

Commit b9f5a74

Browse files
authored
Merge branch 'master' into alejandro.gonzalez/APPSEC-61873-3
2 parents 182ce98 + 067d0d2 commit b9f5a74

File tree

61 files changed

+1245
-346
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1245
-346
lines changed

dd-java-agent/agent-aiguard/src/main/java/com/datadog/aiguard/AIGuardInternal.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public BadConfigurationException(final String message) {
7373
static final String META_STRUCT_MESSAGES = "messages";
7474
static final String META_STRUCT_CATEGORIES = "attack_categories";
7575
static final String META_STRUCT_SDS = "sds";
76+
static final String META_STRUCT_TAG_PROBS = "tag_probs";
7677

7778
public static void install() {
7879
final Config config = Config.get();
@@ -258,13 +259,18 @@ public Evaluation evaluate(final List<Message> messages, final Options options)
258259
final List<String> tags = (List<String>) result.get("tags");
259260
@SuppressWarnings("unchecked")
260261
final List<?> sdsFindings = (List<?>) result.get("sds_findings");
262+
@SuppressWarnings("unchecked")
263+
final Map<String, Number> tagProbs = (Map<String, Number>) result.get("tag_probs");
261264
span.setTag(ACTION_TAG, action);
262265
if (reason != null) {
263266
span.setTag(REASON_TAG, reason);
264267
}
265268
if (tags != null && !tags.isEmpty()) {
266269
metaStruct.put(META_STRUCT_CATEGORIES, tags);
267270
}
271+
if (tagProbs != null && !tagProbs.isEmpty()) {
272+
metaStruct.put(META_STRUCT_TAG_PROBS, tagProbs);
273+
}
268274
if (sdsFindings != null && !sdsFindings.isEmpty()) {
269275
metaStruct.put(META_STRUCT_SDS, sdsFindings);
270276
}
@@ -273,9 +279,9 @@ public Evaluation evaluate(final List<Message> messages, final Options options)
273279
WafMetricCollector.get().aiGuardRequest(action, shouldBlock);
274280
if (shouldBlock) {
275281
span.setTag(BLOCKED_TAG, true);
276-
throw new AIGuardAbortError(action, reason, tags, sdsFindings);
282+
throw new AIGuardAbortError(action, reason, tags, tagProbs, sdsFindings);
277283
}
278-
return new Evaluation(action, reason, tags, sdsFindings);
284+
return new Evaluation(action, reason, tags, tagProbs, sdsFindings);
279285
}
280286
} catch (AIGuardAbortError e) {
281287
span.addThrowable(e);

dd-java-agent/agent-aiguard/src/test/groovy/com/datadog/aiguard/AIGuardInternalTests.groovy

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class AIGuardInternalTests extends DDSpecification {
168168
return mockResponse(
169169
request,
170170
200,
171-
[data: [attributes: [action: suite.action, reason: suite.reason, tags: suite.tags ?: [], is_blocking_enabled: suite.blocking]]]
171+
[data: [attributes: [action: suite.action, reason: suite.reason, tags: suite.tags ?: [], tag_probs: suite.tagProbabilities ?: [:], is_blocking_enabled: suite.blocking]]]
172172
)
173173
}
174174
}
@@ -210,12 +210,14 @@ class AIGuardInternalTests extends DDSpecification {
210210
error.action == suite.action
211211
error.reason == suite.reason
212212
error.tags == suite.tags
213+
error.tagProbabilities == suite.tagProbabilities
213214
error.sds == []
214215
} else {
215216
error == null
216217
eval.action == suite.action
217218
eval.reason == suite.reason
218219
eval.tags == suite.tags
220+
eval.tagProbabilities == suite.tagProbabilities
219221
eval.sds == []
220222
}
221223
assertTelemetry('ai_guard.requests', "action:$suite.action", "block:$throwAbortError", 'error:false')
@@ -555,6 +557,9 @@ class AIGuardInternalTests extends DDSpecification {
555557
if (suite.tags) {
556558
assert meta.attack_categories == suite.tags
557559
}
560+
if (suite.tagProbabilities) {
561+
assert meta.tag_probs == suite.tagProbabilities
562+
}
558563
final receivedMessages = snakeCaseJson(meta.messages)
559564
final expectedMessages = snakeCaseJson(suite.messages)
560565
JSONAssert.assertEquals(expectedMessages, receivedMessages, JSONCompareMode.NON_EXTENSIBLE)
@@ -774,15 +779,17 @@ class AIGuardInternalTests extends DDSpecification {
774779
private final AIGuard.Action action
775780
private final String reason
776781
private final List<String> tags
782+
private final Map<String, Double> tagProbabilities
777783
private final boolean blocking
778784
private final String description
779785
private final String target
780786
private final List<AIGuard.Message> messages
781787

782-
TestSuite(AIGuard.Action action, String reason, List<String> tags, boolean blocking, String description, String target, List<AIGuard.Message> messages) {
788+
TestSuite(AIGuard.Action action, String reason, Map<String, Double> tagProbabilities, boolean blocking, String description, String target, List<AIGuard.Message> messages) {
783789
this.action = action
784790
this.reason = reason
785-
this.tags = tags
791+
this.tags = new ArrayList<>(tagProbabilities.keySet())
792+
this.tagProbabilities = tagProbabilities
786793
this.blocking = blocking
787794
this.description = description
788795
this.target = target
@@ -791,9 +798,9 @@ class AIGuardInternalTests extends DDSpecification {
791798

792799
static List<TestSuite> build() {
793800
def actionValues = [
794-
[ALLOW, 'Go ahead', []],
795-
[DENY, 'Nope', ['deny_everything', 'test_deny']],
796-
[ABORT, 'Kill it with fire', ['alarm_tag', 'abort_everything']]
801+
[ALLOW, 'Go ahead', [:]],
802+
[DENY, 'Nope', ['deny_everything': 0.2D, 'test_deny': 0.8D]],
803+
[ABORT, 'Kill it with fire', ['alarm_tag': 0.1D, 'abort_everything': 0.9D]]
797804
]
798805
def blockingValues = [true, false]
799806
def suiteValues = [

dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan
55
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext
66
import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities
77
import datadog.trace.bootstrap.instrumentation.api.Tags
8+
import datadog.trace.config.inversion.ConfigHelper
89
import datadog.trace.test.util.DDSpecification
910
import spock.lang.Shared
1011

1112
class BaseDecoratorTest extends DDSpecification {
1213

14+
def setupSpec() {
15+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
16+
}
17+
1318
@Shared
1419
def decorator = newDecorator()
1520

dd-java-agent/agent-installer/src/test/groovy/datadog/trace/agent/test/DefaultInstrumenterForkedTest.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package datadog.trace.agent.test
22

33
import datadog.environment.EnvironmentVariables
44
import datadog.trace.agent.tooling.InstrumenterModule
5+
import datadog.trace.config.inversion.ConfigHelper
56
import datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers
67
import datadog.trace.agent.tooling.bytebuddy.outline.TypePoolFacade
78
import datadog.trace.test.util.DDSpecification
@@ -12,6 +13,10 @@ class DefaultInstrumenterForkedTest extends DDSpecification {
1213
DDElementMatchers.registerAsSupplier()
1314
}
1415

16+
def setupSpec() {
17+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
18+
}
19+
1520
def "default enabled"() {
1621
setup:
1722
def target = new TestDefaultInstrumenter("test")

dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/InstrumenterIndexTest.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package datadog.trace.agent.tooling
22

3+
import datadog.trace.config.inversion.ConfigHelper
34
import datadog.trace.test.util.DDSpecification
45
import spock.lang.Shared
56

67
class InstrumenterIndexTest extends DDSpecification {
78

9+
def setupSpec() {
10+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
11+
}
12+
813
@Shared
914
def unknownInstrumentation = new InstrumenterModule('unknown') {}
1015

dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/csi/BaseCallSiteTest.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import datadog.trace.agent.tooling.bytebuddy.csi.Advices
44
import datadog.trace.agent.tooling.bytebuddy.csi.CallSiteInstrumentation
55
import datadog.trace.agent.tooling.bytebuddy.csi.CallSiteSupplier
66
import datadog.trace.agent.tooling.bytebuddy.csi.CallSiteTransformer
7+
import datadog.trace.config.inversion.ConfigHelper
78
import datadog.trace.test.util.DDSpecification
89
import groovy.transform.CompileDynamic
910
import net.bytebuddy.agent.builder.AgentBuilder
@@ -31,6 +32,10 @@ import static net.bytebuddy.matcher.ElementMatchers.named
3132
@CompileDynamic
3233
class BaseCallSiteTest extends DDSpecification {
3334

35+
def setupSpec() {
36+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
37+
}
38+
3439
protected CallSites mockCallSites(final byte type = BEFORE, final CallSiteAdvice advice, final Pointcut target, final String... helpers) {
3540
return Stub(CallSites) {
3641
accept(_ as CallSites.Container) >> {

dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/muzzle/MuzzleVersionScanPluginTest.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package datadog.trace.agent.tooling.muzzle
22

33
import datadog.trace.agent.tooling.Instrumenter
44
import datadog.trace.agent.tooling.InstrumenterModule
5+
import datadog.trace.config.inversion.ConfigHelper
56
import datadog.trace.test.util.DDSpecification
67
import net.bytebuddy.matcher.ElementMatcher
78

@@ -20,6 +21,10 @@ import static datadog.trace.agent.tooling.muzzle.TestInstrumentationClasses.Vali
2021

2122
class MuzzleVersionScanPluginTest extends DDSpecification {
2223

24+
def setupSpec() {
25+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
26+
}
27+
2328
def "test assertInstrumentationMuzzled advice"() {
2429
setup:
2530
def instrumentationLoader = new ServiceEnabledClassLoader(InstrumenterModule,

dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.CODE_ORIGIN_FO
1010
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.closePrevious
1111
import static datadog.trace.util.AgentThreadFactory.AgentThread.TASK_SCHEDULER
1212

13+
1314
import ch.qos.logback.classic.Level
1415
import ch.qos.logback.classic.util.ContextInitializer
1516
import com.datadog.debugger.agent.ClassesToRetransformFinder

dd-java-agent/instrumentation-testing/src/test/groovy/AgentTestRunnerTest.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import com.google.common.reflect.ClassPath
22
import datadog.trace.agent.test.InstrumentationSpecification
3+
import datadog.trace.config.inversion.ConfigHelper
34
import datadog.trace.agent.test.BootstrapClasspathSetupListener
45
import datadog.trace.api.GlobalTracer
56
import datadog.trace.api.Platform
@@ -26,6 +27,8 @@ class AgentTestRunnerTest extends InstrumentationSpecification {
2627
@Override
2728
void configurePreAgent() {
2829
super.configurePreAgent()
30+
// Opt out of strict config validation - test module loads test instrumentations with fake names
31+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
2932

3033
injectSysConfig(TRACE_CLASSES_EXCLUDE, "config.exclude.packagename.*, config.exclude.SomeClass,config.exclude.SomeClass\$NestedClass")
3134
}

dd-java-agent/instrumentation-testing/src/test/groovy/ConfigResetTest.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import datadog.environment.EnvironmentVariables
22
import datadog.trace.agent.test.InstrumentationSpecification
3+
import datadog.trace.config.inversion.ConfigHelper
34
import datadog.trace.api.Config
45
import spock.lang.Shared
56

67
class ConfigResetTest extends InstrumentationSpecification {
78

9+
@Override
10+
protected void configurePreAgent() {
11+
super.configurePreAgent()
12+
// Opt out of strict config validation - test module loads test instrumentations with fake names
13+
ConfigHelper.get().setConfigInversionStrict(ConfigHelper.StrictnessPolicy.TEST)
14+
}
15+
816
@Shared
917
def sharedInstance = checkStaticAssertions()
1018

0 commit comments

Comments
 (0)