Skip to content

Commit 8eb89cf

Browse files
authored
Add entitlement checks for java.io stream classes (#122406)
1 parent d78bfe8 commit 8eb89cf

File tree

8 files changed

+291
-0
lines changed

8 files changed

+291
-0
lines changed

libs/entitlement/bridge/src/main/java/org/elasticsearch/entitlement/bridge/EntitlementChecker.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.elasticsearch.entitlement.bridge;
1111

1212
import java.io.File;
13+
import java.io.FileDescriptor;
1314
import java.io.FileFilter;
1415
import java.io.FilenameFilter;
1516
import java.io.InputStream;
@@ -572,14 +573,54 @@ public interface EntitlementChecker {
572573

573574
void check$java_io_File$setWritable(Class<?> callerClass, File file, boolean writable, boolean ownerOnly);
574575

576+
void check$java_io_FileInputStream$(Class<?> callerClass, File file);
577+
578+
void check$java_io_FileInputStream$(Class<?> callerClass, FileDescriptor fd);
579+
580+
void check$java_io_FileInputStream$(Class<?> callerClass, String name);
581+
575582
void check$java_io_FileOutputStream$(Class<?> callerClass, File file);
576583

577584
void check$java_io_FileOutputStream$(Class<?> callerClass, File file, boolean append);
578585

586+
void check$java_io_FileOutputStream$(Class<?> callerClass, FileDescriptor fd);
587+
579588
void check$java_io_FileOutputStream$(Class<?> callerClass, String name);
580589

581590
void check$java_io_FileOutputStream$(Class<?> callerClass, String name, boolean append);
582591

592+
void check$java_io_FileReader$(Class<?> callerClass, File file);
593+
594+
void check$java_io_FileReader$(Class<?> callerClass, File file, Charset charset);
595+
596+
void check$java_io_FileReader$(Class<?> callerClass, FileDescriptor fd);
597+
598+
void check$java_io_FileReader$(Class<?> callerClass, String name);
599+
600+
void check$java_io_FileReader$(Class<?> callerClass, String name, Charset charset);
601+
602+
void check$java_io_FileWriter$(Class<?> callerClass, File file);
603+
604+
void check$java_io_FileWriter$(Class<?> callerClass, File file, boolean append);
605+
606+
void check$java_io_FileWriter$(Class<?> callerClass, File file, Charset charset);
607+
608+
void check$java_io_FileWriter$(Class<?> callerClass, File file, Charset charset, boolean append);
609+
610+
void check$java_io_FileWriter$(Class<?> callerClass, FileDescriptor fd);
611+
612+
void check$java_io_FileWriter$(Class<?> callerClass, String name);
613+
614+
void check$java_io_FileWriter$(Class<?> callerClass, String name, boolean append);
615+
616+
void check$java_io_FileWriter$(Class<?> callerClass, String name, Charset charset);
617+
618+
void check$java_io_FileWriter$(Class<?> callerClass, String name, Charset charset, boolean append);
619+
620+
void check$java_io_RandomAccessFile$(Class<?> callerClass, String name, String mode);
621+
622+
void check$java_io_RandomAccessFile$(Class<?> callerClass, File file, String mode);
623+
583624
void check$java_util_Scanner$(Class<?> callerClass, File source);
584625

585626
void check$java_util_Scanner$(Class<?> callerClass, File source, String charsetName);

libs/entitlement/qa/entitlement-test-plugin/src/main/java/org/elasticsearch/entitlement/qa/test/FileCheckActions.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,22 @@
1313
import org.elasticsearch.entitlement.qa.entitled.EntitledActions;
1414

1515
import java.io.File;
16+
import java.io.FileDescriptor;
17+
import java.io.FileInputStream;
1618
import java.io.FileNotFoundException;
1719
import java.io.FileOutputStream;
20+
import java.io.FileReader;
21+
import java.io.FileWriter;
1822
import java.io.IOException;
23+
import java.io.RandomAccessFile;
1924
import java.nio.charset.StandardCharsets;
2025
import java.nio.file.Files;
2126
import java.nio.file.Path;
2227
import java.nio.file.Paths;
2328
import java.nio.file.attribute.UserPrincipal;
2429
import java.util.Scanner;
2530

31+
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.ALWAYS_DENIED;
2632
import static org.elasticsearch.entitlement.qa.test.EntitlementTest.ExpectedAccess.PLUGINS;
2733

2834
@SuppressForbidden(reason = "Explicitly checking APIs that are forbidden")
@@ -216,6 +222,21 @@ static void createScannerFileWithCharsetName() throws FileNotFoundException {
216222
new Scanner(readFile().toFile(), "UTF-8");
217223
}
218224

225+
@EntitlementTest(expectedAccess = PLUGINS)
226+
static void createFileInputStreamFile() throws IOException {
227+
new FileInputStream(readFile().toFile()).close();
228+
}
229+
230+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
231+
static void createFileInputStreamFileDescriptor() throws IOException {
232+
new FileInputStream(FileDescriptor.in).close();
233+
}
234+
235+
@EntitlementTest(expectedAccess = PLUGINS)
236+
static void createFileInputStreamString() throws IOException {
237+
new FileInputStream(readFile().toString()).close();
238+
}
239+
219240
@EntitlementTest(expectedAccess = PLUGINS)
220241
static void createFileOutputStreamString() throws IOException {
221242
new FileOutputStream(readWriteFile().toString()).close();
@@ -236,6 +257,96 @@ static void createFileOutputStreamFileWithAppend() throws IOException {
236257
new FileOutputStream(readWriteFile().toFile(), false).close();
237258
}
238259

260+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
261+
static void createFileOutputStreamFileDescriptor() throws IOException {
262+
new FileOutputStream(FileDescriptor.out).close();
263+
}
264+
265+
@EntitlementTest(expectedAccess = PLUGINS)
266+
static void createFileReaderFile() throws IOException {
267+
new FileReader(readFile().toFile()).close();
268+
}
269+
270+
@EntitlementTest(expectedAccess = PLUGINS)
271+
static void createFileReaderFileCharset() throws IOException {
272+
new FileReader(readFile().toFile(), StandardCharsets.UTF_8).close();
273+
}
274+
275+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
276+
static void createFileReaderFileDescriptor() throws IOException {
277+
new FileReader(FileDescriptor.in).close();
278+
}
279+
280+
@EntitlementTest(expectedAccess = PLUGINS)
281+
static void createFileReaderString() throws IOException {
282+
new FileReader(readFile().toString()).close();
283+
}
284+
285+
@EntitlementTest(expectedAccess = PLUGINS)
286+
static void createFileReaderStringCharset() throws IOException {
287+
new FileReader(readFile().toString(), StandardCharsets.UTF_8).close();
288+
}
289+
290+
@EntitlementTest(expectedAccess = PLUGINS)
291+
static void createFileWriterFile() throws IOException {
292+
new FileWriter(readWriteFile().toFile()).close();
293+
}
294+
295+
@EntitlementTest(expectedAccess = PLUGINS)
296+
static void createFileWriterFileWithAppend() throws IOException {
297+
new FileWriter(readWriteFile().toFile(), false).close();
298+
}
299+
300+
@EntitlementTest(expectedAccess = PLUGINS)
301+
static void createFileWriterFileCharsetWithAppend() throws IOException {
302+
new FileWriter(readWriteFile().toFile(), StandardCharsets.UTF_8, false).close();
303+
}
304+
305+
@EntitlementTest(expectedAccess = ALWAYS_DENIED)
306+
static void createFileWriterFileDescriptor() throws IOException {
307+
new FileWriter(FileDescriptor.out).close();
308+
}
309+
310+
@EntitlementTest(expectedAccess = PLUGINS)
311+
static void createFileWriterString() throws IOException {
312+
new FileWriter(readWriteFile().toString()).close();
313+
}
314+
315+
@EntitlementTest(expectedAccess = PLUGINS)
316+
static void createFileWriterStringWithAppend() throws IOException {
317+
new FileWriter(readWriteFile().toString(), false).close();
318+
}
319+
320+
@EntitlementTest(expectedAccess = PLUGINS)
321+
static void createFileWriterStringCharset() throws IOException {
322+
new FileWriter(readWriteFile().toString(), StandardCharsets.UTF_8).close();
323+
}
324+
325+
@EntitlementTest(expectedAccess = PLUGINS)
326+
static void createFileWriterStringCharsetWithAppend() throws IOException {
327+
new FileWriter(readWriteFile().toString(), StandardCharsets.UTF_8, false).close();
328+
}
329+
330+
@EntitlementTest(expectedAccess = PLUGINS)
331+
static void createRandomAccessFileStringRead() throws IOException {
332+
new RandomAccessFile(readFile().toString(), "r").close();
333+
}
334+
335+
@EntitlementTest(expectedAccess = PLUGINS)
336+
static void createRandomAccessFileStringReadWrite() throws IOException {
337+
new RandomAccessFile(readWriteFile().toString(), "rw").close();
338+
}
339+
340+
@EntitlementTest(expectedAccess = PLUGINS)
341+
static void createRandomAccessFileRead() throws IOException {
342+
new RandomAccessFile(readFile().toFile(), "r").close();
343+
}
344+
345+
@EntitlementTest(expectedAccess = PLUGINS)
346+
static void createRandomAccessFileReadWrite() throws IOException {
347+
new RandomAccessFile(readWriteFile().toFile(), "rw").close();
348+
}
349+
239350
@EntitlementTest(expectedAccess = PLUGINS)
240351
static void filesGetOwner() throws IOException {
241352
Files.getOwner(readFile());

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/api/ElasticsearchEntitlementChecker.java

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.entitlement.runtime.policy.PolicyManager;
1515

1616
import java.io.File;
17+
import java.io.FileDescriptor;
1718
import java.io.FileFilter;
1819
import java.io.FilenameFilter;
1920
import java.io.IOException;
@@ -1103,6 +1104,21 @@ public void checkSelectorProviderInheritedChannel(Class<?> callerClass, Selector
11031104
policyManager.checkFileWrite(callerClass, file);
11041105
}
11051106

1107+
@Override
1108+
public void check$java_io_FileInputStream$(Class<?> callerClass, File file) {
1109+
policyManager.checkFileRead(callerClass, file);
1110+
}
1111+
1112+
@Override
1113+
public void check$java_io_FileInputStream$(Class<?> callerClass, FileDescriptor fd) {
1114+
policyManager.checkFileDescriptorRead(callerClass);
1115+
}
1116+
1117+
@Override
1118+
public void check$java_io_FileInputStream$(Class<?> callerClass, String name) {
1119+
policyManager.checkFileRead(callerClass, new File(name));
1120+
}
1121+
11061122
@Override
11071123
public void check$java_io_FileOutputStream$(Class<?> callerClass, String name) {
11081124
policyManager.checkFileWrite(callerClass, new File(name));
@@ -1123,6 +1139,99 @@ public void checkSelectorProviderInheritedChannel(Class<?> callerClass, Selector
11231139
policyManager.checkFileWrite(callerClass, file);
11241140
}
11251141

1142+
@Override
1143+
public void check$java_io_FileOutputStream$(Class<?> callerClass, FileDescriptor fd) {
1144+
policyManager.checkFileDescriptorWrite(callerClass);
1145+
}
1146+
1147+
@Override
1148+
public void check$java_io_FileReader$(Class<?> callerClass, File file) {
1149+
policyManager.checkFileRead(callerClass, file);
1150+
}
1151+
1152+
@Override
1153+
public void check$java_io_FileReader$(Class<?> callerClass, File file, Charset charset) {
1154+
policyManager.checkFileRead(callerClass, file);
1155+
}
1156+
1157+
@Override
1158+
public void check$java_io_FileReader$(Class<?> callerClass, FileDescriptor fd) {
1159+
policyManager.checkFileDescriptorRead(callerClass);
1160+
}
1161+
1162+
@Override
1163+
public void check$java_io_FileReader$(Class<?> callerClass, String name) {
1164+
policyManager.checkFileRead(callerClass, new File(name));
1165+
}
1166+
1167+
@Override
1168+
public void check$java_io_FileReader$(Class<?> callerClass, String name, Charset charset) {
1169+
policyManager.checkFileRead(callerClass, new File(name));
1170+
}
1171+
1172+
@Override
1173+
public void check$java_io_FileWriter$(Class<?> callerClass, File file) {
1174+
policyManager.checkFileWrite(callerClass, file);
1175+
}
1176+
1177+
@Override
1178+
public void check$java_io_FileWriter$(Class<?> callerClass, File file, boolean append) {
1179+
policyManager.checkFileWrite(callerClass, file);
1180+
}
1181+
1182+
@Override
1183+
public void check$java_io_FileWriter$(Class<?> callerClass, File file, Charset charset) {
1184+
policyManager.checkFileWrite(callerClass, file);
1185+
}
1186+
1187+
@Override
1188+
public void check$java_io_FileWriter$(Class<?> callerClass, File file, Charset charset, boolean append) {
1189+
policyManager.checkFileWrite(callerClass, file);
1190+
}
1191+
1192+
@Override
1193+
public void check$java_io_FileWriter$(Class<?> callerClass, FileDescriptor fd) {
1194+
policyManager.checkFileDescriptorWrite(callerClass);
1195+
}
1196+
1197+
@Override
1198+
public void check$java_io_FileWriter$(Class<?> callerClass, String name) {
1199+
policyManager.checkFileWrite(callerClass, new File(name));
1200+
}
1201+
1202+
@Override
1203+
public void check$java_io_FileWriter$(Class<?> callerClass, String name, boolean append) {
1204+
policyManager.checkFileWrite(callerClass, new File(name));
1205+
}
1206+
1207+
@Override
1208+
public void check$java_io_FileWriter$(Class<?> callerClass, String name, Charset charset) {
1209+
policyManager.checkFileWrite(callerClass, new File(name));
1210+
}
1211+
1212+
@Override
1213+
public void check$java_io_FileWriter$(Class<?> callerClass, String name, Charset charset, boolean append) {
1214+
policyManager.checkFileWrite(callerClass, new File(name));
1215+
}
1216+
1217+
@Override
1218+
public void check$java_io_RandomAccessFile$(Class<?> callerClass, String name, String mode) {
1219+
if (mode.equals("r")) {
1220+
policyManager.checkFileRead(callerClass, new File(name));
1221+
} else {
1222+
policyManager.checkFileWrite(callerClass, new File(name));
1223+
}
1224+
}
1225+
1226+
@Override
1227+
public void check$java_io_RandomAccessFile$(Class<?> callerClass, File file, String mode) {
1228+
if (mode.equals("r")) {
1229+
policyManager.checkFileRead(callerClass, file);
1230+
} else {
1231+
policyManager.checkFileWrite(callerClass, file);
1232+
}
1233+
}
1234+
11261235
@Override
11271236
public void check$java_util_Scanner$(Class<?> callerClass, File source) {
11281237
policyManager.checkFileRead(callerClass, source);

libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,14 @@ public void checkFileWrite(Class<?> callerClass, Path path) {
304304
}
305305
}
306306

307+
public void checkFileDescriptorRead(Class<?> callerClass) {
308+
neverEntitled(callerClass, () -> "read file descriptor");
309+
}
310+
311+
public void checkFileDescriptorWrite(Class<?> callerClass) {
312+
neverEntitled(callerClass, () -> "write file descriptor");
313+
}
314+
307315
/**
308316
* Invoked when we try to get an arbitrary {@code FileAttributeView} class. Such a class can modify attributes, like owner etc.;
309317
* we could think about introducing checks for each of the operations, but for now we over-approximate this and simply deny when it is
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
com.maxmind.db:
2+
- files:
3+
- relative_path: "ingest-geoip/"
4+
relative_to: "config"
5+
mode: "read_write"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
ALL-UNNAMED:
22
- manage_threads
33
- outbound_network
4+
- files:
5+
- relative_path: "repository-s3/aws-web-identity-token-file"
6+
relative_to: "config"
7+
mode: "read"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
org.elasticsearch.blobcache:
2+
- files:
3+
- relative_path: "shared_snapshot_cache"
4+
relative_to: "data"
5+
mode: "read_write"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,10 @@
11
ALL-UNNAMED:
22
- manage_threads
3+
- files:
4+
- relative_path: ".mime.types"
5+
relative_to: "home"
6+
mode: "read"
7+
- relative_path: ".mailcap"
8+
relative_to: "home"
9+
mode: "read"
10+

0 commit comments

Comments
 (0)