Skip to content
Prev Previous commit
Next Next commit
Use original test for Windows, use UID for unix and add co-author
  • Loading branch information
NoahvdAa authored and me4502 committed Oct 2, 2021
commit f601aa15c0886c2ba43a08dbe463ef11e6137002
67 changes: 46 additions & 21 deletions patches/server/0806-Add-root-admin-user-detection.patch
Original file line number Diff line number Diff line change
Expand Up @@ -8,46 +8,71 @@ The warning serves as a sort-of PSA for newer server admins who don't understand
We've seen plenty of bad/malicious plugins hit markets, and there's been a few close-calls with exploits in the past.
Hopefully this helps mitigate some potential damage to servers, even if it is just a warning.

Co-authored-by: Noah van der Aa <[email protected]>

diff --git a/src/main/java/io/papermc/paper/util/ServerEnvironment.java b/src/main/java/io/papermc/paper/util/ServerEnvironment.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f41ea267c2cde6dc897e2c6e1615e1bb42d3a60
index 0000000000000000000000000000000000000000..2d029bafafd912a35c7d272e9a08b87c23314f88
--- /dev/null
+++ b/src/main/java/io/papermc/paper/util/ServerEnvironment.java
@@ -0,0 +1,41 @@
@@ -0,0 +1,64 @@
+package io.papermc.paper.util;
+
+import org.apache.commons.lang.SystemUtils;
+
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.prefs.Preferences;
+
+public class ServerEnvironment {
+ private static final boolean runningAsRootOrAdmin;
+
+ static {
+ if (SystemUtils.IS_OS_WINDOWS) {
+ String programFiles = System.getenv("ProgramFiles");
+ if (programFiles == null) {
+ programFiles = "C:\\Program Files";
+ }
+ File programFile = new File(programFiles);
+ boolean canWrite = programFile.canWrite();
+
+ if (canWrite) {
+ // Make sure that the path can actually be written to.
+ try {
+ File test = File.createTempFile(".paperwritecheck", null, programFile);
+ if (!test.delete()) {
+ test.deleteOnExit();
+ }
+ } catch (IOException exception) {
+ canWrite = false;
+ // https://stackoverflow.com/a/23538961
+ Preferences prefs = Preferences.systemRoot();
+ PrintStream err = System.err;
+ PrintStream emptyStream = new PrintStream(new OutputStream() {
+ @Override
+ public void write(int b) {
+ }
+ });
+
+ System.err.flush();
+ System.setErr(emptyStream);
+
+ boolean retVal;
+ try {
+ prefs.put("papermc.priv_test", "This is a test performed by the Paper Minecraft server software."); // SecurityException
+ prefs.remove("papermc.priv_test");
+ prefs.flush(); // BackingStoreException
+ retVal = true;
+ } catch (Exception ignored) { // Windows = SecurityException
+ retVal = false;
+ }
+ runningAsRootOrAdmin = retVal;
+
+ runningAsRootOrAdmin = canWrite;
+ System.err.flush();
+ System.setErr(err);
+ } else {
+ runningAsRootOrAdmin = System.getProperty("user.name", "").equals("root");
+ String uid = "";
+
+ // https://stackoverflow.com/a/4796235/11171331
+ try {
+ Process child = Runtime.getRuntime().exec("id -u " + System.getProperty("user.name"));
+
+ // Get the input stream and read from it.
+ BufferedReader reader = new BufferedReader(new InputStreamReader(child.getInputStream()));
+ uid = reader.readLine();
+ reader.close();
+ } catch (IOException ignored) {
+ }
+
+ // On Unix systems the UID for the root user is always zero.
+ runningAsRootOrAdmin = uid.equals("0");
+ }
+ }
+
Expand Down