Skip to content

Commit a56894b

Browse files
Libddwaf upgrade to 17.1.0 (#9486)
1 parent 113e707 commit a56894b

File tree

8 files changed

+238
-186
lines changed

8 files changed

+238
-186
lines changed

dd-java-agent/appsec/build.gradle

Lines changed: 1 addition & 1 deletion
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: '16.0.0'
18+
implementation group: 'io.sqreen', name: 'libsqreen', version: '17.1.0'
1919
implementation libs.moshi
2020

2121
testImplementation libs.bytebuddy

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

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@
4040
import com.datadog.ddwaf.exception.InvalidRuleSetException;
4141
import com.datadog.ddwaf.exception.UnclassifiedWafException;
4242
import com.squareup.moshi.JsonAdapter;
43-
import com.squareup.moshi.JsonReader;
44-
import com.squareup.moshi.JsonWriter;
4543
import com.squareup.moshi.Moshi;
44+
import com.squareup.moshi.Types;
4645
import datadog.remoteconfig.ConfigurationEndListener;
4746
import datadog.remoteconfig.ConfigurationPoller;
4847
import datadog.remoteconfig.PollingRateHinter;
@@ -53,7 +52,6 @@
5352
import datadog.trace.api.ConfigCollector;
5453
import datadog.trace.api.ProductActivation;
5554
import datadog.trace.api.UserIdCollectionMode;
56-
import datadog.trace.api.telemetry.LogCollector;
5755
import datadog.trace.api.telemetry.WafMetricCollector;
5856
import java.io.ByteArrayInputStream;
5957
import java.io.FileInputStream;
@@ -68,7 +66,6 @@
6866
import java.util.Set;
6967
import java.util.concurrent.ConcurrentHashMap;
7068
import java.util.concurrent.atomic.AtomicBoolean;
71-
import javax.annotation.Nullable;
7269
import okio.Okio;
7370
import org.slf4j.Logger;
7471
import org.slf4j.LoggerFactory;
@@ -96,25 +93,10 @@ public class AppSecConfigServiceImpl implements AppSecConfigService {
9693
new WAFInitializationResultReporter();
9794
private final WAFStatsReporter statsReporter = new WAFStatsReporter();
9895

99-
private static final JsonAdapter<Object> ADAPTER =
96+
private static final JsonAdapter<Map<String, Object>> ADAPTER =
10097
new Moshi.Builder()
101-
.add(
102-
Double.class,
103-
new JsonAdapter<Number>() {
104-
@Override
105-
public Number fromJson(JsonReader reader) throws IOException {
106-
double value = reader.nextDouble();
107-
long longValue = (long) value;
108-
return value % 1 == 0 ? longValue : value;
109-
}
110-
111-
@Override
112-
public void toJson(JsonWriter writer, @Nullable Number value) throws IOException {
113-
throw new UnsupportedOperationException();
114-
}
115-
})
11698
.build()
117-
.adapter(Object.class);
99+
.adapter(Types.newParameterizedType(Map.class, String.class, Object.class));
118100

119101
private boolean hasUserWafConfig;
120102
private boolean defaultConfigActivated;
@@ -310,7 +292,6 @@ private void handleWafUpdateResultReport(String configKey, Map<String, Object> r
310292
}
311293

312294
// TODO: Send diagnostics via telemetry
313-
final LogCollector telemetryLogger = LogCollector.get();
314295

315296
initReporter.setReportForPublication(wafDiagnostics);
316297
if (wafDiagnostics.rulesetVersion != null
@@ -489,8 +470,7 @@ private static Map<String, Object> loadDefaultWafConfig() throws IOException {
489470
throw new IOException("Resource " + DEFAULT_CONFIG_LOCATION + " not found");
490471
}
491472

492-
Map<String, Object> ret =
493-
(Map<String, Object>) ADAPTER.fromJson(Okio.buffer(Okio.source(is)));
473+
Map<String, Object> ret = ADAPTER.fromJson(Okio.buffer(Okio.source(is)));
494474

495475
StandardizedLogging._initialConfigSourceAndLibddwafVersion(log, "<bundled config>");
496476
if (log.isInfoEnabled()) {
@@ -507,8 +487,7 @@ private static Map<String, Object> loadUserWafConfig(Config tracerConfig) throws
507487
return null;
508488
}
509489
try (InputStream is = new FileInputStream(filename)) {
510-
Map<String, Object> ret =
511-
(Map<String, Object>) ADAPTER.fromJson(Okio.buffer(Okio.source(is)));
490+
Map<String, Object> ret = ADAPTER.fromJson(Okio.buffer(Okio.source(is)));
512491

513492
StandardizedLogging._initialConfigSourceAndLibddwafVersion(log, filename);
514493
if (log.isInfoEnabled()) {

dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import datadog.trace.api.ProductActivation;
3535
import datadog.trace.api.ProductTraceSource;
3636
import datadog.trace.api.gateway.Flow;
37-
import datadog.trace.api.sampling.PrioritySampling;
3837
import datadog.trace.api.telemetry.LogCollector;
3938
import datadog.trace.api.telemetry.WafMetricCollector;
4039
import datadog.trace.api.time.SystemTimeSource;
@@ -53,7 +52,6 @@
5352
import java.lang.reflect.UndeclaredThrowableException;
5453
import java.util.Collection;
5554
import java.util.Collections;
56-
import java.util.HashMap;
5755
import java.util.HashSet;
5856
import java.util.Iterator;
5957
import java.util.List;
@@ -81,8 +79,6 @@ public class WAFModule implements AppSecModule {
8179

8280
private static final JsonAdapter<List<WAFResultData>> RES_JSON_ADAPTER;
8381

84-
private static final Map<String, ActionInfo> DEFAULT_ACTIONS;
85-
8682
private static final String EXPLOIT_DETECTED_MSG = "Exploit detected";
8783
private boolean init = true;
8884
private String rulesetVersion;
@@ -118,12 +114,6 @@ private CtxAndAddresses(Collection<Address<?>> addressesOfInterest, WafHandle ct
118114
Moshi moshi = new Moshi.Builder().build();
119115
RES_JSON_ADAPTER = moshi.adapter(Types.newParameterizedType(List.class, WAFResultData.class));
120116

121-
Map<String, Object> actionParams = new HashMap<>();
122-
actionParams.put("status_code", 403);
123-
actionParams.put("type", "auto");
124-
actionParams.put("grpc_status_code", 10);
125-
DEFAULT_ACTIONS =
126-
Collections.singletonMap("block", new ActionInfo("block_request", actionParams));
127117
createLimitsObject();
128118
}
129119

@@ -425,8 +415,9 @@ public void onDataAvailable(
425415
Collection<AppSecEvent> events = buildEvents(resultWithData);
426416
boolean isThrottled = reqCtx.isThrottled(rateLimiter);
427417

428-
if (resultWithData.keep) {
429-
if (!isThrottled) {
418+
if (!isThrottled) {
419+
if (resultWithData.keep) {
420+
reqCtx.setManuallyKept(true);
430421
AgentSpan activeSpan = AgentTracer.get().activeSpan();
431422
if (activeSpan != null) {
432423
log.debug("Setting force-keep tag and manual keep tag on the current span");
@@ -439,31 +430,29 @@ public void onDataAvailable(
439430
activeSpan
440431
.getLocalRootSpan()
441432
.setTag(Tags.PROPAGATED_TRACE_SOURCE, ProductTraceSource.ASM);
442-
} else {
443-
// If active span is not available then we need to set manual keep in GatewayBridge
444-
log.debug("There is no active span available");
445433
}
446434
} else {
447-
log.debug("Rate limited WAF events");
448-
if (!gwCtx.isRasp) {
449-
reqCtx.setWafRateLimited();
450-
}
435+
// If active span is not available then we need to set manual keep in GatewayBridge
436+
log.debug("There is no active span available");
437+
}
438+
} else {
439+
log.debug("Rate limited WAF events");
440+
if (!gwCtx.isRasp) {
441+
reqCtx.setWafRateLimited();
451442
}
452-
}
453-
if (resultWithData.events && !events.isEmpty() && !isThrottled) {
454-
reqCtx.reportEvents(events);
455443
}
456444

457445
if (flow.isBlocking()) {
458446
if (!gwCtx.isRasp) {
459447
reqCtx.setWafBlocked();
460448
}
461449
}
450+
// report is still done even without keep, in case sampler_keep is desired
451+
if (resultWithData.events) {
452+
reqCtx.reportEvents(events);
453+
}
462454
}
463455

464-
reqCtx.setKeepType(
465-
resultWithData.keep ? PrioritySampling.USER_KEEP : PrioritySampling.USER_DROP);
466-
467456
if (resultWithData.attributes != null && !resultWithData.attributes.isEmpty()) {
468457
reqCtx.reportDerivatives(resultWithData.attributes);
469458
}

dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import datadog.trace.api.Config;
1414
import datadog.trace.api.http.StoredBodySupplier;
1515
import datadog.trace.api.internal.TraceSegment;
16-
import datadog.trace.api.sampling.PrioritySampling;
1716
import datadog.trace.util.stacktrace.StackTraceEvent;
1817
import java.io.Closeable;
1918
import java.util.*;
@@ -166,7 +165,6 @@ public class AppSecRequestContext implements DataBundle, Closeable {
166165

167166
private volatile boolean keepOpenForApiSecurityPostProcessing;
168167
private volatile Long apiSecurityEndpointHash;
169-
private volatile byte keepType = PrioritySampling.SAMPLER_KEEP;
170168

171169
private final AtomicInteger httpClientRequestCount = new AtomicInteger(0);
172170
private final Set<Long> sampledHttpClientRequests = new HashSet<>();
@@ -175,6 +173,7 @@ public class AppSecRequestContext implements DataBundle, Closeable {
175173
AtomicIntegerFieldUpdater.newUpdater(AppSecRequestContext.class, "wafTimeouts");
176174
private static final AtomicIntegerFieldUpdater<AppSecRequestContext> RASP_TIMEOUTS_UPDATER =
177175
AtomicIntegerFieldUpdater.newUpdater(AppSecRequestContext.class, "raspTimeouts");
176+
private boolean manuallyKept = false;
178177

179178
// to be called by the Event Dispatcher
180179
public void addAll(DataBundle newData) {
@@ -421,14 +420,6 @@ public Long getApiSecurityEndpointHash() {
421420
return this.apiSecurityEndpointHash;
422421
}
423422

424-
public void setKeepType(byte keepType) {
425-
this.keepType = keepType;
426-
}
427-
428-
public byte getKeepType() {
429-
return this.keepType;
430-
}
431-
432423
void addRequestHeader(String name, String value) {
433424
if (finishedRequestHeaders) {
434425
throw new IllegalStateException("Request headers were said to be finished before");
@@ -1014,4 +1005,12 @@ public boolean isRaspMatched() {
10141005
public void setRaspMatched(boolean raspMatched) {
10151006
this.raspMatched = raspMatched;
10161007
}
1008+
1009+
public boolean isManuallyKept() {
1010+
return manuallyKept;
1011+
}
1012+
1013+
public void setManuallyKept(boolean manuallyKept) {
1014+
this.manuallyKept = manuallyKept;
1015+
}
10171016
}

dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import static com.datadog.appsec.gateway.AppSecRequestContext.REQUEST_HEADERS_ALLOW_LIST;
99
import static com.datadog.appsec.gateway.AppSecRequestContext.RESPONSE_HEADERS_ALLOW_LIST;
1010
import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY;
11-
import static datadog.trace.bootstrap.instrumentation.api.Tags.SAMPLING_PRIORITY;
1211

1312
import com.datadog.appsec.AppSecSystem;
1413
import com.datadog.appsec.api.security.ApiSecurityDownstreamSampler;
@@ -863,10 +862,11 @@ private NoopFlow onRequestEnded(RequestContext ctx_, IGSpanInfo spanInfo) {
863862

864863
// If detected any events - mark span at appsec.event
865864
if (!collectedEvents.isEmpty()) {
866-
// Set asm keep in case that root span was not available when events are detected
867-
traceSeg.setTagTop(Tags.ASM_KEEP, true);
868-
traceSeg.setTagTop(SAMPLING_PRIORITY, ctx.getKeepType());
869-
traceSeg.setTagTop(Tags.PROPAGATED_TRACE_SOURCE, ProductTraceSource.ASM);
865+
if (ctx.isManuallyKept()) {
866+
// Set asm keep in case that root span was not available when events are detected
867+
traceSeg.setTagTop(Tags.ASM_KEEP, true);
868+
traceSeg.setTagTop(Tags.PROPAGATED_TRACE_SOURCE, ProductTraceSource.ASM);
869+
}
870870
traceSeg.setTagTop("appsec.event", true);
871871
traceSeg.setTagTop("network.client.ip", ctx.getPeerAddress());
872872

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/config/AppSecConfigServiceImplJsonAdapterTest.groovy

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

0 commit comments

Comments
 (0)