제퍼넷 로고

OpenSSL은 이전 bugfix에 대한 bugfix를 발행합니다.

시간

OpenSSL 사용자라면 아마도 가장 최근의 세간의 이목을 끄는 버그수정 2022년 XNUMX월에 나온 릴리스입니다.

그 수정은 우리에게 OpenSSS를 가져왔습니다 3.0.21.1.1n, 제품의 현재 완전히 지원되는 두 가지 버전에 대한 업데이트입니다.

(레거시 버전인 1.0.2가 있지만 해당 버전의 업데이트는 프리미엄 지원을 지불하는 고객만 사용할 수 있으며 1.0.2 이후 제품의 변경 사항 및 개선 사항을 감안할 때 지원 비용을 계속 지불할 계획이라면 주류 버전도 – 아마도 특히 –.)

2022년 XNUMX월 업데이트는 특히 해당 코드가 복잡하고 전문화된 저수준 기능의 일부인 경우 특이한 버그가 있는 깊이 묻힌 코드가 결국 몇 년 동안 간과될 수 있음을 상기시키는 중요한 알림이었습니다.

로 알려진 것을 계산하기 위한 특수 목적 알고리즘과 관련하여 당시 수정된 버그 모듈식 제곱근, 일반 제곱근보다 계산하기가 더 복잡합니다.

불행히도 1890년대에 처음 발견된 알고리즘을 사용하여 이 계산을 수행하는 코드는 서투르게 코딩되고, 구식으로 작성되었으며, 제대로 주석 처리되지 않았으며, 따르기 어려웠습니다.

그러나 OpenSSL의 명백한 "외부 대면" 부분에 있지 않고 다시 작성하는 것이 어려운 작업이었다는 점을 감안할 때 답변의 정확성에 대해 주의 깊게 테스트되었다고 가정합니다. 잘 구성된 숫자이지만 예상 밖의 입력에 직면했을 때 그 견고성에 대해 조사되지 않았습니다.

잘못된 형식의 숫자를 생성하기 위해 부비 트랩된 디지털 인증서에 직면했을 때 OpenSSL은 BN_mod_sqrt() 함수는 존재하지 않는 답변에 접근하려고 시도하면서 영원히 반복되도록 속일 수 있습니다.

정수로만 작업하고 모든 종류의 분수를 허용하지 않을 때 많은 정수에 일반 제곱근이 없는 것처럼 많은 숫자에 모듈식 제곱근이 없다는 것을 알 수 있습니다. 따라서 7×7 = 49, 따라서 49는 정수인 제곱근, 즉 7을 갖습니다. 그러나 다음 "완전제곱"이 50×51이기 때문에 8 또는 8을 주기 위해 자체적으로 곱할 수 있는 정수는 없습니다. = 64. 원하는 만큼 시도할 수 있지만 √51에 대한 정수 답은 절대 찾을 수 없습니다.

실제로 틀린 적이 없고 단지 불완전할 뿐입니다.

다시 말해 OpenSSL의 BigNumber 코드(많은 암호화 알고리즘은 수백 또는 수천 자릿수 길이의 숫자 작업에 의존) 잘못 답이 없으면 찾을 답이 없다는 것을 깨닫지 못하고 무한 루프에 빠지기도 합니다.

이 무한 루프는 서비스 거부 악의적인 웹사이트가 부비 트랩된 디지털 인증서를 통해 전송되는 경우 공격(DoS)이 트리거될 수 있습니다.

이는 아이러니하게도 디지털 인증서 유효성 검사에 세심한 소프트웨어가 이 버그를 통해 무릎을 꿇을 수 있음을 의미했습니다. CVE-2022-0778, 인증서 유효성 검사에 전혀 신경 쓰지 않는 프로그램은 영향을 받지 않았습니다.

이 버그에 의해 밝혀진 중요한 "가르칠 수 있는 순간"을 감안할 때 우리는 Naked Security에서 뿐만 아니라 자세히 다루었습니다. 더 나은 스타일의 코드를 작성하는 방법, 뿐만 아니라 Sophos News에서 SophosLabs가 부비트랩된 인증서가 결함을 유발할 수 있는 방법에 대한 끔찍한 세부 사항을 보여주었습니다. 버그를 이해하기 위해 코드를 디버그하는 방법.

그 동안 두 개의 보안 구멍이 더 있습니다.

다음 OpenSSL 업데이트는 3.0.31.1.1o 주요 결함으로 간주되지 않는 버그를 패치한 이전 릴리스의 사용자를 위해(적어도 Naked Security에서는 다루지 않았습니다), 주로 버그가 OpenSSL 암호화 라이브러리 코드 자체에 없었기 때문입니다.

암호화 공급자로 OpenSSL에 의존하는 모든 소프트웨어에 영향을 주는 대신, CVE-2022-1292 OpenSSL 툴킷과 함께 제공되는 Perl로 작성된 유틸리티 스크립트에 영향을 미쳤습니다.

로 알려진 이 스크립트는 c_rehash ( 인증서 디렉토리 재해시)는 Mozilla에서 신뢰할 수 있는 인증 기관(CA)으로 유지 관리하는 것과 같은 암호화 인증서 파일의 디렉토리를 가져오고 소프트웨어가 검색보다 더 빨리 특정 인증서를 찾는 데 도움이 될 수 있는 파일 해시 목록을 생성하는 잘 알려지지 않은 도구입니다. 이름의 알파벳순 목록.

예를 들어, Mozilla의 CA 인증서 디렉토리는 다음과 같습니다.

$ ls -l /usr/share/ca-certificates/mozilla -rw-r--r-- 오리 오리 1마리 2772 2022-06-23 05:32 ACCVRAIZ1.crt -rw-r--r-- 오리 오리 1마리 1972 2022-06-23 05:32 AC_RAIZ_FNMT-RCM.crt -rw-r--r-- 1 오리 오리 904 2022-06-23 05:32 AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.crt [. . .] -rw-r--r-- 오리 1마리 1302 2022-06-23 05:32 emSign_Root_CA_-_G1.crt -rw-r--r-- 오리 1마리 774 2022-06-23_05:32 vTrus_ECC_Root .crt -rw-r--r-- 1 오리 오리 1911 2022-06-23 05:32 vTrus_Root_CA.crt

… 반면 OpenSSL은 c_rehash 스크립트는 파일 이름이 아닌 인증서 자체의 발급자 이름을 기반으로 해시를 통해 개별 인증서를 찾을 수 있도록 하는 기호 링크 목록을 생성합니다.

lrwxrwxrwx 1 Duck Duck 23 2022-06-24 13:41 002c0b4f.0-> globalsign_root_r46.crt lrwxrwxrwx 1 Duck Duck 45 2022-06-24 13:41 02265526.0-> ENTRUST_ROOT_CERTOFICATION_AUTCOTION -2 1:36 2022a06 -> Staat_der_Nederlanden_EV_Root_CA.crt [. . .] lrwxrwxrwx 24 오리 오리 13 41-03179-64.0 1:19 fe2022a06cd24 -> SZAFIR_ROOT_CA13.crt lrwxrwxrw41 8 오리 오리 2 8.0-2-1 23:2022 f. -06-24 13:41 ff413.0af46f.1 -> TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_49.crt

일부 소프트웨어는 이러한 "해시 링크"를 사용하여 특정 인증서를 인덱싱하고 찾기 위한 일종의 기본 데이터베이스 시스템 역할을 합니다.

또한 일부 운영 체제 배포판은 자동으로 c_rehash 이러한 특수 목적 링크를 최신 상태로 유지하려면 백그라운드에서 스크립트를 실행하십시오.

유해한 것으로 간주되는 쉘 메타 문자

불행히도 스크립트는 Perl에 의존했습니다. system() 파일 해시를 계산하는 함수(또는 동등한 명령) system() 시스템은 Bash와 같은 명령 셸을 자동으로 시작하여 필요한 하위 프로그램을 시작합니다.

그리고 아마 아시다시피 명령 셸은 항상 명령줄 인수를 문자 그대로 처리하지 않으므로 해당 인수에 특수 문자를 넣으면 셸이 잠재적으로 위험한 방식으로 이를 처리합니다.

예를 들어, 명령 echo runthis 문자 그대로 텍스트를 인쇄합니다. runthis, 하지만 명령 echo $(runthis) 문자를 직접 인쇄하지 않습니다 $(runthis).

대신, 소위 메타 명령 $(runthis) 방법 명령 대체, 그래서 "명령을 실행하십시오. runthis 교체 $(...) 완료되면 해당 명령의 출력과 함께 부분을 수행합니다.":

   # 문자 그대로 처리된 인수, 메타 문자를 찾을 수 없음 $ echo runthis runthis # 'runthis'를 실행하려고 시도하지만 그러한 명령이 존재하지 않습니다. $ echo $(runthis) -bash: runthis: command not found # 두 개의 명령을 실행하고, 두 개의 출력을 수집합니다. $ echo $(whoami; uname -s -r) 오리 리눅스 5.18.6

로 인한 위험이 있는 경우 $(...) 친숙하게 들립니다. 왜냐하면 최근에 악용된 메타 명령 취약점이기 때문입니다. Windows의 "Folina" 버그. 자세히 알아보고 버그가 실제로 작동하는지 보려면 녹화된 웨비나를 시청하세요. 아래 이미지를 클릭하시면 됩니다. [회원가입 필수, 이후 바로 입장 가능합니다.]

무엇이 수정되었나요?

다른 사람의 신뢰할 수 없는 입력을 받아들이는 스크립트(웹 양식에 입력된 문자열이든 외부에서 제공한 구성 파일 이름이든)는 명령에 의존할 때 이러한 특수 메타 명령이 쉘 인수로 누출되지 않도록 매우 주의해야 합니다. 외부 유틸리티를 실행하기 위한 셸.

아래에서 변경된 코드를 볼 수 있습니다. 1.1.1n1.1.1o:

형식의 Perl 명령 `...` (백틱 사이의 명령, `runthis`는 단순히 구식으로 작성하는 방법입니다. $(runthis) 명령 대체) 라는 전용 내부 기능으로 대체되었습니다. compute_hash 생성된 명령 문자열에서 이상한 메타 문자에 더 많은 주의를 기울입니다.

글쎄요, 메인테이너는 이 유틸리티 스크립트에서 적절한 주의와 주의 없이 외부 명령이 실행되는 모든 위치를 파악하지 못한 것으로 나타났습니다.

따라서 이번 주 석방을 보았다 OpenSSL의 3.0.41.1.1p, 다른 위험한 시스템 명령을 수정하려면 c_rehash 유용:

이번에는 외신이었다. cp 셸 기반을 통한 (파일 복사) 명령 system() 라는 더 안전한 전용 내부 기능으로 대체된 기능 copy_file.

이 버그 수정에는 공식 식별자가 있습니다. CVE-2022-2068.

OpenSSL 변경 로그는 다음과 같이 경고합니다.

[ c_rehash] 스크립트는 일부 운영 체제에서 자동으로 실행되는 방식으로 배포됩니다. 이러한 운영 체제에서 공격자는 스크립트 권한으로 임의의 명령을 실행할 수 있습니다.

무엇을해야 하는가?

  • 가능한 한 빨리 OpenSSL을 업데이트하십시오. 중앙에 설치된 복사본을 관리하기 위해 Linux 배포판에 의존하는 경우 배포판 제조업체에 자세한 내용을 문의하세요. 시스템 전체가 아닌 자체 OpenSSL 빌드에 의존하는 경우 해당 복사본도 업데이트하는 것을 잊지 마십시오. 당신은 찾고 있습니다 3.0.4 or 1.1.1p. 운영 openssl version 가지고 있는 버전을 확인합니다.
  • 은퇴를 고려하다 c_rehash 유틸리티를 사용하는 경우. 올인원 유틸리티 openssl, 처음에는 인증서를 생성하고 서명하는 데 일반적으로 사용되며 이제 라는 기본 제공 하위 명령이 포함됩니다. rehash 같은 일을 하기 위해. 노력하다 openssl rehash -help 자세한 내용은.
  • 입력 및 출력을 소독하십시오. 수신한 입력을 있는 그대로 사용하는 것이 안전하다고 가정하지 말고 코드의 다른 부분에 출력으로 전달하는 데이터에 주의하십시오.
  • 특정 유형의 버그에 대한 코드를 검토할 때 여러 오류에 주의하십시오. 부주의한 프로그래머 system() 코드의 한 위치에 있는 명령이 다른 곳에서도 유사한 실수를 범했을 수 있습니다.

프로그래머는 종종 완전히 결백하고 이해할 수 있는 이유로 같은 종류의 버그를 여러 번 생성(또는 재현)합니다.

코드 작업 당시 버그 클래스를 인식하지 못했거나 프로토타입 작업의 속도를 높이기 위해 "임시 지름길"을 사용했지만 나중에 돌아가서 정리하지 않았거나 누군가를 복사하여 붙여넣었습니다. 다른 사람의 결함 있는 코드를 자신의 것으로 만들었습니다...


spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?