
CVE-2022-xxxx에 대한 완화 조치를 지원하기 위해 이 도구를 사용하여 데이터베이스에서 업데이트가 필요한 해시가 있는지 확인할 수 있습니다.
애플리케이션을 데이터베이스와 통합한 후, 이 도구는 두 단계로 작동합니다.
이를 설명하기 위해 인메모리 샘플 애플리케이션이 사용됩니다.
해당 샘플 애플리케이션에서 다음과 같이 check 단계를 실행할 수 있습니다.
./mvnw spring-boot:run@check
이렇게 하면 샘플 데이터베이스에서 업데이트가 필요한 BCrypt 해시가 있는지 확인합니다.
그런 다음, 다음과 같이 update 단계를 실행할 수 있습니다.
./mvnw spring-boot:run@update
이렇게 하면 샘플 데이터베이스에서 감지된 취약한 해시를 업데이트하려고 시도합니다.
샘플 애플리케이션은 제공된 VulnerabilityCheck 클래스를 사용하여 각 비밀번호 해시를 확인하고 업데이트합니다.
경고: 애플리케이션을 31보다 낮은 라운드 수를 사용하도록 업데이트한 후에만 이 단계를 진행하세요. OWASP는 현재 10을 권장하지만, 일부 고성능 시스템에서는 16까지 사용되기도 합니다.
이 도구에는 테스트 목적의 인메모리 샘플이 포함되어 있습니다. 이를 데이터와 통합되는 자체 클래스로 교체해야 합니다.
이렇게 하려면 먼저 이 저장소를 클론하세요.
그런 다음 sample 패키지의 코드를 애플리케이션의 비밀번호 데이터에 접근할 수 있는 코드로 교체하세요.
기존 비밀번호를 확인하여 취약한지 여부를 판별하는 코드를 작성하고 싶을 것입니다.
영향을 받는 해시를 업데이트하는 코드를 작성해야 할 것입니다.
두 경우 모두 VulnerabilityCheck를 사용하여 주어진 해시를 확인하고 업데이트할 수 있습니다.
팁: 위 코드를 작성할 때 업데이트해야 하는 비밀번호 수를 고려하세요. 데이터베이스 연결이 실패할 수 있고, 컴퓨터가 충돌할 수 있으며, 메모리가 부족할 수 있다는 점을 반드시 염두에 두세요. 예를 들어 수백만 개의 레코드를 한 번에 메모리로 가져오는 것은 권장되지 않습니다.
비밀번호 해시를 업데이트한 후에는 이제 최신 Spring Security로 업데이트할 수 있습니다. Spring Security의 비밀번호 업데이트 기능을 사용하는 경우, 사용자가 로그인하면 비밀번호가 새로 구성한 라운드 값으로 자동으로 다시 해시됩니다.
Q: 내 해시가 취약한지 어떻게 알 수 있나요?
A: Spring Security의 BCrypt 클래스를 사용하여 작업 계수(work factor) 31로 해시된 경우 취약합니다.
시스템에서 Spring Security가 관리하는 비밀번호 해시를 확인하여 이를 확인할 수 있습니다.
해시가 '{bcrypt}$2a$31', '{bcrypt}$2b$31', '{bcrypt}$2y$31', '{bcrypt}$2$31', '$2a$31', '$2b$31', '$2y$31' 또는 '$2$31'로 시작하면 해당 비밀번호는 취약하므로 업데이트해야 합니다.
Q: 애플리케이션을 어떻게 변경해야 하나요?
A: OWASP는 BCrypt에 대해 작업 계수 10을 권장합니다. 일부 고성능 시스템에서는 16까지 사용합니다. 모든 시스템은 다르며 BCrypt는 필요에 따라 시간이 지남에 따라 작업 계수를 늘릴 수 있도록 설계되었습니다.
Q: 애플리케이션에서 어디를 변경해야 하나요?
A: 다음과 같이 BCryptPasswordEncoder를 생성하여 작업 계수를 설정하고 있을 가능성이 높습니다.
new BCryptPasswordEncoder(31)
빈 정의에 다음과 같이 나타날 수 있습니다.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(31);
}
해당 문자열을 찾아 업데이트하면 됩니다. 작업 계수가 애플리케이션에서 외부 속성으로 구동될 수 있으므로, 이 경우 외부 구성에서 변경해야 한다는 점에 유의하세요.
Q: 방금 Spring Security를 업데이트했는데 일부 또는 모든 로그인 및 사용자 등록이 멈춰 있습니다. 무슨 일이 발생했나요?
A: Spring Security 5.5.7+, 5.6.4+, 5.7.0+부터 작업 계수 31을 나타내는 비밀번호 해시 -- 예를 들어 '{bcrypt}$2a$31', '{bcrypt}$2b$31', '{bcrypt}$2y$31', '{bcrypt}$2$31', '$2a$31', '$2b$31', '$2y$31' 또는 '$2$31'로 시작하는 해시 -- 는 각 해시 계산을 완료하는 데 2~3일이 걸립니다. 이를 완화하려면 Spring Security가 더 낮은 라운드 수를 사용하도록 변경해야 합니다. 그런 다음 이 도구를 사용하여 취약한 비밀번호 해시를 업데이트하세요.
Q: 권장되는 세 단계(BCryptPasswordEncoder 구성 변경, 비밀번호 해시 업데이트, Spring Security 업데이트)를 모두 완료했습니다. 그런데 수정된 비밀번호 해시가 새로 구성한 작업 계수로 업데이트되지 않습니다. 어떻게 해야 하나요?
UserDetailsPasswordService 유형의 빈이 게시되어 있는지 확인하세요.
이 빈은 비밀번호를 새 BCrypt 로그 라운드로 업데이트하는 데 사용됩니다.
Q: Spring Security는 이 도구 없이 업그레이드 시점에 취약한 비밀번호를 단순히 업데이트할 수 없는 이유는 무엇인가요?
첫째, 최신 Spring Security에서는 작업 계수 31의 비밀번호 해시가 올바르게 계산되므로 각각 완료하는 데 2~3일이 걸립니다. 이것이 애플리케이션이 감수하기에 합리적인 비용이라고 가정하는 것은 비현실적인 기대입니다.
둘째, Spring Security는 작업 계수 증가(예: 10에서 12로)만 지원하며 감소(예: 31에서 10으로)는 지원하지 않습니다.