설명
부적절한 인증은 사용하는 시스템에서 사용자의 신원을 확인하거나 증명하지 않거나, 불충분하게 증명함으로써 발생하는 취약점입니다. 이를 통해 공격자는 권한이 없는 데이터에 접근하거나 작업을 수행할 수 있습니다.
잠재적 영향
- 애플리케이션 데이터 읽기 (데이터 유출): 공격자가 인증 없이 애플리케이션 데이터를 접근할 수 있습니다.
- 권한 상승 혹은 신원 도용 (권한 오용): 권한이 없는 사용자가 더 높은 권한을 가지거나 다른 사용자의 신원을 도용할 수 있습니다.
- 무단 실행: 코드나 명령을 실행하는 기능이 노출되어 있다면 인증되지 않은 사용자가 이를 악용할 수 있습니다.
해결 방법
- 강력한 인증 메커니즘을 사용하여 사용자 또는 시스템의 신원을 증명
- Multi-Factor Authentication(다중 요소 인증)을 적용
- 모든 인증 관련 데이터를 안전하게 저장하고 전송(예: HTTPS 사용)
예시
변경 전
java
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
if (username.equals("admin") && password.equals("admin")) {
session.setAttribute("user", "admin");
return "dashboard";
}
return "login";
}
변경 후
java
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
User user = userService.authenticate(username, password);
if (user != null) {
session.setAttribute("user", user);
return "dashboard";
}
return "login";
}
설명:
- 변경 전: 이 코드는 사용자 인증 시 고정된 사용자명과 비밀번호를 사용하고 있습니다. 이를 통해 공격자가 인증 절차를 우회할 수 있습니다.
- 변경 후: 사용자 이름과 비밀번호의 검증을 인증 서비스에 위임합니다. 메서드를 분리하는 것만으로 인증이 보장되지는 않으며, 서비스가 비밀번호 해시 검증과 실패 처리를 올바르게 구현해야 합니다.
관련 CVE
- CVE-2022-35248: Chat application skips validation when Central Authentication Service (CAS) is enabled, effectively removing the second factor from two-factor authentication
- CVE-2022-36436: Python-based authentication proxy does not enforce password authentication during the initial handshake, allowing the client to bypass authentication by specifying a 'None' authentication type.
- CVE-2022-30034: Chain: Web UI for a Python RPC framework does not use regex anchors to validate user login emails (CWE-777), potentially allowing bypass of OAuth (CWE-1390).