Heartbleed: OpenSSL 버전을 안정적이고 이식 가능하게 확인하는 방법은 무엇입니까?

Heartbleed: OpenSSL 버전을 안정적이고 이식 가능하게 확인하는 방법은 무엇입니까?

나는 GNU/Linux 및 기타 시스템에서 OpenSSL 버전을 확인하는 안정적이고 이식 가능한 방법을 찾고 있었습니다. 이를 통해 사용자는 Heartbleed 버그로 인해 SSL을 업그레이드해야 하는지 쉽게 알 수 있습니다.

쉬울 것이라고 생각했지만 최신 OpenSSL 1.0.1g가 설치된 Ubuntu 12.04 LTS에서 문제가 빠르게 발생했습니다.

openssl 버전 -a

정식 버전을 기대했지만 대신 다음과 같은 결과를 얻었습니다.

OpenSSL 1.0.1 2012년 3월 14일
구축 날짜: 2013년 6월 4일 화요일 07:26:06 UTC
플랫폼: [...]

놀랍게도 버전 문자가 표시되지 않습니다. f도 없고 g도 없고 그냥 "1.0.1"만 있으면 됩니다. 나열된 날짜는 취약한 (비)버전을 찾는 데도 도움이 되지 않습니다.

1.0.1(af)과 1.0.1g의 차이가 중요합니다.

질문:

  • 버전을 확인하는 신뢰할 수 있는 방법은 무엇입니까(가급적이면 교차 배포판입니까?)
  • 처음에 버전 문자가 표시되지 않는 이유는 무엇입니까? Ubuntu 12.04 LTS 이외의 다른 버전에서는 이것을 테스트할 수 없었습니다.

다른 사람들도 이 동작을 보고하고 있습니다. 몇 가지 예:

일부 (배포판별) 제안 사항은 다음과 같습니다.

  • 우분투와 데비안: apt-cache policy openssl그리고 apt-cache policy libssl1.0.0. 여기에서 버전 번호를 패키지와 비교하세요.http://www.ubuntu.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(트위터 @znmeb에게 감사드립니다) 및yum info openssl-libs

이전 버전의 OpenSSL이 아직 존재하는지 확인:

Ubuntu 및 Debian에서 OpenSSL 패키지를 업데이트하는 것만으로는 충분하지 않은 것으로 나타났습니다. 또한 libssl1.0.0 패키지를 업데이트한 다음 표시되는지 확인해야 openssl version -a합니다 built on: Mon Apr 7 20:33:29 UTC 2014.

답변1

OpenSSL 버전에 표시된 날짜를 기준으로 볼 때~이다거기에 표시된 정식 버전을 확인하세요.

Open SSL 1.0.1은 2012년 3월 14일에 출시되었습니다.. 1.0.1a는 2012년 4월 19일에 출시되었습니다.

openssl version -a따라서 저는 이것이 시스템에 설치된 OpenSSL의 전체 버전을 표시하는 적절한 교차 배포판 방법이라고 주장하겠습니다 . 내가 액세스할 수 있는 모든 Linux 배포판에서 작동하는 것 같습니다.help.ubuntu.com OpenSSL 문서에서도 제안된 방법입니다.. Ubuntu LTS 12.04에는 뒤에 문자가 없기 때문에 축약 버전처럼 보이는 버전인 바닐라 OpenSSL v1.0.1이 함께 제공됩니다.

그렇게 말하면, 다음과 같은 것이 있는 것 같습니다.주요한Ubuntu의 버그(또는 OpenSSL을 패키지하는 방법)는 openssl version -aOpenSSL이 최신 버전으로 업그레이드되었는지 여부에 관계없이 2012년 3월 14일부터 원래 1.0.1 버전을 계속 반환합니다. 그리고 비가 오면 대부분의 경우처럼 비가 쏟아집니다.

Ubuntu는 모든 사람이 인식하는 업스트림 업데이트 및 버전 번호 지정에 의존하는 대신 OpenSSL(또는 다른 패키지)로 업데이트를 백포트하는 습관을 가진 유일한 주요 배포판은 아닙니다. 문자 버전 번호가 버그 수정과 보안 업데이트만을 나타내는 OpenSSL의 경우 이는 거의 이해하기 어려운 것처럼 보이지만,FIPS 검증주요 플러그인 Linux 배포판은 OpenSSL과 함께 패키지로 제공됩니다. 보안 허점을 막는 변경 사항을 비롯한 변경으로 인해 발생하는 재검증 관련 요구 사항으로 인해 버전이 잠겨 있습니다.

예를 들어 Debian에서 고정 버전은 1.0.1e-2+deb7u5업스트림 버전 대신 버전 번호를 표시합니다 1.0.1g.

그 결과, 이때,Linux 배포판에서 SSL 버전을 확인할 수 있는 안정적이고 이식 가능한 방법은 없습니다., 왜냐하면 그들은 모두 서로 다른 버전 번호 지정 체계를 사용하여 자체적으로 백포트된 패치와 업데이트를 사용하기 때문입니다. 실행 중인 각 Linux 배포판에 대해 고정된 버전 번호를 찾아보고 해당 배포판의 특정 버전 번호와 비교하여 설치된 OpenSSL 버전을 확인하여 서버가 취약한 버전을 실행하고 있는지 확인해야 합니다.

답변2

진정한 크로스 플랫폼을 원한다면,버전 번호에 의존하기보다는 취약점 자체를 확인하십시오.

취약한 것으로 알려진 버전 번호를 보고하는 코드가 있을 수 있습니다.하지만 실제 코드는 취약하지 않습니다.. 그리고 그 반대의 경우(조용히 취약한 코드)는 더욱 악화될 수 있습니다!

OpenSSL 및 OpenSSH와 같은 오픈 소스 제품을 번들로 제공하는 많은 공급업체는 API 안정성과 예측 가능성을 유지하기 위해 이전 버전의 코드에 대한 긴급 수정 사항을 선택적으로 개조합니다. 이는 "장기 릴리스" 및 어플라이언스 플랫폼의 경우 특히 그렇습니다.

그러나 자체 버전 문자열 접미사를 추가하지 않고 이를 자동으로 수행하는 공급업체는 취약점 스캐너에서 오탐지를 유발하고 사용자를 혼란스럽게 할 위험이 있습니다. 따라서 이를 투명하고 검증 가능하게 만들기 위해 일부 공급업체는 주요 패키지 버전에 자체 문자열을 추가합니다. Debian(OpenSSL)과 FreeBSD(OpenSSH에서 VersionAddendumsshd_config 지시문을 통해) 모두 때때로 이 작업을 수행합니다.

이를 수행하지 않는 공급업체는 아마도 다른 프로그램이 버전 번호를 확인하는 직간접적인 여러 방법으로 인해 손상될 가능성을 최소화하기 위해 그렇게 할 것입니다.

따라서 다음과 같이 보일 수 있습니다.

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

$ openssl version
OpenSSL 1.0.1 14 Mar 2012

... 일지라도패치됐어:

$ dpkg -l openssl | grep openssl
ii  openssl  1.0.1-4ubuntu5.12  [truncated]

$ ls -la `which openssl`
-rwxr-xr-x 1 root root 513208 Apr  7 12:37 /usr/bin/openssl

$ md5sum /usr/bin/openssl
ea2a858ab594905beb8088c7c2b84748  /usr/bin/openssl

이와 같은 상황이 발생하면 다음이 더 좋습니다.버전 번호를 믿지 마세요.

답변3

안타깝게도 거기까지는 잘 모르겠습니다~이다이를 수행하는 크로스 플랫폼 방식입니다.제가 블로그 포스팅에서 논의한 것처럼, Ubuntu 12.04에 표시되는 OpenSSL 버전은 수정된 버전으로 업그레이드한 후에도 1.0.1로 유지됩니다.

Ubuntu 12.04의 경우에만 아래 사항이 모두 사실인지 업데이트되었는지 알 수 있습니다.

  1. dpkg -s openssl | grep Version버전 1.0.1-4ubuntu5.12 이상을 표시합니다.
  2. dpkg -s libssl1.0.0 | grep Version버전 1.0.1-4ubuntu5.12 이상을 표시합니다.
  3. openssl version -a"작성" 날짜가 2014년 4월 7일 이후로 표시됩니다.

추가 정보를 제공해 주신 @danny에게 감사드립니다.

답변4

이 스크립트 중 하나가 모든 서비스를 테스트합니까, 아니면 테스트만 수행합니까?HTTPS?AFAIK,포스트그레SQL취약하지만 내부 공격이 표면화되기 전까지는 소문일 뿐입니다.

이있다메타스플로잇사용할 수 있는 스크립트입니다.

https://github.com/rapid7/metasploit-framework/commit/dd69a9e5dd321915e07d8e3dc8fe60d3c54f551a

이것을 입력할 수 있습니다(다음으로 테스트됨).GnuWin32OpenSSL 바이너리 버전 1.0.1.6, 날짜: 2014-01-14) 또는 이 항목 아래 주석에 있는 스크립트를 사용하세요. 더 정확하고 간단해요!

s_client -connect a23-75-248-141.deploy.static.akamaitechnologies.com:443 -debug -state

B 유형에 연결되면 취약한 호스트에 표시되며 연결이 끊어지지 않습니다.

B

HEARTBEATING
write to 0x801c17160 [0x801cbc003] (66 bytes => 66 (0x42))
0000 - 18 03 03 00 3d 8f 6f 3c-52 11 83 20 9c a2 c0 49   ....=.o 5 (0x5))
0000 - 18 03 03 00 3d                                    ....=
read from 0x801c17160 [0x801cb7008] (61 bytes => 61 (0x3D))
0000 - 05 4d f5 c0 db 96 d1 f5-c7 07 e5 17 1f 3b 48 34   .M...........;H4
0010 - 6e 11 9d ba 10 0c 3a 34-eb 7b a5 7c c4 b6 c0 c0   n.....:4.{.|....
0020 - b0 75 0e fe b7 fa 9e 04-e9 4e 4a 7d 51 d3 11 1f   .u.......NJ}Q...
0030 - e2 23 16 77 cb a6 e1 8e-77 84 2b f8 7f            .#.w....w.+..
read R BLOCK

이와 유사한 하트비트 응답을 받게 됩니다.

패치가 적용된 호스트에서는 아래와 유사한 응답이 표시되고 연결이 끊어집니다.

B를 입력하세요

HEARTBEATING
write to 0x801818160 [0x8019d5803] (101 bytes => 101 (0x65))
0000 - 18 03 03 00 60 9c a3 1e-fc 3b 3f 1f 0e 3a fe 4c   ....`....;?..:.L
0010 - a9 33 08 cc 3d 43 54 75-44 7d 2c 7b f3 47 b9 56   .3..=CTuD},{.G.V
0020 - 89 37 c1 43 1c 80 7b 87-66 ff cb 55 5f 8d 1a 95   .7.C..{.f..U_...
0030 - 1b 4c 65 14 21 a1 95 ac-7a 70 79 fc cc a0 cf 51   .Le.!...zpy....Q
0040 - 0f 7e c5 56 14 c8 37 c1-40 0b b8 cb 43 96 8a e6   [email protected]...
0050 - 21 42 64 58 62 15 fb 51-82 e6 7f ef 21 1b 6f 87   !BdXb..Q....!.o.
0060 - b9 c2 04 c8 47                                    ....G

원천:

다음과 같은 도구도 있습니다.

관련 정보