Skip to content

Commit 22458b3

Browse files
authored
Increase IAST propagation to StringBuffer setLength (#8128)
1 parent f4139b0 commit 22458b3

File tree

4 files changed

+41
-7
lines changed

4 files changed

+41
-7
lines changed

dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java

+2
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,8 @@ public void onStringBuilderSetLength(@Nonnull CharSequence self, int length) {
852852
Range[] newRanges = Ranges.forSubstring(0, length, rangesSelf);
853853
if (newRanges != null && newRanges.length > 0) {
854854
selfTainted.setRanges(newRanges);
855+
} else {
856+
selfTainted.clear();
855857
}
856858
}
857859

dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/propagation/StringModuleTest.groovy

+37-7
Original file line numberDiff line numberDiff line change
@@ -1448,9 +1448,11 @@ class StringModuleTest extends IastModuleImplTestBase {
14481448
0 * _
14491449
14501450
where:
1451-
self | length | mockCalls
1452-
sb("123") | 2 | 0
1453-
sb() | 0 | 1
1451+
self | length | mockCalls
1452+
sb("123") | 2 | 0
1453+
sb() | 0 | 1
1454+
sbf("123") | 2 | 0
1455+
sbf() | 0 | 1
14541456
}
14551457
14561458
void 'onStringBuilderSetLength (#input, #length)'() {
@@ -1472,10 +1474,38 @@ class StringModuleTest extends IastModuleImplTestBase {
14721474
taintFormat(result, taintedObject.getRanges()) == expected
14731475
14741476
where:
1475-
input | length | expected
1476-
sb("==>0123<==") | 3 | "==>012<=="
1477-
sb("0123==>456<==78") | 5 | "0123==>4<=="
1478-
sb("01==>234<==5==>678<==90") | 8 | "01==>234<==5==>67<=="
1477+
input | length | expected
1478+
sb("==>0123<==") | 3 | "==>012<=="
1479+
sb("0123==>456<==78") | 5 | "0123==>4<=="
1480+
sb("01==>234<==5==>678<==90") | 8 | "01==>234<==5==>67<=="
1481+
sbf("==>0123<==") | 3 | "==>012<=="
1482+
sbf("0123==>456<==78") | 5 | "0123==>4<=="
1483+
sbf("01==>234<==5==>678<==90") | 8 | "01==>234<==5==>67<=="
1484+
}
1485+
1486+
void 'onStringBuilderSetLength untainting after setLength (#input, #length)'() {
1487+
final taintedObjects = ctx.getTaintedObjects()
1488+
def self = addFromTaintFormat(taintedObjects, input)
1489+
if (self instanceof StringBuilder) {
1490+
((StringBuilder) self).setLength(length)
1491+
} else if (self instanceof StringBuffer) {
1492+
((StringBuffer) self).setLength(length)
1493+
}
1494+
1495+
when:
1496+
module.onStringBuilderSetLength(self, length)
1497+
def taintedObject = taintedObjects.get(self)
1498+
1499+
then:
1500+
1 * tracer.activeSpan() >> span
1501+
taintedObject == null
1502+
1503+
where:
1504+
input | length
1505+
sb("==>0123<==") | 0
1506+
sb("0123==>456<==78") | 3
1507+
sbf("==>0123<==") | 0
1508+
sbf("0123==>456<==78") | 3
14791509
}
14801510
14811511
private static Date date(final String pattern, final String value) {

dd-java-agent/instrumentation/java-lang/src/main/java/datadog/trace/instrumentation/java/lang/StringBuilderCallSite.java

+1
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ public static CharSequence afterSubSequence(
183183
}
184184

185185
@CallSite.After("void java.lang.StringBuilder.setLength(int)")
186+
@CallSite.After("void java.lang.StringBuffer.setLength(int)")
186187
public static void afterSetLength(
187188
@CallSite.This final CharSequence self, @CallSite.Argument final int length) {
188189
final StringModule module = InstrumentationBridge.STRING;

dd-java-agent/instrumentation/java-lang/src/test/groovy/datadog/trace/instrumentation/java/lang/StringBuilderCallSiteTest.groovy

+1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ class StringBuilderCallSiteTest extends AgentTestRunner {
266266
where:
267267
type | suite | param | length | expected
268268
"builder" | new TestStringBuilderSuite() | sb('012345') | 5 | '01234'
269+
"buffer" | new TestStringBufferSuite() | sbf('012345') | 5 | '01234'
269270
}
270271
271272
private static class BrokenToString {

0 commit comments

Comments
 (0)