Skip to content

Commit 5734454

Browse files
Merge branch 'sezen.leblay/upgrade-libddwaf-java-1.23' into sezen.leblay/APPSEC-57270-default-regex-change
2 parents 2856a4e + d5435c9 commit 5734454

33 files changed

+6209
-2373
lines changed

dd-java-agent/appsec/build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@ ext {
6868
minimumBranchCoverage = 0.6
6969
minimumInstructionCoverage = 0.8
7070
excludedClassesCoverage = [
71-
'com.datadog.appsec.config.MergedAsmData.InvalidAsmDataException',
71+
'com.datadog.appsec.config.AppSecConfigServiceImpl.AppSecConfigChangesListener',
7272
'com.datadog.appsec.ddwaf.WafInitialization',
7373
'com.datadog.appsec.ddwaf.WAFModule.WAFDataCallback',
74+
'com.datadog.appsec.config.AppSecModuleConfigurer.Reconfiguration',
7475
'com.datadog.appsec.report.*',
7576
'com.datadog.appsec.config.AppSecConfigServiceImpl.SubscribeFleetServiceRunnable.1',
7677
'com.datadog.appsec.util.StandardizedLogging',
@@ -82,6 +83,7 @@ ext {
8283
'com.datadog.appsec.config.AppSecFeatures.Asm',
8384
'com.datadog.appsec.config.AppSecFeatures.ApiSecurity',
8485
'com.datadog.appsec.config.AppSecFeatures.AutoUserInstrum',
86+
'com.datadog.appsec.AppSecModule.AppSecModuleActivationException',
8587
'com.datadog.appsec.event.ReplaceableEventProducerService',
8688
'com.datadog.appsec.api.security.ApiSecuritySampler.NoOp',
8789
]

dd-java-agent/appsec/src/jmh/java/datadog/appsec/benchmark/WafBenchmark.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,24 @@
33
import static java.util.concurrent.TimeUnit.MICROSECONDS;
44
import static java.util.concurrent.TimeUnit.SECONDS;
55

6-
import com.datadog.appsec.config.AppSecConfig;
7-
import com.datadog.appsec.config.AppSecConfigDeserializer;
86
import com.datadog.appsec.event.data.KnownAddresses;
97
import com.datadog.ddwaf.Waf;
8+
import com.datadog.ddwaf.WafBuilder;
109
import com.datadog.ddwaf.WafContext;
1110
import com.datadog.ddwaf.WafHandle;
1211
import com.datadog.ddwaf.WafMetrics;
1312
import com.datadog.ddwaf.exception.AbstractWafException;
13+
import com.squareup.moshi.JsonAdapter;
14+
import com.squareup.moshi.Moshi;
15+
import com.squareup.moshi.Types;
1416
import java.io.IOException;
1517
import java.io.InputStream;
1618
import java.util.ArrayList;
1719
import java.util.Collections;
1820
import java.util.HashMap;
1921
import java.util.List;
2022
import java.util.Map;
23+
import okio.Okio;
2124
import org.openjdk.jmh.annotations.Benchmark;
2225
import org.openjdk.jmh.annotations.BenchmarkMode;
2326
import org.openjdk.jmh.annotations.Fork;
@@ -38,45 +41,49 @@
3841
@OutputTimeUnit(MICROSECONDS)
3942
@Fork(value = 3)
4043
public class WafBenchmark {
44+
private static final JsonAdapter<Map<String, Object>> ADAPTER =
45+
new Moshi.Builder()
46+
.build()
47+
.adapter(Types.newParameterizedType(Map.class, String.class, Object.class));
4148

4249
static {
4350
BenchmarkUtil.disableLogging();
4451
BenchmarkUtil.initializeWaf();
4552
}
4653

47-
WafHandle ctx;
54+
WafBuilder wafBuilder;
55+
WafHandle wafHandle;
56+
WafContext wafContext;
4857
Map<String, Object> wafData = new HashMap<>();
4958
Waf.Limits limits = new Waf.Limits(50, 500, 1000, 5000000, 5000000);
5059

5160
@Benchmark
5261
public void withMetrics() throws Exception {
53-
WafMetrics metricsCollector = ctx.createMetrics();
54-
WafContext add = ctx.openContext();
62+
WafMetrics metricsCollector = new WafMetrics();
63+
wafContext = new WafContext(wafHandle);
5564
try {
56-
add.run(wafData, limits, metricsCollector);
65+
wafContext.run(wafData, limits, metricsCollector);
5766
} finally {
58-
add.close();
67+
wafContext.close();
5968
}
6069
}
6170

6271
@Benchmark
6372
public void withoutMetrics() throws Exception {
64-
WafContext add = ctx.openContext();
73+
wafContext = new WafContext(wafHandle);
6574
try {
66-
add.run(wafData, limits, null);
75+
wafContext.run(wafData, limits, null);
6776
} finally {
68-
add.close();
77+
wafContext.close();
6978
}
7079
}
7180

7281
@Setup(Level.Trial)
7382
public void setUp() throws AbstractWafException, IOException {
83+
wafBuilder = new WafBuilder();
7484
InputStream stream = getClass().getClassLoader().getResourceAsStream("test_multi_config.json");
75-
Map<String, AppSecConfig> cfg =
76-
Collections.singletonMap("waf", AppSecConfigDeserializer.INSTANCE.deserialize(stream));
77-
AppSecConfig waf = cfg.get("waf");
78-
ctx = Waf.createHandle("waf", waf.getRawConfig());
79-
85+
wafBuilder.addOrUpdateConfig("waf", ADAPTER.fromJson(Okio.buffer(Okio.source(stream))));
86+
wafHandle = wafBuilder.buildWafHandleInstance();
8087
wafData.put(KnownAddresses.REQUEST_METHOD.getKey(), "POST");
8188
wafData.put(
8289
KnownAddresses.REQUEST_URI_RAW.getKey(), "/foo/bar?foo=bar&foo=xpto&foo=%3cscript%3e");
@@ -112,6 +119,14 @@ public void setUp() throws AbstractWafException, IOException {
112119

113120
@TearDown(Level.Trial)
114121
public void teardown() {
115-
ctx.close();
122+
if (wafHandle != null && wafHandle.isOnline()) {
123+
wafHandle.close();
124+
}
125+
if (wafContext != null && wafContext.isOnline()) {
126+
wafContext.close();
127+
}
128+
if (wafBuilder != null && wafBuilder.isOnline()) {
129+
wafBuilder.close();
130+
}
116131
}
117132
}

dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@
33
import com.datadog.appsec.config.AppSecModuleConfigurer;
44
import com.datadog.appsec.event.DataListener;
55
import com.datadog.appsec.event.data.Address;
6+
import com.datadog.ddwaf.WafBuilder;
67
import java.util.Collection;
78

89
public interface AppSecModule {
910
void config(AppSecModuleConfigurer appSecConfigService) throws AppSecModuleActivationException;
1011

12+
void setWafBuilder(WafBuilder wafBuilder);
13+
14+
void setRuleVersion(String rulesetVersion);
15+
1116
String getName();
1217

1318
String getInfo();
1419

1520
Collection<DataSubscription> getDataSubscriptions();
1621

22+
boolean isWafBuilderSet();
23+
1724
abstract class DataSubscription implements DataListener {
1825
private final Collection<Address<?>> subscribedAddresses;
1926
private final Priority priority;

dd-java-agent/appsec/src/main/java/com/datadog/appsec/AppSecSystem.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,9 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
7676
APP_SEC_CONFIG_SERVICE =
7777
new AppSecConfigServiceImpl(
7878
config, configurationPoller, () -> reloadSubscriptions(REPLACEABLE_EVENT_PRODUCER));
79-
APP_SEC_CONFIG_SERVICE.init();
80-
79+
if (appSecEnabledConfig == ProductActivation.FULLY_ENABLED) {
80+
APP_SEC_CONFIG_SERVICE.init();
81+
}
8182
sco.createRemaining(config);
8283

8384
GatewayBridge gatewayBridge =
@@ -87,7 +88,8 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
8788
() -> API_SECURITY_SAMPLER,
8889
APP_SEC_CONFIG_SERVICE.getTraceSegmentPostProcessors());
8990

90-
loadModules(eventDispatcher, sco.monitoring);
91+
loadModules(
92+
eventDispatcher, sco.monitoring, appSecEnabledConfig == ProductActivation.FULLY_ENABLED);
9193

9294
gatewayBridge.init();
9395
STOP_SUBSCRIPTION_SERVICE = gatewayBridge::stop;
@@ -136,20 +138,25 @@ public static void stop() {
136138
RESET_SUBSCRIPTION_SERVICE = null;
137139
}
138140
Blocking.setBlockingService(BlockingService.NOOP);
139-
140141
APP_SEC_CONFIG_SERVICE.close();
141142
}
142143

143-
private static void loadModules(EventDispatcher eventDispatcher, Monitoring monitoring) {
144+
private static void loadModules(
145+
EventDispatcher eventDispatcher, Monitoring monitoring, boolean appSecEnabledConfig) {
144146
EventDispatcher.DataSubscriptionSet dataSubscriptionSet =
145147
new EventDispatcher.DataSubscriptionSet();
146148

147149
final List<AppSecModule> modules = Collections.singletonList(new WAFModule(monitoring));
150+
APP_SEC_CONFIG_SERVICE.modulesToUpdateVersionIn(modules);
148151
for (AppSecModule module : modules) {
149152
log.debug("Starting appsec module {}", module.getName());
150153
try {
151-
AppSecConfigService.TransactionalAppSecModuleConfigurer cfgObject;
152-
cfgObject = APP_SEC_CONFIG_SERVICE.createAppSecModuleConfigurer();
154+
AppSecConfigService.TransactionalAppSecModuleConfigurer cfgObject =
155+
APP_SEC_CONFIG_SERVICE.createAppSecModuleConfigurer();
156+
module.setRuleVersion(APP_SEC_CONFIG_SERVICE.getCurrentRuleVersion());
157+
if (appSecEnabledConfig) {
158+
module.setWafBuilder(APP_SEC_CONFIG_SERVICE.getWafBuilder());
159+
}
153160
module.config(cfgObject);
154161
cfgObject.commit();
155162
} catch (RuntimeException | AppSecModule.AppSecModuleActivationException t) {
@@ -174,6 +181,7 @@ private static void reloadSubscriptions(
174181

175182
EventDispatcher newEd = new EventDispatcher();
176183
for (AppSecModule module : STARTED_MODULES_INFO.keySet()) {
184+
module.setRuleVersion(APP_SEC_CONFIG_SERVICE.getCurrentRuleVersion());
177185
for (AppSecModule.DataSubscription sub : module.getDataSubscriptions()) {
178186
dataSubscriptionSet.addSubscription(sub.getSubscribedAddresses(), sub);
179187
}

dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfig.java

Lines changed: 0 additions & 124 deletions
This file was deleted.

dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigDeserializer.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)