인가되지 않은 사용자에게 민감 정보 노출

Exposure of Sensitive Information to an Unauthorized Actor

설명

명시적으로 접근 권한을 부여받지 않은 사용자나 시스템에 민감 정보를 노출할 때 발생하는 취약점입니다.

잠재적 영향

  • 민감 정보 노출 (Confidential Information Disclosure): 악의적 사용자가 민감한 데이터에 접근하여 시스템 및 사용자와 관련된 정보를 이용할 수 있음.

해결 방법

  1. 민감한 정보에 접근할 수 있는 사용자를 엄격하게 제한합니다.
  2. 필요한 최소 권한 원칙을 적용하여 민감한 데이터에 대한 접근 권한을 필요한 사용자에게만 부여합니다.
  3. 저장·전송 중인 민감 데이터를 적절히 암호화하세요. 암호화만으로 애플리케이션의 접근 권한 검사를 대신할 수는 없습니다.
  4. 데이터를 로그에 저장할 때, 민감한 정보가 포함되지 않도록 필터링합니다.
  5. 보안 관련 로그는 민감한 정보를 포함하지 않도록 설정합니다.

예시

인증과 사용자별 접근 권한 검사를 비교하는 컨트롤러 발췌입니다. getUserDetails()는 예시 데이터를 반환하는 대역이며, 실제 조회 구현은 생략했습니다. Principal은 서버가 인증한 주체여야 하고, 이름과 userId가 같은 사용자 식별 체계를 사용해야 합니다.

변경 전

java
@RestController
public class UserController {

    @GetMapping("/user")
    public String getUserInfo(@RequestParam String userId) {
        // 위험한 코드: 모든 사용자 정보가 노출될 수 있음
        return "Displaying user info: " + getUserDetails(userId);
    }

    private String getUserDetails(String userId) {
        // 사용자 정보를 조회하는 메소드
        return "User Details";  // 예시 데이터로 간단히 표현
    }
}

변경 후

java
@RestController
public class UserController {

    @GetMapping("/user")
    public ResponseEntity<String> getUserInfo(@RequestParam String userId, Principal principal) {
        // 현재 인증된 사용자만 정보에 접근할 수 있습니다.
        if (principal == null || !principal.getName().equals(userId)) {
            return new ResponseEntity<>("Access Denied", HttpStatus.FORBIDDEN);
        }
        return new ResponseEntity<>("Displaying user info: " + getUserDetails(userId), HttpStatus.OK);
    }

    private String getUserDetails(String userId) {
        // 사용자 정보를 조회하는 메소드
        return "User Details";  // 예시 데이터로 간단히 표현
    }
}

설명:

  • 변경 전: 실제 조회 함수가 민감 데이터를 반환하고 별도 인가 검사가 없다면, 요청자가 다른 사용자의 ID로 정보를 조회할 수 있습니다.
  • 변경 후: 인증 주체가 없거나 요청한 ID와 일치하지 않으면 거부합니다. 인증 설정과 별도로 본인 정보에 대한 인가 조건을 확인하며, 반환 필드도 필요한 범위로 제한하세요.

관련 CVE

참조