Skip to content

Commit b63c7e2

Browse files
committed
feat(rasp): instrument FileOutputStream/FileInputStream(File) constructors
Add RASP callsite coverage for File-argument constructors that were previously not instrumented: - FileOutputStream(File) and FileOutputStream(File, boolean): call FileIORaspHelper.INSTANCE.beforeFileWritten(file.getPath()) - FileInputStream(File): call FileIORaspHelper.INSTANCE.beforeFileLoaded(file.getPath()) No IAST changes — the File-based constructors delegate path resolution to the JVM, so IAST taint tracking via the String constructor already covers those code paths at a higher level. Tests added following the existing RASP test pattern.
1 parent cdd79e0 commit b63c7e2

File tree

6 files changed

+71
-0
lines changed

6 files changed

+71
-0
lines changed

dd-java-agent/instrumentation/java/java-io-1.8/src/main/java/datadog/trace/instrumentation/java/lang/FileInputStreamCallSite.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import datadog.trace.api.iast.Sink;
88
import datadog.trace.api.iast.VulnerabilityTypes;
99
import datadog.trace.api.iast.sink.PathTraversalModule;
10+
import java.io.File;
1011
import javax.annotation.Nullable;
1112

1213
@Sink(VulnerabilityTypes.PATH_TRAVERSAL)
@@ -23,6 +24,13 @@ public static void beforeConstructor(@CallSite.Argument @Nullable final String p
2324
}
2425
}
2526

27+
@CallSite.Before("void java.io.FileInputStream.<init>(java.io.File)")
28+
public static void beforeConstructorFile(@CallSite.Argument @Nullable final File file) {
29+
if (file != null) {
30+
raspCallback(file.getPath());
31+
}
32+
}
33+
2634
private static void iastCallback(String path) {
2735
final PathTraversalModule module = InstrumentationBridge.PATH_TRAVERSAL;
2836
if (module != null) {

dd-java-agent/instrumentation/java/java-io-1.8/src/main/java/datadog/trace/instrumentation/java/lang/FileOutputStreamCallSite.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import datadog.trace.api.iast.Sink;
88
import datadog.trace.api.iast.VulnerabilityTypes;
99
import datadog.trace.api.iast.sink.PathTraversalModule;
10+
import java.io.File;
1011
import javax.annotation.Nullable;
1112

1213
@Sink(VulnerabilityTypes.PATH_TRAVERSAL)
@@ -24,6 +25,14 @@ public static void beforeConstructor(@CallSite.Argument(0) @Nullable final Strin
2425
}
2526
}
2627

28+
@CallSite.Before("void java.io.FileOutputStream.<init>(java.io.File)")
29+
@CallSite.Before("void java.io.FileOutputStream.<init>(java.io.File, boolean)")
30+
public static void beforeConstructorFile(@CallSite.Argument(0) @Nullable final File file) {
31+
if (file != null) {
32+
raspCallback(file.getPath());
33+
}
34+
}
35+
2736
private static void iastCallback(String path) {
2837
final PathTraversalModule module = InstrumentationBridge.PATH_TRAVERSAL;
2938
if (module != null) {

dd-java-agent/instrumentation/java/java-io-1.8/src/test/groovy/datadog/trace/instrumentation/java/io/FileInputStreamCallSiteTest.groovy

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,17 @@ class FileInputStreamCallSiteTest extends BaseIoRaspCallSiteTest {
3232
then:
3333
1 * helper.beforeFileLoaded(path)
3434
}
35+
36+
void 'test RASP new file input stream with file'() {
37+
setup:
38+
final helper = Mock(FileIORaspHelper)
39+
FileIORaspHelper.INSTANCE = helper
40+
final file = newFile('test_rasp_file.txt')
41+
42+
when:
43+
TestFileInputStreamSuite.newFileInputStream(file)
44+
45+
then:
46+
1 * helper.beforeFileLoaded(file.path)
47+
}
3548
}

dd-java-agent/instrumentation/java/java-io-1.8/src/test/groovy/datadog/trace/instrumentation/java/io/FileOutputStreamCallSiteTest.groovy

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,30 @@ class FileOutputStreamCallSiteTest extends BaseIoRaspCallSiteTest {
6060
then:
6161
1 * helper.beforeFileWritten(path)
6262
}
63+
64+
void 'test RASP new file output stream with file'() {
65+
setup:
66+
final helper = Mock(FileIORaspHelper)
67+
FileIORaspHelper.INSTANCE = helper
68+
final file = newFile('test_rasp_file_1.txt')
69+
70+
when:
71+
TestFileOutputStreamSuite.newFileOutputStream(file)
72+
73+
then:
74+
1 * helper.beforeFileWritten(file.path)
75+
}
76+
77+
void 'test RASP new file output stream with file and append'() {
78+
setup:
79+
final helper = Mock(FileIORaspHelper)
80+
FileIORaspHelper.INSTANCE = helper
81+
final file = newFile('test_rasp_file_2.txt')
82+
83+
when:
84+
TestFileOutputStreamSuite.newFileOutputStream(file, false)
85+
86+
then:
87+
1 * helper.beforeFileWritten(file.path)
88+
}
6389
}

dd-java-agent/instrumentation/java/java-io-1.8/src/test/java/foo/bar/TestFileInputStreamSuite.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package foo.bar;
22

3+
import java.io.File;
34
import java.io.FileInputStream;
45
import java.io.FileNotFoundException;
56

@@ -8,4 +9,8 @@ public class TestFileInputStreamSuite {
89
public static FileInputStream newFileInputStream(final String path) throws FileNotFoundException {
910
return new FileInputStream(path);
1011
}
12+
13+
public static FileInputStream newFileInputStream(final File file) throws FileNotFoundException {
14+
return new FileInputStream(file);
15+
}
1116
}

dd-java-agent/instrumentation/java/java-io-1.8/src/test/java/foo/bar/TestFileOutputStreamSuite.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package foo.bar;
22

3+
import java.io.File;
34
import java.io.FileNotFoundException;
45
import java.io.FileOutputStream;
56

@@ -14,4 +15,13 @@ public static FileOutputStream newFileOutputStream(final String path, final bool
1415
throws FileNotFoundException {
1516
return new FileOutputStream(path, append);
1617
}
18+
19+
public static FileOutputStream newFileOutputStream(final File file) throws FileNotFoundException {
20+
return new FileOutputStream(file);
21+
}
22+
23+
public static FileOutputStream newFileOutputStream(final File file, final boolean append)
24+
throws FileNotFoundException {
25+
return new FileOutputStream(file, append);
26+
}
1727
}

0 commit comments

Comments
 (0)