ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenSSL 프로젝트의 버전은 왜 1.x.x 다음이 3.x.x 일까
    기술 소식 2022. 11. 15. 19:40

    오랫만에 Critical CVE가 나온다고 해서 긴장하며 기다리다가 3버전으로 한정되고 그 영향 범위도 똑똑한 컴퓨터 덕분에 축소된 CVE를 보다보니까 그냥 든 생각이다.

     

    버전 체계는 프로젝트마다 다르지만, OpenSSL은 한가지 의문이 들만한 점이 있다.

     

    MAJOR.MINOR.FIX[PATCH] 로 구분하는 메이저 1버전. 예시로 1.1.1q

    MAJOR.MINOR.PATCH 로 구분하는 메이저 3버전. 예시로 3.0.7

     

    1버전은 메이저 버전과 마이너 버전 조합이 같을 때 API(ABI) 호환성을 보증한다. 즉, 1.0.2에서 1.1.1로 버전을 변경할 때 API 호환은 보증하지 않는다. 3버전은 같은 메이저 버전의 API(ABI) 호환성을 보증한다. 즉, 3.0.0에서 3.0.7으로 버전 변경 시 API 호환을 보증한다.

     

    1버전과 3버전의 버전 체계는 다르게 돌아간다. 그런데 여기서 한가지 의문이 생긴다.

     

    OpenSSL 2 버전은 어디로 간걸까?

     

    OpenSSL 공식 블로그의 안티오크의 신성한 수류탄(Matt Caswell) 이라는 글에서 밝히길, 미국의 정부나 계약기관에서 보편적으로 사용하는 연방 정보 처리 표준(Federal Information Processing Standards, 이하 FIPS) 를 구현한 모듈인 OpenSSL FIPS module 2 에서 2.0.0 이라는 버전을 사용하고 있기 때문에 메이저 2버전을 건너 뛴다(skip)고 한다. 굳이 진실을 따지는 이유보다는 API 버전이 2.0.0으로 표시하는 이 OpenSSL FIPS Module 2의 실체를 알아보기 위해 github에서 흔적을 쫓아가보자.

     

    우선 Configure 파일과 macros.h 파일을 찾아보면 OpenSSL 자체를 빌드할 땐 메이저 버전 2 를 배제함을 확인할 수 있다.

    Configure 파일 및 include/openssl/macros.h 파일

    정확히 찾아야하는 녀석의 실체를 알기 위해 배경을 검색해보자.

     

    우선 단서는 두개다. 미국 국립 표준 기술 연구소(National Institute of Standards and Technology, 이하 NIST)에서 암호 모듈을 검증하는 인증서와 OpenSSL 위키의 FIPS module 2.0 이다. 블로그의 글을 먼저 보고, 인증서의 내용을 유추해보면

    This 2.0 FIPS module is compatible with OpenSSL releases 1.0.1 and 1.0.2, and not with any other releases.
    FIPS 2.0 모듈은 OpenSSL 1.0.1과 1.0.2, 두 배포 버전과 호환됩니다. 그 외 배포 버전과는 호환되지 않습니다.

    FIPS 표준 중 OpenSSL은 암호에 대한 FIPS 140을 구현한다. 그렇다면 OpenSSL의 FIPS module 이라는 녀석의 버전은 어떻게 되는걸까? 위키에서 FIPS 3.0에 대한 내용을 어렵지 않게 찾을 수 있었다. 하지만 내용 자체가 많지 않고 연관 링크로 걸려 있는 글은 2018년도에 FIPS 140-2 에 대한 내용이었다. 보통 개발에 대한 글이 이런 모양새라면, 보나마나 완성하지 못했다는 뜻이니 방법을 바꾸어 구글에서 OpenSSL의 FIPS 140-3 에 대한 내용을 찾아보았다.

     

    운이 좋게도, 2022년 9월 30일에 작성된 FIPS 140-3 계획 이라는 글을 OpenSSL 공식 블로그에서 찾을 수 있었다. 글 내용은 대충 표준이 정해지고 요구사항이 정해지고 OpenSSL에 FIPS 140-3은 OpenSSL 3.1에 포함될것이고... 2024년까지는 완성할수 없단다!

     

    FIPS Module 3.0은 없다고 봐도 되겠다. 지금 배포하고 있는 FIPS Modules은 OpenSSL 3 과 함께 배포하고 있다.

     

    그렇다면 FIPS Module 2.0는 어디있는가.

     

    브랜치를 뒤져보니 cvs로 버전관리하던 FIPS 브랜치도 있었는데 이걸 제쳐두고 깃허브에서 조금 더더 찾아보니 OpenSSL FIPS가 의존하는 openssl을 클론 한 저장소도 있었다. 윈도우 7 32비트 환경에서 빌드하는 방법도 설명하고 있는데, openssl-fips-2.0.16.tar.gz 파일을 홈페이지에서 내려받으라고 한다. 하지만 링크에선 더이상 그 파일을 제공하지 않았고, 그 파일 이름을 찾아보니 openssl ftp에 올라와 있는 파일을 발견했다.

     

    openssl fips 2.0 을 빌드할 수 있는 형상을 찾은것같다. 하지만 나의 목적은 빌드가 아니고 버전을 대체 몇으로 명시하고 있느냐다. 소스를 뒤져본다.

     

    FIPS 모듈의 버전을 명시하는 헤더를 찾았는데 아까 위에서 확인한 버전 체계와 그렇게 유사한지는 모르겠지만 0x2001000FL 이라는 버전을 명시하고 있다.

     

    OpenSSL 재단 내에서는 저 버전을 메이저 2버전을 낸것과 비슷한 느낌으로 받아들이는 것 같다.

     

    내 한계는 여기까지인가보다. 더 이상 무언가 쫓아갈 단서가 없어서 여기서 결론을 지으려고 한다.

     

    OpenSSL 1버전과 3버전 사이에는 FIPS 인증하는 모듈이 있는데 그 내부의 버전이 2로 명시되어서 마치 OpenSSL 2 처럼 다루니 OpenSSL 2버전은 넘어간다!

Designed by Tistory.