Heartbleed: làm thế nào để kiểm tra phiên bản OpenSSL một cách đáng tin cậy và hợp lý?


88

Tôi đã xem xét một cách đáng tin cậy và di động để kiểm tra phiên bản OpenSSL trên GNU / Linux và các hệ thống khác, vì vậy người dùng có thể dễ dàng khám phá liệu họ có nên nâng cấp SSL vì lỗi Heartbleed hay không.

Tôi nghĩ rằng nó sẽ dễ dàng, nhưng tôi đã nhanh chóng gặp sự cố trên Ubuntu 12.04 LTS với OpenSSL 1.0.1g mới nhất:

phiên bản openssl -a

Tôi đã mong đợi để xem một phiên bản đầy đủ, nhưng thay vào đó tôi đã nhận được điều này:

OpenSSL 1.0.1 14 tháng 3 năm 2012
được xây dựng trên: Thứ ba ngày 4 tháng 6 07:26:06 UTC 2013
nền tảng: [...]

Trước sự ngạc nhiên khó chịu của tôi, thư phiên bản không hiển thị. Không có f, không có g ở đó, chỉ "1.0.1" và đó là nó. Ngày được liệt kê cũng không hỗ trợ trong việc khám phá phiên bản (không) dễ bị tổn thương.

Sự khác biệt giữa 1.0.1 (af) và 1.0.1g là rất quan trọng.

Câu hỏi:

  • Một cách đáng tin cậy để kiểm tra phiên bản, tốt nhất là phân phối chéo là gì?
  • Tại sao chữ cái phiên bản hiển thị ở vị trí đầu tiên? Tôi không thể kiểm tra điều này trên bất cứ thứ gì khác ngoài Ubuntu 12.04 LTS.

Những người khác đang báo cáo hành vi này là tốt. Một vài ví dụ:

Một số gợi ý (cụ thể) được đưa vào:

  • Ubuntu và Debian: apt-cache policy opensslapt-cache policy libssl1.0.0. So sánh số phiên bản với các gói ở đây: http://www.ubfox.com/usn/usn-2165-1/
  • Fedora 20: yum info openssl(cảm ơn @znmeb trên twitter) vàyum info openssl-libs

Kiểm tra xem phiên bản cũ hơn của OpenSSL có còn tồn tại không:

Hóa ra việc cập nhật gói OpenSSL trên Ubuntu và Debian không phải lúc nào cũng đủ. Bạn cũng nên cập nhật gói libssl1.0.0 và kiểm tra xem có openssl version -acho biết không built on: Mon Apr 7 20:33:29 UTC 2014.


2
ít nhất hãy chắc chắn rằng phiên bản OpenSSL mà bạn không có g vì ngày nó hiển thị
Pato Sáinz

3
Điều này hoạt động trên CentOS[root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013
Jacob

1
@ PatoSáinz Tôi đã kiểm tra apt-cache policy opensslvà nó đã trả lời: Installed: 1.0.1-4ubuntu5.12đó là 1.0.1g vừa được Ubuntu phát hành cho 12.04 LTS. Tôi đã đăng xuất và đăng nhập lại. Tôi có thể làm gì khác để xác minh không?
Martijn

1
Tôi sẽ chỉ ra, vì điều đó không biết, trong trường hợp nó hữu ích ... Ubuntu 12.04 LTS được vận chuyển với OpenSSL 1.0.1 (vanilla).
HoplessN00b

1
Nếu ngày xây dựng đó là chính xác, bạn không thể có mã "phát hành phiên bản" gần đây hơn 1.0.1e, vì 1.0.1f xuất hiện vào năm 2014 theo ghi chú phát hành OpenSSL 1.0.1 . Dĩ nhiên, các dòng hoặc phần riêng lẻ đã được nhập vào phiên bản Ubuntu của bạn trước khi phát hành OpenSSL 1.0.1f chính thức. Và ngày xây dựng có thể ít hơn mà hoàn toàn hữu ích.
Mật khẩu chống yếu

Câu trả lời:


66

Dựa vào ngày được hiển thị bởi phiên bản OpenSSL của bạn, có vẻ như bạn đang thấy phiên bản đầy đủ được hiển thị ở đó.

Open SSL 1.0.1 đã được phát hành vào ngày 14 tháng 3 năm 2012 . 1.0.1a được phát hành vào ngày 19 tháng 4 năm 2012.

Vì vậy, tôi sẽ tiếp tục và khẳng định rằng đó openssl version -alà cách phân phối chéo phù hợp để hiển thị phiên bản đầy đủ của OpenSSL được cài đặt trên hệ thống. Nó dường như hoạt động cho tất cả các bản phân phối Linux mà tôi có quyền truy cập và là phương pháp được đề xuất trong tài liệu trợ giúp Open.L Ubuntu.com . Ubuntu LTS 12.04 được vận chuyển với vanilla OpenSSL v1.0.1, đây là phiên bản trông giống như một phiên bản rút gọn, vì không có chữ cái nào theo sau nó.

Có nói rằng, có vẻ như có một lỗi lớn trong Ubuntu (hoặc cách họ đóng gói OpenSSL), trong đó openssl version -atiếp tục trả lại phiên bản 1.0.1 gốc từ ngày 14 tháng 3 năm 2012, bất kể OpenSSL có được nâng cấp lên hay không của các phiên bản mới hơn. Và, như với hầu hết mọi thứ khi trời mưa, nó đổ.

Ubuntu không phải là bản phân phối chính duy nhất trong thói quen nhập các bản cập nhật vào OpenSSL (hoặc các gói khác), dựa trên các bản cập nhật ngược dòng và đánh số phiên bản mà mọi người đều nhận ra. Trong trường hợp OpenSSL, trong đó các số phiên bản chữ cái chỉ đại diện cho sửa lỗi và cập nhật bảo mật, điều này có vẻ gần như không thể hiểu được, nhưng tôi đã được thông báo rằng điều này có thể là do các bản phân phối chính xác của Linux được phát hành với gói OpenSSL. Do các yêu cầu xung quanh việc xác nhận lại kích hoạt do bất kỳ thay đổi nào, thậm chí thay đổi các lỗ hổng bảo mật, nó đã bị khóa phiên bản.

Ví dụ: trên Debian, phiên bản cố định hiển thị số phiên bản 1.0.1e-2+deb7u5thay vì phiên bản ngược dòng của 1.0.1g.

Do đó, tại thời điểm này, không có cách nào đáng tin cậy, di động để kiểm tra các phiên bản SSL trên các bản phân phối Linux , bởi vì tất cả chúng đều sử dụng các bản vá và cập nhật backported của riêng chúng với các sơ đồ đánh số phiên bản khác nhau. Bạn sẽ phải tra cứu số phiên bản cố định cho từng bản phân phối Linux khác nhau mà bạn chạy và kiểm tra phiên bản OpenSSL đã cài đặt dựa trên đánh số phiên bản cụ thể của bản phân phối đó để xác định xem máy chủ của bạn có chạy phiên bản dễ bị tấn công hay không.


3
Cài đặt của tôi là Ubuntu 12.04 LTS đơn giản mà không cần bất cứ thứ gì tôi tự biên soạn hoặc tải xuống từ các nguồn khác ngoài kho lưu trữ Ubuntu. Nếu Ubuntu đang phân phối OpenSSL với số phiên bản rút gọn, thì đó openssl version -akhông phải là phương thức di động (ít nhất là không di động được với Ubuntu). Tôi đã kiểm tra apt-cache policy opensslvà nó đã trả lời: Installed: 1.0.1-4ubuntu5.12đó là 1.0.1g vừa được Ubuntu phát hành cho 12.04 LTS. Tôi đăng xuất và đăng nhập lại trước khi kiểm tra.
Martijn

19
HoplessN00b, không có gì đáng nghi ngờ về chính sách sửa lỗi backport thay vì các phiên bản va chạm; đó là một cách rất tốt để đảm bảo sự ổn định của nền tảng, rất được mong đợi trong môi trường máy chủ. Giống như bất kỳ quyết định nào, nó có hậu quả, mà người dùng cần phải nhận thức được; nhưng chỉ vì nó phá vỡ dòng lý luận " Tôi đang chạy foo xyz nên tôi không dễ bị khai thác mới nhất ", điều đó không làm cho nó trở thành một điều xấu.
MadHatter

10
@towo Số phiên bản tồn tại vì một lý do. Nếu chúng ta chỉ tặc số phiên bản ngược dòng ra khỏi cửa sổ vì "enterprisey", hoặc bất cứ điều gì, tại sao lại bận tâm với số phiên bản? Cũng có thể chỉ cần bắt đầu đặt tên tất cả các công cụ của chúng tôi với sự ám chỉ. Chúng ta có thể gọi các phiên bản OpenSSL dễ bị tổn thương là Holy Heartbleed và các phiên bản cố định Cicky Coagulant .
HoplessN00b

7
@ HoplessN00b Tôi nghĩ rằng bạn đang bị cuốn vào cái bẫy "cái này đã được sửa trong phiên bản XYZ", họ không tuân theo số phiên bản vì tất cả những gì được nhập vào phiên bản mới nhất đều là sửa lỗi và bảo mật. Nếu họ làm hỏng số phiên bản, bạn cũng sẽ mong đợi chức năng bổ sung .. "Tôi có OpenSSL v XYZ, tại sao tôi không có ECDHA ???? ..v.v". Nó có ý nghĩa khi bạn hiểu rằng đó chỉ là lỗi.
NickW

13
@NickW @Jubal @MadHatter điều với OpenSSL, tuy nhiên, đó là: After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter releases (e.g. 1.0.1a) can only contain bug and security fixes and no new features.Vì vậy, không có gì đạt được khi từ bỏ sơ đồ phiên bản ngược dòng; backporting các bản cập nhật về cơ bản giống như sử dụng phiên bản cập nhật, vì bản cập nhật chỉ bao gồm bảo mật và sửa lỗi. Những gì nó làm là gây nhầm lẫn mọi thứ và khiến chúng tôi không có cách nào để kiểm tra phiên bản OpenSSL trên các bản phân phối Linux.
HoplessN00b

18

Nếu bạn muốn một cái gì đó thực sự đa nền tảng, hãy kiểm tra lỗ hổng thay vì dựa vào số phiên bản.

Bạn có thể có mã báo cáo số phiên bản được biết là dễ bị tấn công, nhưng mã thực tế không dễ bị tấn công . Và ngược lại - mã dễ bị tổn thương âm thầm - có thể còn tồi tệ hơn!

Nhiều nhà cung cấp đóng gói các sản phẩm nguồn mở như OpenSSL và OpenSSH sẽ chọn lọc thêm các bản sửa lỗi khẩn cấp cho phiên bản mã cũ hơn, để duy trì tính ổn định và dự đoán API. Điều này đặc biệt đúng đối với "phát hành dài hạn" và nền tảng thiết bị.

Nhưng các nhà cung cấp làm điều này một cách âm thầm (không thêm hậu tố chuỗi phiên bản của riêng họ) có nguy cơ kích hoạt dương tính giả trong máy quét lỗ hổng (và gây nhầm lẫn cho người dùng). Vì vậy, để làm cho điều này minh bạch và có thể kiểm chứng, một số nhà cung cấp nối các chuỗi của riêng họ vào phiên bản gói chính. Cả Debian (OpenSSL) và FreeBSD (trong OpenSSH, thông qua VersionAddendumchỉ thị sshd_config) đôi khi làm điều này.

Các nhà cung cấp không làm điều này có thể đang làm như vậy để giảm thiểu khả năng bị hỏng do nhiều cách trực tiếp và gián tiếp mà các chương trình khác kiểm tra số phiên bản.

Vì vậy, nó có thể trông như thế này:

$ 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

... mặc dù nó đã được vá :

$ 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

Với những thứ như thế này, bạn sẽ tốt hơn nếu bạn không tin vào số phiên bản.


Rõ ràng rằng việc kiểm tra các phiên bản không dễ dàng và minh bạch như tôi hy vọng nó sẽ xảy ra. Kiểm tra lỗ hổng là đa nền tảng, nhưng cũng khó thực hiện hơn: bạn phải có PoC đáng tin cậy hoặc kiểm tra tiện dụng cho dịch vụ phần mềm dễ bị tổn thương cụ thể mà bạn đang chạy. Trong trường hợp này, tất cả bắt đầu với PoC cho Apache và nginx. Điều gì sẽ xảy ra nếu tôi chỉ sử dụng SMTP với SSL tại thời điểm đó và tôi muốn kiểm tra xem tôi có dễ bị tổn thương không? Cuối cùng, chúng tôi sẽ có các thử nghiệm cho hầu hết các dịch vụ, nhưng có thể mất một lúc.
Martijn

Martijn, đó là một điểm công bằng. Khi không có thử nghiệm, các phương pháp thứ cấp (như theo dõi tổng kiểm tra các nhị phân bị ảnh hưởng trên hệ thống đích của bạn) sẽ ít tối ưu hơn, nhưng có thể đủ tốt để hoàn thành công việc ... và sau đó chuyển sang đám cháy tiếp theo. :-)
Royce Williams

14

Thật không may, tôi không chắc chắn có một cách nền tảng để làm điều này. Như tôi đã thảo luận trong một bài đăng trên blog , phiên bản OpenSSL được hiển thị trên Ubuntu 12.04 REMAINS 1.0.1 sau khi nâng cấp lên phiên bản cố định.

Chỉ với Ubuntu 12.04, bạn có thể biết nếu bạn đã được cập nhật nếu tất cả những điều dưới đây là đúng:

  1. dpkg -s openssl | grep Version hiển thị phiên bản 1.0.1-4ubfox5.12 trở lên.
  2. dpkg -s libssl1.0.0 | grep Version hiển thị phiên bản 1.0.1-4ubfox5.12 trở lên.
  3. openssl version -a hiển thị ngày "được xây dựng" vào ngày 7 tháng 4 năm 2014 trở đi.

Cảm ơn @danny cho thông tin bổ sung.


2
Ok, trong trường hợp đó tôi phải thêm phiên bản gói đó 1.0.1-4ubuntu5.12CHỈ cho Ubuntu 12.04 LTS. Nếu bạn đang dùng Ubuntu 12.10, bạn sẽ thấy ít nhất phiên bản 1.0.1c-3ubuntu2.7và nếu bạn dùng phiên bản 13.10 thì đó phải là phiên bản ít nhất 1.0.1e-3ubuntu1.2, theo nguồn: ub Ubuntu.com/usn/usn-2165-1
Martijn

1
Điều này không may là không đủ. Bạn cũng phải nâng cấp libssl1.0.0rõ ràng trên Ubuntu. Nếu bạn đang thấy một bản dựng vào ngày trước ngày 7 tháng 4 năm 2014 ngay cả khi openssl là phiên bản có vẻ chính xác ( 1.0.1-4ubuntu5.12đối với Ubuntu 12.04), bạn có thể vẫn dễ bị tổn thương.
danny

@danny Bạn vừa cứu tôi RẤT NHIỀU công việc. Tôi đã cố gắng tìm ra lý do tại sao ngày xây dựng là đúng trên một số hệ thống 12.04 và sai trên các hệ thống khác. Bạn là một phao cứu sinh!
Schof

openssl version -acó thể không cần ngày xây dựng vào ngày 7 tháng 4, vì bản sửa lỗi đang được đưa vào các bản phát hành cũ hơn.
Patrick James McDougle

4

Hãy thử sau đây. Nó sẽ trích xuất tất cả các chuỗi từ crypto thư viện mà ssh được liên kết chống lại. Nó tạo ra nhiều hơn một dòng đầu ra, nhưng nếu cần có thể được chuyển đổi thành 1 dòng.

ldd `which ssh` | awk '/\// { print $3 }' | grep crypto | xargs strings  | grep OpenSSL

sản xuất

OpenSSLDie
DSA_OpenSSL
...
MD4 part of OpenSSL 1.0.1f 6 Jan 2014 
MD5 part of OpenSSL 1.0.1f 6 Jan 2014
... 
etc

ví dụ như trên Gentoo trước khi xuất hiện

[ebuild     U  ] dev-libs/openssl-1.0.1f [1.0.1c] USE="bindist (sse2) tls-heartbeat%* zlib -gmp -kerberos -rfc3779 -static-libs {-test} -vanilla" 4,404 kB

lệnh trên cho kết quả

...
OpenSSL 1.0.1c 10 May 2012

sau

...
OpenSSL 1.0.1f 6 Jan 2014

Ouch, vẫn không có g.


3
Tôi nghĩ rằng bạn đã rất gần để cung cấp một giải pháp tốt, nhưng thật không may, điều này không hoạt động đối với thư viện tiền điện tử trên Ubuntu 12.04 LTS. Nó hiển thị tất cả các chuỗi với phiên bản [...] part of OpenSSL 1.0.1 14 Mar 2012, giống như cách làm openssl version -a. Đây là một mẹo có thể làm việc trong các trường hợp khác mặc dù!
Martijn

@Martijn Thật không may, nhưng nó hoạt động trên Ubuntu 12.10. Kỳ lạ là nó sẽ tự nhận dạng sai vào ngày 12.04. Có nhiều lib không? Có thể ssh không sử dụng cập nhật nhất?
waTeim

Tôi không thể tìm thấy bất kỳ nhị phân openssl hoặc thư viện tiền điện tử nào khác. Những người khác đề xuất rằng sự khác biệt là, vào ngày 12.04 LTS, Ubuntu đang đưa ra các thay đổi thành 1.0.1 mà không cần nâng cấp phiên bản. Mặc dù 12.10 không phải là LTS và vì vậy Ubuntu sử dụng phiên bản mới nhất ở đó thay vì backport.
Martijn

2

Có bất kỳ tập lệnh nào kiểm tra tất cả các dịch vụ không, hoặc chúng chỉ kiểm tra HTTPS ? AFAIK , PostgreSQL dễ bị tấn công, nhưng đó chỉ là tin đồn cho đến khi một cuộc tấn công ngoài tự nhiên xuất hiện.

Có một kịch bản metasploit có sẵn để sử dụng.

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

Bạn có thể nhập tệp này (đã được thử nghiệm với phiên bản nhị phân GnuWin32 OpenSSL 1.0.1.6, ngày 2014-01-2014) hoặc chỉ sử dụng tập lệnh trong nhận xét bên dưới bản này. Nó chính xác và đơn giản hơn!

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

Khi đã kết nối loại B và bạn sẽ thấy trên máy chủ dễ bị tấn công và bạn sẽ không bị ngắt kết nối:

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ạn sẽ nhận được một phản ứng nhịp tim trông giống như thế này.

Trên máy chủ được vá, bạn sẽ thấy phản hồi tương tự như bên dưới và bạn sẽ bị ngắt kết nối:

Nhập 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   .~.V..7.@...C...
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

Nguồn:

Ngoài ra còn có các công cụ này:


0

Đối với Ubuntu, bạn có thể sử dụng:

aptitude show libssl1.0.0 | grep Version

Và so sánh với http://www.ubfox.com/usn/usn-2165-1/ . Sau khi khởi động lại (!!!) bạn có thể kiểm tra với http://possible.lv/tools/hb.



0

Tôi tìm thấy kịch bản này trong sự lệch lạc :

openssl s_client -connect example.com:443 -tlsextdebug 2>&1| grep 'server extension "heartbeat" (id=15)' || echo safe

Thay thế example.combằng tên hoặc địa chỉ IP của máy chủ bạn muốn kiểm tra.

Sẽ trở lại "safe"nếu máy chủ của bạn ổn hoặc "server extension "heartbeat" (id=15)"nếu không.

Điều này không phụ thuộc vào số phiên bản, mà là liệt kê phần mở rộng máy chủ gây ra sự cố, vì vậy nó nên miễn dịch với phiên bản thư viện shenanigans.

Máy bạn đang chạy openssl s_clienttrên phải được sử dụng OpenSSL 1.0.1 hoặc mới hơn để cho tiện làm việc.


4
Hữu ích, nhưng không cho bạn biết nếu bạn có phiên bản có phần mở rộng và bản sửa lỗi .
mattdm

1
Đây thực sự là một cách tốt để kiểm tra lỗ hổng và là điều mà một số kịch bản làm. Nó không thực sự yêu cầu truy cập SSH.
Stefan Lasiewski

8
CẢNH BÁO QUAN TRỌNG LỚN LỚN - Máy bạn đang chạyopenssl s_clientPHẢI sử dụng OpenSSL 1.0.1 trở lên để thiết bị này hoạt động. Nếu bạn chạy lệnh này trên máy có 0.9.8 hoặc 1.0.0 NÓ LUÔN LUÔN BÁO CÁO "An toàn", ngay cả đối với các máy chủ dễ bị tấn công .
voretaq7

Kì lạ Tôi đang chạy phiên bản OpenSSL được cho là bị ảnh hưởng bởi lỗi này, tuy nhiên chuỗi đó không xuất hiện trong đầu ra ...
Michael

@StefanLasiewski Tôi đã cập nhật câu trả lời của mình và xóa phần "cần ssh"
egarcia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.