심각한 보안: GnuTLS는 OpenSSL을 따르고, 타이밍 공격 버그 수정

심각한 보안: GnuTLS는 OpenSSL을 따르고, 타이밍 공격 버그 수정

소스 노드 : 1956368

지난 주에 우리는 다음과 같은 내용에 대해 글을 썼습니다. 메모리 관리 버그 이는 널리 사용되는 OpenSSL 암호화 라이브러리의 최신 보안 업데이트에서 수정되었습니다.

이러한 메모리 버그와 함께 우리는 더빙된 버그에 대해서도 보고했습니다. CVE-2022-4304: RSA 암호 해독에서 Oracle 타이밍.

이 버그에서는 서버에서 동일한 암호화된 메시지를 반복해서 실행하지만 데이터 끝의 패딩을 수정하여 데이터를 유효하지 않게 만들고 그에 따라 일종의 예측할 수 없는 동작을 유발합니다.

...프로세스의 데이터 전송 부분에 걸리는 시간을 안정적으로 추측할 수 있는 네트워크의 대상에 가깝다고 가정하면 일관된 시간이 걸리지 않습니다.

모든 데이터가 동일하게 처리되는 것은 아닙니다.

요청을 실행하고 응답에 걸리는 시간을 측정하고 낮은 수준의 네트워크 데이터 전송 및 수신에 소비된 시간을 빼면 서버가 요청을 처리하기 위해 내부 계산을 수행하는 데 걸린 시간을 알 수 있습니다. .

네트워크에서 얼마나 많은 시간이 소모되는지 확실하지 않더라도 많은 요청을 실행하고 많은 샘플을 수집하여 왕복 시간의 변화를 찾을 수 있습니다.

네트워킹 오버헤드가 대체로 일정하다고 가정할 만큼 네트워크가 신뢰할 수 있는 경우 통계적 방법을 사용하여 어떤 종류의 데이터 수정으로 인해 어떤 종류의 추가 처리 지연이 발생하는지 추론할 수 있습니다.

이를 통해 반복되는 각 요청 내에서 비밀로 유지되어야 하는 암호화되지 않은 원래 데이터의 구조 또는 내용에 대해 많은 것을 추론할 수 있습니다.

XNUMX바이트의 일반 텍스트만 추출할 수 있다고 해도 그런 일은 일어나지 않습니다.

소위 타이밍 공격 단 XNUMX바이트의 일반 텍스트 데이터를 복구하기 위해 수백만 개의 가짜 패킷을 보내고 시간을 맞춰야 하는 경우에도 이러한 종류의 작업은 항상 문제가 됩니다.

...네트워크는 불과 몇 년 전보다 더 빠르고 예측 가능하며 훨씬 더 많은 로드를 처리할 수 있기 때문입니다.

예를 들어 다음 한 시간 내에 스팸 메일을 보내는 수백만 개의 위험한 패킷이 일종의 엄지 손가락처럼 눈에 띌 것이라고 생각할 수도 있습니다.

그러나 "평소보다 많거나 적은 시간당 백만 개의 패킷"은 더 이상 특별히 큰 변화가 아닙니다.

GnuTLS의 유사한 "oracle" 버그

글쎄요, OpenSSL의 최종 수정 버그 타이밍 버그를 보고한 사람이 다음과 같은 내용도 보고했습니다. GnuTLS의 유사한 버그 거의 동시에.

여기에는 버그 식별자가 있습니다. CVE-2023-0361.

GnuTLS는 OpenSSL만큼 널리 사용되거나 널리 사용되지는 않지만 IT 자산이나 심지어 자신의 컴퓨터에 FFmpeg, GnuPG, Mplayer, QEMU를 포함하여 이를 사용하거나 포함하는 여러 프로그램이 있을 수 있습니다. , Rdesktop, Samba, Wget 및 Wireshark.

아이러니하게도 GnuTLS의 타이밍 결함은 애초에 타이밍 공격 오류를 기록해야 하는 코드에서 나타났습니다.

코드 차이에서 볼 수 있듯이 (diff) 아래에서 프로그래머는 조건부(if ... then) 암호 해독 오류를 확인하고 처리하는 데 사용되는 작업은 타이밍 변화를 일으킬 수 있습니다. 왜냐하면 CPU는 일반적으로 "분기" 명령 이후에 코드가 진행되는 방식에 따라 시간이 다르기 때문입니다.

(CPU는 성능 향상을 위해 반복적으로 실행되는 코드를 기억하거나 캐시하는 경향이 있으므로 자주 사용되지 않는 코드 실행이 감지할 수 없을 만큼 느려지기 때문에 한 방향으로 자주 가고 다른 방향으로 거의 이동하지 않는 분기의 경우 특히 그렇습니다.)

3.7.8와 gnutls-3.7.9/lib/auth/rsa.c의 코드 차이점

그러나 프로그래머는 여전히 공격이 발생할 수 있음을 기록하고 싶었습니다. if (ok) 위의 테스트가 실패하고 다음으로 분기됩니다. else { ... } 안내

이 시점에서 코드는 _gnutls_debug_log() 이 기능은 작업을 수행하는 데 꽤 오랜 시간이 걸릴 수 있습니다.

따라서 코더는 의도적으로 호출을 삽입했습니다. _gnutls_no_log() FBI 증오 범죄 보고서 then { ... } "공격"이 없을 때 이를 기록하는 척하는 코드의 일부는 코드가 어느 방향으로든 소비하는 시간을 균일하게 만들기 위해 시도합니다. if (ok) 분기 명령이 필요할 수 있습니다.

그러나 분명히 두 코드 경로는 사용한 시간이 충분히 유사하지 않았습니다(또는 아마도 _gnutls_debug_log() 기능 자체로는 다양한 종류의 오류를 처리하는 데 있어 일관성이 충분하지 않았으며 공격자는 백만 번 정도 시도한 후에 암호 해독 정보를 구별하기 시작할 수 있습니다.

무엇을해야 하는가?

당신이 프로그래머라면: 여기서의 버그 수정은 간단했으며 "적은 것이 더 많다"는 원칙을 따랐습니다.

어차피 별로 유용한 공격 탐지 데이터를 제공하지 않는 것으로 판단된 위의 분홍색 코드는 빌드 설정에 관계없이 존재하지 않는 코드가 실수로 컴파일될 수 없다는 이유로 단순히 삭제되었습니다…

...그리고 컴파일되지 않은 코드는 우연이든 의도적이든 절대 실행될 수 없습니다.

GnuTLS 사용자인 경우: 최근에 출시된 버전 3.7.9 그리고 '신제품 맛' 3.8.0 다양한 다른 수정 사항과 함께 이 수정 사항이 포함되어 있어야 합니다.

Linux 배포판을 실행 중인 경우 중앙에서 관리되는 GnuTLS 공유 라이브러리 버전에 대한 업데이트와 자체 버전을 가져오는 앱이 있는지 확인하세요.

Linux에서는 이름이 다음과 같은 파일을 검색하세요. libgnutls*.so 주변에 있는 공유 라이브러리를 찾고 검색해 보세요. gnutls-cli 라이브러리에 자주 포함되는 명령줄 유틸리티의 복사본을 찾으려면

당신은 실행할 수 있습니다 gnutls-cli -vv 어떤 버전인지 알아보기 위해 libgnutls 다음 항목에 동적으로 연결됩니다.

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- 내 Linux 배포판이 지난 금요일(2023-02-10)에 업데이트를 받았습니다.

타임 스탬프 :

더보기 노출 된 보안