- macOS에 Apple이 번들한 curl은
--cacert옵션을 오픈소스 빌드와 다르게 처리해, 사용자가 지정한 CA만 신뢰한다는 TLS 검증 기대를 깨뜨림 --cacert는 서버 인증서를 지정한 CA 인증서 집합으로만 검증하게 하는 옵션이며, 검증에 실패하면 curl이 오류를 반환해야 함- Apple 제공 curl은 지정 CA 검증이 실패해도 시스템 CA 저장소를 추가로 확인하는 것으로 보이며, 이 동작은 요청되지 않았고 문서화되지 않았음
- Apple Product Security는 Apple의 OpenSSL인 LibreSSL이 내장 시스템 신뢰 저장소를 기본 신뢰 소스로 의도적으로 사용한다며 수정 대상이 아니라고 답함
- curl 프로젝트 배포판의 취약점은 아니어서 CVE는 발급되지 않았지만, macOS 번들 curl의 CA 검증 결과는 문서와 달라질 수 있음
이슈 12604의 시작
- 2023년 12월 28일 curl 이슈 트래커에 bugreport 12604가 등록됨
- 이슈 제목은 “flag --cacert behavior isn’t consistent between macOS and Linux”였고, Yuedong Wu가 보고함
- 같은 macOS 머신에서 같은 curl 버전을 실행해도, Apple 번들 curl과 오픈소스에서 빌드한 curl 바이너리의 동작이 달랐음
--cacert가 기대하게 만드는 보장
- curl 명령줄 옵션
--cacert는 이후 전송에서 curl이 정확히 지정된 CA 인증서 집합만 신뢰하도록 만드는 방법임 - TLS 서버가 해당 인증서 집합으로 검증 가능한 인증서를 제공하지 못하면 curl은 실패하고 오류를 반환해야 함
- 이 옵션은 2000년 12월 curl에 추가됐으며, 사용자가 알고 신뢰하는 서버와 통신하는지 확인하기 위한 기능임
- 결국 TLS가 제공해야 하는 기본 역할과 직접 맞닿아 있음
macOS 번들 curl의 예외적 동작
- Apple이 제공하는 macOS용 curl은
--cacert사용 시 지정된 CA 인증서 집합으로 검증에 실패하면 시스템 CA 저장소를 추가로 확인하는 것으로 보임 - 이 보조 검사는 사용자가 요청한 동작이 아니며, 문서에도 없어서 예측하기 어려움
- 사용자가 축소된 전용 CA 인증서 파일로 검증하려 해도, 시스템 CA 저장소에 서버를 검증할 수 있는 인증서가 있으면 실패하지 않음
- 그 결과 통과하면 안 되는 인증서 검증이 통과할 수 있어 보안 문제로 간주됨
Apple Product Security의 답변
- 2023년 12월 29일 08:30 UTC에 Apple Product Security로 보안 문제 보고 메일이 전달됨
- Apple Product Security는 2024년 3월 8일 답변함
- Apple의 답변은 두 가지로 정리됨
- Apple의 OpenSSL인 LibreSSL은 내장 시스템 신뢰 저장소를 기본 신뢰 소스로 의도적으로 사용함
- 서버 인증서가 내장 시스템 신뢰 저장소로 성공적으로 검증될 수 있으므로, Apple 플랫폼에서 처리해야 할 문제로 보지 않음
- Apple은 이 케이스를 종료함
curl 프로젝트 측 판단과 사용자 영향
- macOS의 이 문서화되지 않은 기능은 curl의 CA 인증서 검증을 문서와 일관되지 않게 만듦
- 사용자는
--cacert로 지정한 CA 인증서 집합만 사용한다고 기대하지만, Apple 제공 curl은 그 기대와 다르게 동작함 - 이 문제는 curl 프로젝트가 배포하는 curl 버전의 보안 취약점이 아님
- curl 프로젝트는 이 문제에 대해 CVE를 발급하지 않음
- 문제는 curl 코드 자체가 아니라 Apple이 플랫폼에 제공하고 curl 빌드에 사용하는 LibreSSL 버전에서 비롯됨
- macOS에서 Apple 제공 curl을 사용할 때
--cacert기반 검증 결과는 오픈소스 빌드 curl과 다를 수 있음