🇰🇷 한글 설명
Botan은 C++ 암호화 라이브러리입니다. 버전 1.11.22부터 3.13.0 이전까지, Botan의 Python 바인딩은 U+0000(NUL)이 포함된 Python 문자열을 const char*로 변환하면서 NUL 문자를 일관되게 거부하지 않아 bcrypt 및 check_bcrypt가 NUL 이전 접두부만 처리했습니다. 이로 인해 애플리케이션은 더 긴 비밀번호를 검증하면서도 실제로는 더 짧은 값을 해싱하게 되어 비밀번호 정책 우회가 가능했습니다. scrypt와 argon2는 영향을 받지 않으며, 3.13.0 버전에서 수정되었습니다.
💡 쉬운 설명
암호를 만들 때 중간에 보이지 않는 특수 문자가 들어가면, 프로그램이 그 뒤쪽 글자를 무시하고 앞부분만 저장할 수 있습니다. 그 결과 실제 저장되는 암호가 설정한 것보다 짧아져 보안 규칙을 우회당할 수 있습니다.
🇺🇸 원문 (English)
Botan is a C++ cryptography library. From 1.11.22 until 3.13.0, Botan's Python binding converted Python strings containing U+0000 to const char* values without consistently rejecting the embedded NUL, causing bcrypt and check_bcrypt to process only the prefix before the NUL. Applications could validate a longer password but hash a shorter effective value, allowing application password-policy bypass; scrypt and argon2 are unaffected. This issue is fixed in version 3.13.0.
📍 영향받는 시스템
Botan 1.11.22 이상 3.13.0 미만의 Python 바인딩을 사용하며 bcrypt 함수를 쓰는 시스템
⚔️ 공격 벡터
NUL 문자(U+0000)가 포함된 비밀번호를 입력해 검증은 통과하고 실제 해싱은 짧은 접두부로만 이루어지게 하는 방식
🛡️ 대응 방법
Botan을 3.13.0 이상으로 업데이트하거나, 비밀번호에 NUL 문자가 포함되지 않도록 애플리케이션 단에서 입력을 검증합니다.
🔧 검증 코드
출력된 버전이 3.13.0 미만이면 취약하며, 3.13.0 이상이면 이 취약점이 수정된 상태입니다.
pip show botan3 2>/dev/null | grep -i version || python3 -c "import botan3; print(botan3.__version__)" 2>/dev/null