설명
권한 누락은 사용자가 리소스에 접근하거나 특정 작업을 수행할 때 필수적인 권한 검사를 수행하지 않는 경우 발생하는 취약점입니다.
잠재적 영향
- 애플리케이션 데이터 읽기 및 쓰기: 공격자가 제한되지 않은 데이터 저장소에 직접 접근하거나 충분히 보호되지 않은 기능에 접근하여 데이터를 읽거나 수정할 수 있습니다.
- 권한 상승 및 보호 메커니즘 우회: 공격자가 권한이 필요한 기능에 접근하거나 중요한 데이터를 수정 또는 읽음으로써 권한을 얻을 수 있습니다.
- 서비스 거부 공격: 공격자가 시스템 리소스에 무단 접근하여 리소스를 과다하게 소비함으로써 서비스 거부 상태를 초래할 수 있습니다.
해결 방법
- 모든 사용자 요청에 대해 필수적인 권한 검사를 수행하세요.
- 보호 대상 엔드포인트와 리소스마다 요청자의 역할과 소유권 등 필요한 접근 조건을 확인하세요.
- Spring Security와 같은 인증 프레임워크를 사용하여 인증 및 권한을 관리하세요.
예시
변경 전
컨트롤러 메서드의 발췌입니다. 변경 전에는 별도 URL·서비스 계층의 권한 검사도 없다고 가정합니다. 변경 후의 @PreAuthorize는 Spring 관리 빈에 메서드 보안이 활성화되어 있어야 적용됩니다. 최신 구성에서는 @EnableMethodSecurity를 사용하며, 인증과 역할 매핑도 별도로 구성하세요.
java
@GetMapping("/admin")
public String getAdminPage() {
// 민감한 데이터 또는 관리자 전용 기능
return "admin-page";
}
변경 후
java
@GetMapping("/admin")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String getAdminPage() {
// 민감한 데이터 또는 관리자 전용 기능
return "admin-page";
}
설명:
- 변경 전: 비권장 코드에서는 '/admin' 엔드포인트에 접근하기 위한 권한 검사가 없습니다. 다른 계층에서도 접근을 제한하지 않으면 권한 없는 사용자가 접근할 수 있습니다.
- 변경 후: 권장 코드에서는 @PreAuthorize("hasRole('ROLE_ADMIN')") 어노테이션을 사용하여 관리자 권한이 있는 사용자만 '/admin' 엔드포인트에 접근할 수 있도록 설정합니다.
관련 CVE
- CVE-2022-24730: Go-based continuous deployment product does not check that a user has certain privileges to update or create an app, allowing adversaries to read sensitive repository information
- CVE-2009-3168: Web application does not restrict access to admin scripts, allowing authenticated users to reset administrative passwords.
- CVE-2009-3597: Web application stores database file under the web root with insufficient access control (CWE-219), allowing direct request.