Java SecurityManager только блокирует вызов и установку отражения - PullRequest
0 голосов
/ 08 мая 2020

Я хочу, чтобы мой SecurityManager блокировал только invoke для метода и set для отражения поля. getDeclaredMethods или аналогичный должен оставаться разрешенным. Это возможно? Я хочу заблокировать изменение поля security частного класса java.lang.System, но все же разрешить отражение. Вот мой код:

public class SecMan extends SecurityManager {

  @Override
  public void checkPermission(Permission perm) {
    if (perm instanceof ReflectPermission) {
      // called on setAccessible
      // determine whether caller is permitted, but how? 
      // can't get reference name using getClassContext()
    }
  }

  @Override
  public void checkPackageAccess(String pkg) {
    if (pkg.startsWith("sun.misc")) {
      // do not allow Unsafe, as it could disable my SecurityManager too.
      throw new SecurityException();
    }
  }

  @Override
  public void checkMemberAccess(Class<?> clazz, int which) {
    // not called sadly, deprecated
  }
}

В частности, я хочу заблокировать этот код:

      Method getDeclaredFields0M = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
      getDeclaredFields0M.setAccessible(true);
      Field[] fields = (Field[]) getDeclaredFields0M.invoke(System.class, false);
      Field securityField = null;
      for (Field field : fields)
        if (field.getName().equals("security")) {
          securityField = field;
        }
      securityField.setAccessible(true);
      securityField.set(null, null);
...