Skip to content

Commit ec2a6fb

Browse files
committed
Upgrade libddwaf java to 14.0.0
1 parent de593cc commit ec2a6fb

22 files changed

+775
-920
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'
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

+34-6
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);
@@ -82,10 +89,14 @@ private static void doStart(SubscriptionService gw, SharedCommunicationObjects s
8289
}
8390

8491
ConfigurationPoller configurationPoller = sco.configurationPoller(config);
92+
wafBuilder = new WafBuilder(createWafConfig(config));
8593
// may throw and abort startup
8694
APP_SEC_CONFIG_SERVICE =
8795
new AppSecConfigServiceImpl(
88-
config, configurationPoller, () -> reloadSubscriptions(REPLACEABLE_EVENT_PRODUCER));
96+
config,
97+
configurationPoller,
98+
() -> reloadSubscriptions(REPLACEABLE_EVENT_PRODUCER),
99+
wafBuilder);
89100
APP_SEC_CONFIG_SERVICE.init();
90101

91102
sco.createRemaining(config);
@@ -143,8 +154,8 @@ public static void stop() {
143154
RESET_SUBSCRIPTION_SERVICE = null;
144155
}
145156
Blocking.setBlockingService(BlockingService.NOOP);
146-
147157
APP_SEC_CONFIG_SERVICE.close();
158+
wafBuilder.destroy();
148159
}
149160

150161
private static void loadModules(EventDispatcher eventDispatcher, Monitoring monitoring) {
@@ -155,9 +166,9 @@ private static void loadModules(EventDispatcher eventDispatcher, Monitoring moni
155166
for (AppSecModule module : modules) {
156167
log.debug("Starting appsec module {}", module.getName());
157168
try {
158-
AppSecConfigService.TransactionalAppSecModuleConfigurer cfgObject;
159-
cfgObject = APP_SEC_CONFIG_SERVICE.createAppSecModuleConfigurer();
160-
module.config(cfgObject);
169+
AppSecConfigService.TransactionalAppSecModuleConfigurer cfgObject =
170+
APP_SEC_CONFIG_SERVICE.createAppSecModuleConfigurer();
171+
module.config(cfgObject, wafBuilder);
161172
cfgObject.commit();
162173
} catch (RuntimeException | AppSecModule.AppSecModuleActivationException t) {
163174
log.error("Startup of appsec module {} failed", module.getName(), t);
@@ -209,4 +220,21 @@ public static Set<String> getStartedModulesInfo() {
209220
return Collections.emptySet();
210221
}
211222
}
223+
224+
private static WafConfig createWafConfig(Config config) {
225+
WafConfig wafConfig = new WafConfig();
226+
String keyRegexp = config.getAppSecObfuscationParameterKeyRegexp();
227+
if (keyRegexp != null) {
228+
wafConfig.obfuscatorKeyRegex = keyRegexp;
229+
} else { // reset
230+
wafConfig.obfuscatorKeyRegex = WafConfig.DEFAULT_KEY_REGEX;
231+
}
232+
String valueRegexp = config.getAppSecObfuscationParameterValueRegexp();
233+
if (valueRegexp != null) {
234+
wafConfig.obfuscatorValueRegex = valueRegexp;
235+
} else { // reset
236+
wafConfig.obfuscatorValueRegex = WafConfig.DEFAULT_VALUE_REGEX;
237+
}
238+
return wafConfig;
239+
}
212240
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import java.io.Closeable;
44

55
public interface AppSecConfigService extends Closeable {
6-
void init();
7-
86
void close();
97

8+
void init();
9+
1010
TransactionalAppSecModuleConfigurer createAppSecModuleConfigurer();
1111

1212
interface TransactionalAppSecModuleConfigurer extends AppSecModuleConfigurer {

0 commit comments

Comments
 (0)