Libsodium의 취약점

1 month ago 13

  • libsodium의 저수준 함수 crypto_core_ed25519_is_valid_point()에서 Edwards25519 곡선의 부적절한 점 검증 오류가 발견됨
  • 이 함수는 점이 주된 암호학적 그룹에 속하는지 확인해야 하지만, 혼합 차수(subgroup) 의 일부 점을 잘못 통과시킴
  • 원인은 내부 좌표 검증 시 X=0만 확인하고 Y=Z 검증을 누락한 코드 오류로, 잘못된 점이 유효하다고 처리될 수 있었음
  • 수정 버전에서는 두 조건(X=0, Y=Z)을 모두 검사하도록 변경되었으며, 1.0.20 이하 버전 또는 2025년 12월 30일 이전 릴리스가 영향을 받음
  • 고수준 API(crypto_sign_*)는 영향을 받지 않으며, Ristretto255 그룹 사용이 안전성과 성능 면에서 권장됨

libsodium 프로젝트 개요

  • libsodium은 13년 전 시작된 프로젝트로, 암호학을 쉽게 사용할 수 있도록 단순한 API를 제공하는 것을 목표로 함
    • 내부 알고리듬을 사용자가 알 필요 없이 고수준 연산만 수행할 수 있도록 설계
  • API의 호환성 유지를 중시하며, NaCl API를 기반으로 현재까지 일관성을 유지
  • 일부 사용자가 문서에 명시된 제한을 넘어 저수준 함수를 직접 사용하면서, 라이브러리가 암호학 툴킷처럼 활용되는 사례가 늘어남

발견된 버그의 원인

  • 문제 함수: crypto_core_ed25519_is_valid_point()
    • Edwards25519 곡선에서 주된 그룹(L 차수)에 속하지 않은 점을 거부해야 함
    • 그러나 혼합 차수(2L, 4L, 8L 등) 의 점 일부가 검증을 통과함
  • 내부적으로 점의 차수를 확인하기 위해 L을 곱한 뒤, 결과가 항등점(identity) 인지 검사
    • 항등점은 X=0, Y=Z 형태로 표현되지만, 기존 코드는 X=0만 검사
    • 이로 인해 Y≠Z인 잘못된 점이 유효하다고 처리됨
  • 예시: 주된 그룹의 점 Q에 차수 2의 점 (0, -1)을 더한 Q+(0, -1)은 잘못된 점이지만, 수정 전에는 통과함

수정 내용

  • 패치 커밋은 다음과 같이 변경됨
    • 기존 코드: return fe25519_iszero(pl.X);
    • 수정 코드: fe25519_sub(t, pl.Y, pl.Z); return fe25519_iszero(pl.X) & fe25519_iszero(t);
  • 이제 X=0과 Y=Z 두 조건을 모두 확인하여 올바른 검증 수행

영향 범위

  • 다음 조건에 해당하는 경우 영향 가능
    • 버전 1.0.20 이하 또는 2025년 12월 30일 이전 릴리스 사용
    • crypto_core_ed25519_is_valid_point()로 신뢰할 수 없는 입력 점을 검증
    • Edwards25519 곡선 연산을 직접 구현하는 사용자
  • 그러나 대부분의 사용자는 영향 없음
    • 고수준 API(crypto_sign_*)는 해당 함수를 사용하지 않음
    • crypto_scalarmult_ed25519는 잘못된 공개키로도 정보 누출 없음
    • crypto_sign_keypair 및 crypto_sign_seed_keypair로 생성된 키는 올바른 그룹에 속함

권장 조치

  • Ristretto255 그룹 사용 권장
    • 2019년부터 libsodium에 포함되어 있으며, cofactor 관련 문제를 해결
    • 디코딩된 점은 자동으로 안전하며, 추가 검증 불필요
    • Edwards25519보다 빠른 연산 성능 제공
  • 업데이트가 불가능한 경우, 제시된 애플리케이션 수준 대체 함수(is_on_main_subgroup)를 사용해 검증 가능

수정된 배포 및 지원

  • 문제 발견 직후 즉시 수정되어, 2025년 12월 30일 이후 배포된 모든 안정 버전에 포함
    • 공식 tarball, Visual Studio/MingW 바이너리, NuGet 패키지, Android용 빌드, swift-sodium xcframework, Rust libsodium-sys-stable, libsodium.js 포함
  • 새로운 point release도 예정
  • 프로젝트는 1인 유지보수로 운영되며, OpenCollective 후원을 통해 지속적인 개선 지원 가능

Read Entire Article