보안에 민감한 메서드들을 호출하는 응용 코드는 메서드에게 전달되는 매개변수들을 검증해야만 한다.
어떤 보안에 민감한 메서드들에게는 null 값이 무난한 것으로 해석될 수도 있으나 디폴트 설정을 덮어쓸지도 모른다.
그렇게 되면 권한상승 또는 아무 코드나 수행할 수도 있게 된다.
부적절한 코드 - 보안에 민감한 메서드의 매개변수로 null을 사용
지금은 deprecated 되었지만 부적절한 코드 예를 한번 살펴보자.
AccessController.doPrivileged
자바에서 특정 코드 블록을 보안 권한 검사를 우회하고 특권(privileged) 상태로 실행할 수 있는 메서드다.
AccessController.doPrivileged(
new PrivilegedAction<Void>(){
public Void run(){
//...
}
}, accessControlContext);
- 2-매개변수형 doPrivileged() 메서드는 2번째 매개변수로 권한을 나타내는 개채 AccessControlContext를 받는다.
- 만약 이 AccessControlContext가 null 인 경우 현재의 권한을 이전에 저장된 컨텍스트의 권한으로 한정하지 못한다.
- 즉, 이전의 권한 컨텍스트를 가져와서 특정 작업을 제한된 권한으로 실행하는 것이 불가능하다.
- 이렇게 AccessControlContext가 null인 경우에는 특정 작업을 실행할 때 현재 스레드의 권한 상태가 유지된다.
- 따라서 권한 제한이나 변경 없이 작업이 실행되게 된다.
솔루션 - null이 되지 않도록 보장
if(accessControlContext == null){
throw new SecurityException("Missing AccessControlContext");
}
AccessController.doPrivileged(
new PrivilegedAction<Void>(){
public Void run(){
//...
}
}, accessControlContext);
- AccessControlContext가 null이 되지 않도록 보장함으로써 과도하게 권한이 부여되지 않게 방지한다.
Spring 예제
Spring에서 사용되는 매개변수를 검증하는 예제를 살펴보자.
PaymentService
- PaymentService 클래스의 makePayment는 사용자의 계정 이름과 결제 금액을 검증한 후 결제를 수행하는 보안에 민감한 메서드라고 가정한다.
- @PreAuthorize 애너테이션을 사용하여 메서드 호출 시 보안 검사를 수행한다.
PaymentClient
- PaymentClient 클래스의 initiatePayment 메서드에서 paymentService.makePayment를 호출할 때 매개변수 username이 현재 인증된 사용자의 이름과 일치하는지 @PreAuthorize 애너테이션을 통해 검증한다.
정리
- 예기치 못한 매개변수 값(null)에 의해 곤란한 경우가 일어나지 않도록, 보안에 민감한 메서드들은 완벽하게 이해되어야 하고 매개변수들이 검증되어야 한다.
- 만약 예기치 못한 매개변수 값들이 보안에 민감한 메서드들에게 전달된다면, 임의의 코드 실행이 가능해지며 권한상승이 이루어질 것이다.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] 출력을 적절하게 인코딩하거나 이스케이핑하라 (0) | 2023.08.11 |
---|---|
[Secure Coding] 마구잡이 파일 업로드를 방지하라 (0) | 2023.08.07 |
[Secure Coding] 민감한 가변적 클래스에 수정이 불가능한 래퍼를 제공하라 (0) | 2023.08.04 |
[Secure Coding] 클라이언트에 암호화되지 않은 민감-데이터를 저장하지 말라 (0) | 2023.08.03 |
[Secure Coding] 민감-데이터의 수명을 제한하라 (0) | 2023.07.24 |