설명
비밀번호나 인증용 키 같은 인증 정보를 소스 코드에 직접 넣어 사용하는 경우 발생합니다.
잠재적 영향
- 노출된 인증 정보를 사용해 보호된 기능이나 데이터에 무단으로 접근할 수 있습니다.
- 해당 계정에 높은 권한이 있다면 관리자 권한이 악용될 수 있습니다.
해결 방법
- 인증 정보는 접근이 제한된 비밀 저장소나 배포 시 주입되는 설정으로 관리하고, 실제 값은 저장소에 커밋하지 마세요. 이미 노출된 값은 폐기하고 교체하세요.
- 사용자 비밀번호의 검증에는 Spring Security의
PasswordEncoder처럼 검증된 기능을 사용하세요. - 사용자 비밀번호는 복호화 가능한 암호화나 평문 대신 비밀번호 저장에 적합한 단방향 해시로 보관하세요.
예시
변경 전
java
@RestController
public class LoginController {
private static final String USERNAME = "admin";
private static final String PASSWORD = "admin123"; // 하드코딩된 비밀번호
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
if (USERNAME.equals(username) && PASSWORD.equals(password)) {
return "로그인 성공";
}
return "로그인 실패";
}
}
변경 후
java
@RestController
public class LoginController {
@Value("${credentials.username}")
private String username;
@Value("${credentials.password}")
private String password;
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
if (this.username.equals(username) && this.password.equals(password)) {
return "로그인 성공";
}
return "로그인 실패";
}
}
설명:
- 변경 전: 코드에 접근할 수 있는 사람이 하드코딩된 비밀번호를 읽을 수 있습니다.
- 변경 후:
@Value로 외부 설정을 읽는 방법을 보여 줍니다. 설정 파일에 실제 비밀번호를 커밋하지 말고 전달 경로와 접근 권한을 보호하세요. 이 예시의 평문 비교는 완전한 로그인 구현이 아니며, 사용자 인증에는 적절한 비밀번호 해시 검증이 필요합니다.
관련 CVE
- CVE-2022-29953: Condition Monitor firmware has a maintenance interface with hard-coded credentials
- CVE-2022-29960: Engineering Workstation uses hard-coded cryptographic keys that could allow for unathorized filesystem access and privilege escalation
- CVE-2022-29964: Distributed Control System (DCS) has hard-coded passwords for local shell access