Java 보안 권한 설정 점검

Java의 레거시 권한 정책에서 불필요한 클래스 로더와 리플렉션 권한을 제한하세요.

설명

Security Manager를 사용하는 레거시 Java 환경에서 신뢰하지 않는 코드에 RuntimePermission("createClassLoader") 또는 ReflectPermission("suppressAccessChecks")를 부여하면 의도한 제한이 약해질 수 있습니다. 권한 객체를 만들거나 로컬 Permissions에 추가하는 것만으로 전역 권한이 부여되지는 않으므로, 해당 컬렉션이 실제 정책에 어떻게 적용되는지 확인하세요.

JDK 24부터 Security Manager는 영구적으로 비활성화되었습니다. 최신 JDK에서 이 권한 목록을 애플리케이션 격리 수단으로 의존하지 마세요.

잠재적 영향

  • 실제 정책에서 과도한 권한이 부여되면 신뢰하지 않는 코드가 클래스 로더를 만들거나 리플렉션 접근 검사를 우회할 수 있습니다.
  • 피해 범위는 실행 코드와 다른 권한·모듈 접근 제한에 따라 달라집니다.

해결 방법

  1. 레거시 정책에서는 불필요한 createClassLoader와 suppressAccessChecks 권한을 제거하세요.
  2. 필요한 권한은 검토한 코드에만 최소 범위로 부여하세요.
  3. 신뢰하지 않는 코드는 별도 프로세스와 운영 체제의 권한·격리 제어로 제한하세요.

예시

권한 컬렉션의 구성만 보여 주는 예시입니다. 이 컬렉션을 정책에 연결하는 코드는 없으며, JDK 24 이상에서 Security Manager를 활성화하는 방법이 아닙니다.

변경 전

java
import java.lang.RuntimePermission;
import java.lang.reflect.ReflectPermission;
import java.security.PermissionCollection;
import java.security.Permissions;

public class InsecurePermission {
    public static void main(String[] args) {
        PermissionCollection permissions = new Permissions();

        // 위험한 권한 부여
        permissions.add(new RuntimePermission("createClassLoader"));
        permissions.add(new ReflectPermission("suppressAccessChecks"));
    }
}

변경 후

java
import java.security.PermissionCollection;
import java.security.Permissions;

public class SecurePermission {
    public static void main(String[] args) {
        PermissionCollection permissions = new Permissions();

        // 보안 강화를 위해 위험한 권한을 부여하지 않음
    }
}

설명:

  • 변경 전: 클래스 로더 생성과 리플렉션 접근 검사 생략 권한을 컬렉션에 추가합니다.
  • 변경 후: 해당 권한을 추가하지 않습니다. 실제 제한 효과는 컬렉션을 사용하는 레거시 정책에 따라 달라집니다.

참조