From 0780ead8900c5a3ae744c4e082f6566ba3bd3b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenzo=20Dematt=C3=A9?= Date: Sat, 1 Mar 2025 00:10:08 +0100 Subject: [PATCH] [Entitlements] Add a check for filesystem mismatch (#123744) --- .../runtime/policy/FileAccessTree.java | 3 +++ .../runtime/policy/PolicyManager.java | 25 +++++++++++++++++++ .../policy/entitlements/FilesEntitlement.java | 1 - 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileAccessTree.java b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileAccessTree.java index d46a1aeb7eade..b88acadecb130 100644 --- a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileAccessTree.java +++ b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileAccessTree.java @@ -9,6 +9,7 @@ package org.elasticsearch.entitlement.runtime.policy; +import org.elasticsearch.core.Strings; import org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement; import org.elasticsearch.entitlement.runtime.policy.entitlements.FilesEntitlement.Mode; import org.elasticsearch.logging.LogManager; @@ -202,6 +203,7 @@ static String normalizePath(Path path) { } private boolean checkPath(String path, String[] paths) { + logger.trace(() -> Strings.format("checking [%s] against [%s]", path, String.join(",", paths))); if (paths.length == 0) { return false; } @@ -219,6 +221,7 @@ private boolean checkPath(String path, String[] paths) { } private static boolean isParent(String maybeParent, String path) { + logger.trace(() -> Strings.format("checking isParent [%s] for [%s]", maybeParent, path)); return path.startsWith(maybeParent) && path.startsWith(FILE_SEPARATOR, maybeParent.length()); } diff --git a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyManager.java b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyManager.java index ddceb9f9ff1f0..63492b265ca6d 100644 --- a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyManager.java +++ b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyManager.java @@ -9,6 +9,7 @@ package org.elasticsearch.entitlement.runtime.policy; +import org.elasticsearch.core.PathUtils; import org.elasticsearch.core.Strings; import org.elasticsearch.core.SuppressForbidden; import org.elasticsearch.entitlement.instrumentation.InstrumentationService; @@ -61,6 +62,8 @@ public class PolicyManager { static final String SERVER_COMPONENT_NAME = "(server)"; static final String APM_AGENT_COMPONENT_NAME = "(APM agent)"; + static final Class DEFAULT_FILESYSTEM_CLASS = PathUtils.getDefaultFileSystem().getClass(); + /** * @param componentName the plugin name; or else one of the special component names * like {@link #SERVER_COMPONENT_NAME} or {@link #APM_AGENT_COMPONENT_NAME}. @@ -305,7 +308,26 @@ public void checkFileRead(Class callerClass, File file) { checkFileRead(callerClass, file.toPath()); } + private static boolean isPathOnDefaultFilesystem(Path path) { + var pathFileSystemClass = path.getFileSystem().getClass(); + if (path.getFileSystem().getClass() != DEFAULT_FILESYSTEM_CLASS) { + logger.trace( + () -> Strings.format( + "File entitlement trivially allowed: path [%s] is for a different FileSystem class [%s], default is [%s]", + path.toString(), + pathFileSystemClass.getName(), + DEFAULT_FILESYSTEM_CLASS.getName() + ) + ); + return false; + } + return true; + } + public void checkFileRead(Class callerClass, Path path) { + if (isPathOnDefaultFilesystem(path) == false) { + return; + } var requestingClass = requestingClass(callerClass); if (isTriviallyAllowed(requestingClass)) { return; @@ -332,6 +354,9 @@ public void checkFileWrite(Class callerClass, File file) { } public void checkFileWrite(Class callerClass, Path path) { + if (isPathOnDefaultFilesystem(path) == false) { + return; + } var requestingClass = requestingClass(callerClass); if (isTriviallyAllowed(requestingClass)) { return; diff --git a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/entitlements/FilesEntitlement.java b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/entitlements/FilesEntitlement.java index 94af46dceeb5a..c22a47764d1c3 100644 --- a/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/entitlements/FilesEntitlement.java +++ b/libs/entitlement/src/main/java/org/elasticsearch/entitlement/runtime/policy/entitlements/FilesEntitlement.java @@ -108,7 +108,6 @@ static boolean isAbsolutePath(String path) { // Unix/BSD absolute return true; } - return isWindowsAbsolutePath(path); }