Skip to content

Commit 71ab4bb

Browse files
authored
Add marks to exclude ranges from vulnerability reporting (#5538)
##What Does This Do Add mark attribute to Range Provide a mark for each vulnerabilityType Provide a new method get all ranges that are not marked for a vulnerability type Overload taintString and taintObject methods with a mark parameter to allow tainting with marks Improve highestPriorityRange algorithm using marks ##Motivation Add an exclusion mark system to avoid reporting vulnerabilities if all its ranges are marked as excluded for that type of vulnerability. ##Additional Notes Use an int bit field for flagging system to improve performance Remove previous Range constructor to maintain ranges inmutables highestPriorityRange algorithm can be more accurate but we decided to keep it simple for performance
1 parent 9c449d8 commit 71ab4bb

35 files changed

+635
-268
lines changed

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringBuilderAppendBenchmark.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.datadog.iast.propagation;
22

3+
import static com.datadog.iast.model.Range.NOT_MARKED;
4+
35
import com.datadog.iast.IastRequestContext;
46
import com.datadog.iast.model.Range;
57
import datadog.trace.instrumentation.java.lang.StringBuilderCallSite;
@@ -13,12 +15,15 @@ public class StringBuilderAppendBenchmark
1315
protected Context initializeContext() {
1416
final IastRequestContext context = new IastRequestContext();
1517
final String notTainted = notTainted("I am not a tainted string");
16-
final String tainted = tainted(context, "I am a tainted string", new Range(5, 6, source()));
18+
final String tainted =
19+
tainted(context, "I am a tainted string", new Range(5, 6, source(), NOT_MARKED));
1720
final StringBuilder notTaintedBuilder =
1821
notTainted(new StringBuilder("I am not a tainted string builder"));
1922
final StringBuilder taintedBuilder =
2023
tainted(
21-
context, new StringBuilder("I am a tainted string builder"), new Range(5, 6, source()));
24+
context,
25+
new StringBuilder("I am a tainted string builder"),
26+
new Range(5, 6, source(), NOT_MARKED));
2227
return new Context(context, notTainted, tainted, notTaintedBuilder, taintedBuilder);
2328
}
2429

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringBuilderBatchBenchmark.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ protected StringBuilderBatchBenchmark.Context initializeContext() {
3333
double current = i / (double) stringCount;
3434
final String value;
3535
if (current < limit) {
36-
value = tainted(context, UUID.randomUUID().toString(), new Range(3, 6, source()));
36+
value =
37+
tainted(
38+
context, UUID.randomUUID().toString(), new Range(3, 6, source(), Range.NOT_MARKED));
3739
} else {
3840
value = notTainted(UUID.randomUUID().toString());
3941
}

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringBuilderInitBenchmark.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public class StringBuilderInitBenchmark
1313
protected Context initializeContext() {
1414
final IastRequestContext context = new IastRequestContext();
1515
final String notTainted = notTainted("I am not a tainted string");
16-
final String tainted = tainted(context, "I am a tainted string", new Range(3, 6, source()));
16+
final String tainted =
17+
tainted(context, "I am a tainted string", new Range(3, 6, source(), Range.NOT_MARKED));
1718
return new Context(context, notTainted, tainted);
1819
}
1920

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringBuilderToStringBenchmark.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ protected Context initializeContext() {
1616
notTainted(new StringBuilder("I am not a tainted string builder"));
1717
final StringBuilder taintedBuilder =
1818
tainted(
19-
context, new StringBuilder("I am a tainted string builder"), new Range(5, 7, source()));
19+
context,
20+
new StringBuilder("I am a tainted string builder"),
21+
new Range(5, 7, source(), Range.NOT_MARKED));
2022
return new Context(context, notTaintedBuilder, taintedBuilder);
2123
}
2224

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringConcatBenchmark.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public class StringConcatBenchmark extends AbstractBenchmark<StringConcatBenchma
1212
protected StringConcatBenchmark.Context initializeContext() {
1313
final IastRequestContext context = new IastRequestContext();
1414
final String notTainted = notTainted("I am not a tainted string");
15-
final String tainted = tainted(context, "I am a tainted string", new Range(3, 5, source()));
15+
final String tainted =
16+
tainted(context, "I am a tainted string", new Range(3, 5, source(), Range.NOT_MARKED));
1617
return new StringConcatBenchmark.Context(context, notTainted, tainted);
1718
}
1819

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringConcatFactoryBatchBenchmark.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ protected StringConcatFactoryBatchBenchmark.Context initializeContext() {
5454
double current = i / (double) stringCount;
5555
final String value;
5656
if (current < limit) {
57-
value = tainted(context, "Yep, tainted", new Range(3, 5, source()));
57+
value = tainted(context, "Yep, tainted", new Range(3, 5, source(), Range.NOT_MARKED));
5858
} else {
5959
value = notTainted("Nop, tainted");
6060
}

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringConcatFactoryBenchmark.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public class StringConcatFactoryBenchmark
1313
protected StringConcatFactoryBenchmark.Context initializeContext() {
1414
final IastRequestContext context = new IastRequestContext();
1515
final String notTainted = notTainted("Nop, tainted");
16-
final String tainted = tainted(context, "Yep, tainted", new Range(3, 5, source()));
16+
final String tainted =
17+
tainted(context, "Yep, tainted", new Range(3, 5, source(), Range.NOT_MARKED));
1718
return new StringConcatFactoryBenchmark.Context(context, notTainted, tainted);
1819
}
1920

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringJoinBenchmark.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.datadog.iast.propagation;
22

3+
import static com.datadog.iast.model.Range.NOT_MARKED;
4+
35
import com.datadog.iast.IastRequestContext;
46
import com.datadog.iast.model.Range;
57
import com.datadog.iast.model.Source;
@@ -19,15 +21,18 @@ protected StringJoinBenchmark.Context initializeContext() {
1921
.getTaintedObjects()
2022
.taint(
2123
tainted,
22-
new Range[] {new Range(0, tainted.length(), new Source((byte) 0, "key", "value"))});
24+
new Range[] {
25+
new Range(0, tainted.length(), new Source((byte) 0, "key", "value"), NOT_MARKED)
26+
});
2327

2428
final String taintedDelimiter = new String("-");
2529
iastRequestContext
2630
.getTaintedObjects()
2731
.taint(
2832
taintedDelimiter,
2933
new Range[] {
30-
new Range(0, taintedDelimiter.length(), new Source((byte) 1, "key", "value"))
34+
new Range(
35+
0, taintedDelimiter.length(), new Source((byte) 1, "key", "value"), NOT_MARKED)
3136
});
3237

3338
return new StringJoinBenchmark.Context(

dd-java-agent/agent-iast/src/jmh/java/com/datadog/iast/propagation/StringSubsequenceBenchmark.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.datadog.iast.propagation;
22

3+
import static com.datadog.iast.model.Range.NOT_MARKED;
4+
35
import com.datadog.iast.IastRequestContext;
46
import com.datadog.iast.model.Range;
57
import com.datadog.iast.model.Source;
@@ -25,14 +27,18 @@ protected StringSubsequenceBenchmark.Context initializeContext() {
2527
.getTaintedObjects()
2628
.taint(
2729
taintedLoseRange,
28-
new Range[] {new Range(0, RANGE_SIZE, new Source((byte) 0, "key", "value"))});
30+
new Range[] {
31+
new Range(0, RANGE_SIZE, new Source((byte) 0, "key", "value"), NOT_MARKED)
32+
});
2933

3034
final String taintedModifyRange = new String(DEFAULT_STRING);
3135
iastRequestContext
3236
.getTaintedObjects()
3337
.taint(
3438
taintedModifyRange,
35-
new Range[] {new Range(1, RANGE_SIZE, new Source((byte) 1, "key", "value"))});
39+
new Range[] {
40+
new Range(1, RANGE_SIZE, new Source((byte) 1, "key", "value"), NOT_MARKED)
41+
});
3642

3743
return new StringSubsequenceBenchmark.Context(
3844
iastRequestContext, notTainted, taintedLoseRange, taintedModifyRange);

dd-java-agent/agent-iast/src/main/java/com/datadog/iast/model/Range.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@
88
import javax.annotation.Nonnull;
99

1010
public final class Range implements Ranged {
11+
12+
public static final int NOT_MARKED = 0;
13+
1114
private final @Nonnegative int start;
1215
private final @Nonnegative int length;
1316
private final @Nonnull @SourceIndex Source source;
17+
private final int marks;
1418

15-
public Range(final int start, final int length, final Source source) {
19+
public Range(final int start, final int length, final Source source, final int marks) {
1620
this.start = start;
1721
this.length = length;
1822
this.source = source;
23+
this.marks = marks;
1924
}
2025

2126
@Override
@@ -32,10 +37,18 @@ public Source getSource() {
3237
return source;
3338
}
3439

40+
public int getMarks() {
41+
return marks;
42+
}
43+
3544
@Override
3645
public boolean equals(Object o) {
37-
if (this == o) return true;
38-
if (o == null || getClass() != o.getClass()) return false;
46+
if (this == o) {
47+
return true;
48+
}
49+
if (o == null || getClass() != o.getClass()) {
50+
return false;
51+
}
3952
Range range = (Range) o;
4053
return start == range.start && length == range.length && Objects.equals(source, range.source);
4154
}
@@ -62,6 +75,10 @@ public Range shift(final int offset) {
6275
if (offset == 0) {
6376
return this;
6477
}
65-
return new Range(start + offset, length, source);
78+
return new Range(start + offset, length, source, marks);
79+
}
80+
81+
public boolean isMarked(final int mark) {
82+
return (marks & mark) != NOT_MARKED;
6683
}
6784
}

0 commit comments

Comments
 (0)