설명
Security Manager를 사용하는 레거시 Java 환경에서 신뢰하지 않는 코드에 RuntimePermission("createClassLoader") 또는 ReflectPermission("suppressAccessChecks")를 부여하면 의도한 제한이 약해질 수 있습니다. 권한 객체를 만들거나 로컬 Permissions에 추가하는 것만으로 전역 권한이 부여되지는 않으므로, 해당 컬렉션이 실제 정책에 어떻게 적용되는지 확인하세요.
JDK 24부터 Security Manager는 영구적으로 비활성화되었습니다. 최신 JDK에서 이 권한 목록을 애플리케이션 격리 수단으로 의존하지 마세요.
잠재적 영향
- 실제 정책에서 과도한 권한이 부여되면 신뢰하지 않는 코드가 클래스 로더를 만들거나 리플렉션 접근 검사를 우회할 수 있습니다.
- 피해 범위는 실행 코드와 다른 권한·모듈 접근 제한에 따라 달라집니다.
해결 방법
- 레거시 정책에서는 불필요한
createClassLoader와suppressAccessChecks권한을 제거하세요. - 필요한 권한은 검토한 코드에만 최소 범위로 부여하세요.
- 신뢰하지 않는 코드는 별도 프로세스와 운영 체제의 권한·격리 제어로 제한하세요.
예시
권한 컬렉션의 구성만 보여 주는 예시입니다. 이 컬렉션을 정책에 연결하는 코드는 없으며, 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();
// 보안 강화를 위해 위험한 권한을 부여하지 않음
}
}
설명:
- 변경 전: 클래스 로더 생성과 리플렉션 접근 검사 생략 권한을 컬렉션에 추가합니다.
- 변경 후: 해당 권한을 추가하지 않습니다. 실제 제한 효과는 컬렉션을 사용하는 레거시 정책에 따라 달라집니다.