From 964b10f74064d04a3ea05a52b74ed86f485a13d5 Mon Sep 17 00:00:00 2001 From: Lim Sim Yee <137663782+simei2k@users.noreply.github.com> Date: Sat, 10 May 2025 22:06:28 +0800 Subject: [PATCH 1/2] Fix for Insecure Temporary File Creation The current implementation of createTempFile() has a security vulnerability related to privilege management. File operations should run with controlled privileges using Java's AccessController.doPrivileged() pattern to prevent security manager bypass or privilege escalation. This vulnerability was identified in eclipse-ee4j/jersey@5794b7a and fixed. References: 1. eclipse-ee4j/jersey@5794b7a 2. https://nvd.nist.gov/vuln/detail/cve-2022-21540 --- .../sf/robocode/recording/RecordManager.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java b/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java index 02307c149..98de5a2a9 100644 --- a/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java +++ b/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java @@ -111,23 +111,34 @@ public void detachRecorder() { } private void createTempFile() { - try { - if (tempFile == null) { - tempFile = File.createTempFile("robocode-battle-records", ".tmp"); - tempFile.deleteOnExit(); - } else { - if (!tempFile.delete()) { - Logger.logError("Could not delete temp file"); - } - if (!tempFile.createNewFile()) { - throw new Error("Temp file creation failed"); + final List exs = new ArrayList<>(); + + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + try { + if (tempFile == null) { + tempFile = File.createTempFile("robocode-battle-records", ".tmp"); + tempFile.deleteOnExit(); + } else { + if (!tempFile.delete()) { + Logger.logError("Could not delete temp file"); + } + if (!tempFile.createNewFile()) { + throw new Error("Temp file creation failed"); + } } + } catch (IOException e) { + exs.add(e); + logError(e); } - } catch (IOException e) { - logError(e); - throw new Error("Temp file creation failed", e); + return null; } + }); + + if (!exs.isEmpty()) { + throw new Error("Temp file creation failed", exs.get(0)); } +} void prepareInputStream() { try { From 1638298ac872d7a92daf02de758f35f8012eae96 Mon Sep 17 00:00:00 2001 From: "Flemming N. Larsen" Date: Tue, 13 May 2025 21:47:25 +0200 Subject: [PATCH 2/2] Added missing imports for RecordManager, formatted the createTempFile, and improvements to fix for createTempFile() --- .../sf/robocode/recording/RecordManager.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java b/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java index 98de5a2a9..7c3c61aa7 100644 --- a/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java +++ b/robocode.battle/src/main/java/net/sf/robocode/recording/RecordManager.java @@ -14,8 +14,6 @@ import net.sf.robocode.battle.snapshot.TurnSnapshot; import net.sf.robocode.io.FileUtil; import net.sf.robocode.io.Logger; -import static net.sf.robocode.io.Logger.logError; - import net.sf.robocode.serialization.*; import net.sf.robocode.settings.ISettingsManager; import net.sf.robocode.version.IVersionManager; @@ -29,6 +27,8 @@ import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; @@ -37,6 +37,8 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import static net.sf.robocode.io.Logger.logError; + /** * @author Pavel Savara (original) @@ -111,34 +113,26 @@ public void detachRecorder() { } private void createTempFile() { - final List exs = new ArrayList<>(); - - AccessController.doPrivileged(new PrivilegedAction() { - public Void run() { + AccessController.doPrivileged((PrivilegedAction) () -> { try { if (tempFile == null) { tempFile = File.createTempFile("robocode-battle-records", ".tmp"); tempFile.deleteOnExit(); } else { if (!tempFile.delete()) { - Logger.logError("Could not delete temp file"); + logError("Could not delete temp file"); } if (!tempFile.createNewFile()) { throw new Error("Temp file creation failed"); } } } catch (IOException e) { - exs.add(e); logError(e); + throw new Error("Temp file creation failed", e); } return null; - } - }); - - if (!exs.isEmpty()) { - throw new Error("Temp file creation failed", exs.get(0)); + }); } -} void prepareInputStream() { try {