Skip to content

Commit 42d1fd1

Browse files
committed
Upgrade libddwaf java to 14.0.0
1 parent 368851d commit 42d1fd1

21 files changed

+794
-909
lines changed

dd-java-agent/appsec/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ dependencies {
1515
implementation project(':internal-api')
1616
implementation project(':communication')
1717
implementation project(':telemetry')
18-
implementation group: 'io.sqreen', name: 'libsqreen', version: '13.0.1'
18+
implementation group: 'io.sqreen', name: 'libsqreen', version: '14.0.0-SNAPSHOT'
1919
implementation libs.moshi
2020

2121
testImplementation libs.bytebuddy

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

+10-7
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import com.datadog.appsec.config.AppSecConfigDeserializer;
88
import com.datadog.appsec.event.data.KnownAddresses;
99
import com.datadog.ddwaf.Waf;
10+
import com.datadog.ddwaf.WafBuilder;
1011
import com.datadog.ddwaf.WafContext;
11-
import com.datadog.ddwaf.WafHandle;
1212
import com.datadog.ddwaf.WafMetrics;
1313
import com.datadog.ddwaf.exception.AbstractWafException;
1414
import java.io.IOException;
@@ -44,14 +44,14 @@ public class WafBenchmark {
4444
BenchmarkUtil.initializeWaf();
4545
}
4646

47-
WafHandle ctx;
47+
WafBuilder wafBuilder;
4848
Map<String, Object> wafData = new HashMap<>();
4949
Waf.Limits limits = new Waf.Limits(50, 500, 1000, 5000000, 5000000);
5050

5151
@Benchmark
5252
public void withMetrics() throws Exception {
53-
WafMetrics metricsCollector = ctx.createMetrics();
54-
WafContext add = ctx.openContext();
53+
WafMetrics metricsCollector = new WafMetrics();
54+
WafContext add = new WafContext(wafBuilder);
5555
try {
5656
add.run(wafData, limits, metricsCollector);
5757
} finally {
@@ -61,7 +61,7 @@ public void withMetrics() throws Exception {
6161

6262
@Benchmark
6363
public void withoutMetrics() throws Exception {
64-
WafContext add = ctx.openContext();
64+
WafContext add = new WafContext(wafBuilder);
6565
try {
6666
add.run(wafData, limits, null);
6767
} finally {
@@ -75,7 +75,8 @@ public void setUp() throws AbstractWafException, IOException {
7575
Map<String, AppSecConfig> cfg =
7676
Collections.singletonMap("waf", AppSecConfigDeserializer.INSTANCE.deserialize(stream));
7777
AppSecConfig waf = cfg.get("waf");
78-
ctx = Waf.createHandle("waf", waf.getRawConfig());
78+
wafBuilder = new WafBuilder();
79+
wafBuilder.addOrUpdateConfig("waf", waf.getRawConfig());
7980

8081
wafData.put(KnownAddresses.REQUEST_METHOD.getKey(), "POST");
8182
wafData.put(
@@ -112,6 +113,8 @@ public void setUp() throws AbstractWafException, IOException {
112113

113114
@TearDown(Level.Trial)
114115
public void teardown() {
115-
ctx.close();
116+
if (wafBuilder != null && !wafBuilder.isOnline()) {
117+
wafBuilder.destroy();
118+
}
116119
}
117120
}

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
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 {
9-
void config(AppSecModuleConfigurer appSecConfigService) throws AppSecModuleActivationException;
10+
void config(AppSecModuleConfigurer appSecConfigService, WafBuilder wafBuilder)
11+
throws AppSecModuleActivationException;
1012

1113
String getName();
1214

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

+32-7
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
import com.datadog.appsec.config.AppSecConfigService;
88
import com.datadog.appsec.config.AppSecConfigServiceImpl;
99
import com.datadog.appsec.ddwaf.WAFModule;
10+
import com.datadog.appsec.ddwaf.WafInitialization;
1011
import com.datadog.appsec.event.EventDispatcher;
1112
import com.datadog.appsec.event.ReplaceableEventProducerService;
1213
import com.datadog.appsec.gateway.GatewayBridge;
1314
import com.datadog.appsec.util.AbortStartupException;
1415
import com.datadog.appsec.util.StandardizedLogging;
16+
import com.datadog.ddwaf.WafBuilder;
17+
import com.datadog.ddwaf.WafConfig;
1518
import datadog.appsec.api.blocking.Blocking;
1619
import datadog.appsec.api.blocking.BlockingService;
1720
import datadog.communication.ddagent.SharedCommunicationObjects;
@@ -43,6 +46,7 @@ public class AppSecSystem {
4346
private static ReplaceableEventProducerService REPLACEABLE_EVENT_PRODUCER; // testing
4447
private static Runnable STOP_SUBSCRIPTION_SERVICE;
4548
private static Runnable RESET_SUBSCRIPTION_SERVICE;
49+
private static WafBuilder wafBuilder;
4650

4751
public static void start(SubscriptionService gw, SharedCommunicationObjects sco) {
4852
try {
@@ -64,7 +68,10 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
6468
return;
6569
}
6670
log.debug("AppSec is starting ({})", appSecEnabledConfig);
67-
71+
if (!WafInitialization.ONLINE) {
72+
log.debug("In-app WAF initialization failed. See previous log entries");
73+
return;
74+
}
6875
REPLACEABLE_EVENT_PRODUCER = new ReplaceableEventProducerService();
6976
EventDispatcher eventDispatcher = new EventDispatcher();
7077
REPLACEABLE_EVENT_PRODUCER.replaceEventProducerService(eventDispatcher);
@@ -86,7 +93,8 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
8693
APP_SEC_CONFIG_SERVICE =
8794
new AppSecConfigServiceImpl(
8895
config, configurationPoller, () -> reloadSubscriptions(REPLACEABLE_EVENT_PRODUCER));
89-
APP_SEC_CONFIG_SERVICE.init();
96+
wafBuilder = new WafBuilder(createWafConfig(config));
97+
APP_SEC_CONFIG_SERVICE.init(wafBuilder);
9098

9199
sco.createRemaining(config);
92100

@@ -105,7 +113,7 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
105113

106114
setActive(appSecEnabledConfig == ProductActivation.FULLY_ENABLED);
107115

108-
APP_SEC_CONFIG_SERVICE.maybeSubscribeConfigPolling();
116+
APP_SEC_CONFIG_SERVICE.maybeSubscribeConfigPolling(wafBuilder);
109117

110118
Blocking.setBlockingService(new BlockingServiceImpl(REPLACEABLE_EVENT_PRODUCER));
111119

@@ -143,8 +151,8 @@ public static void stop() {
143151
RESET_SUBSCRIPTION_SERVICE = null;
144152
}
145153
Blocking.setBlockingService(BlockingService.NOOP);
146-
147154
APP_SEC_CONFIG_SERVICE.close();
155+
wafBuilder.destroy();
148156
}
149157

150158
private static void loadModules(EventDispatcher eventDispatcher, Monitoring monitoring) {
@@ -155,9 +163,9 @@ private static void loadModules(EventDispatcher eventDispatcher, Monitoring moni
155163
for (AppSecModule module : modules) {
156164
log.debug("Starting appsec module {}", module.getName());
157165
try {
158-
AppSecConfigService.TransactionalAppSecModuleConfigurer cfgObject;
159-
cfgObject = APP_SEC_CONFIG_SERVICE.createAppSecModuleConfigurer();
160-
module.config(cfgObject);
166+
AppSecConfigService.TransactionalAppSecModuleConfigurer cfgObject =
167+
APP_SEC_CONFIG_SERVICE.createAppSecModuleConfigurer();
168+
module.config(cfgObject, wafBuilder);
161169
cfgObject.commit();
162170
} catch (RuntimeException | AppSecModule.AppSecModuleActivationException t) {
163171
log.error("Startup of appsec module {} failed", module.getName(), t);
@@ -209,4 +217,21 @@ public static Set<String> getStartedModulesInfo() {
209217
return Collections.emptySet();
210218
}
211219
}
220+
221+
private static WafConfig createWafConfig(Config config) {
222+
WafConfig wafConfig = new WafConfig();
223+
String keyRegexp = config.getAppSecObfuscationParameterKeyRegexp();
224+
if (keyRegexp != null) {
225+
wafConfig.obfuscatorKeyRegex = keyRegexp;
226+
} else { // reset
227+
wafConfig.obfuscatorKeyRegex = WafConfig.DEFAULT_KEY_REGEX;
228+
}
229+
String valueRegexp = config.getAppSecObfuscationParameterValueRegexp();
230+
if (valueRegexp != null) {
231+
wafConfig.obfuscatorValueRegex = valueRegexp;
232+
} else { // reset
233+
wafConfig.obfuscatorValueRegex = WafConfig.DEFAULT_VALUE_REGEX;
234+
}
235+
return wafConfig;
236+
}
212237
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.datadog.appsec.config;
22

3+
import com.datadog.ddwaf.WafBuilder;
34
import java.io.Closeable;
45

56
public interface AppSecConfigService extends Closeable {
6-
void init();
7-
87
void close();
98

9+
void init(WafBuilder wafBuilder);
10+
1011
TransactionalAppSecModuleConfigurer createAppSecModuleConfigurer();
1112

1213
interface TransactionalAppSecModuleConfigurer extends AppSecModuleConfigurer {

0 commit comments

Comments
 (0)