سؤال Heartbleed: كيفية موثوقة ومنفصلة التحقق من إصدار OpenSSL؟


كنت أبحث في طريقة موثوقة ومحمولة للتحقق من إصدار OpenSSL على جنو / لينكس وغيرها من الأنظمة ، بحيث يمكن للمستخدمين بسهولة اكتشاف ما إذا كان يجب عليهم ترقية SSL بسبب الخطأ Heartbleed.

اعتقدت أنه سيكون أمرا سهلا ، لكنني واجهت مشكلة بسرعة في Ubuntu 12.04 LTS مع أحدث OpenSSL 1.0.1g:

openssl version -a

كنت أتوقع رؤية نسخة كاملة ، لكني حصلت على هذا:

OpenSSL 1.0.1 14 مارس 2012
مبني على: Tue Jun 4 07:26:06 UTC 2013
برنامج: [...]

لمفاجأتي غير السارة ، لا يظهر حرف الإصدار. لا و ​​، لا ز هناك ، فقط "1.0.1" وهذا كل شيء. لا تساعد التواريخ المذكورة في اكتشاف إصدار (غير ضعيف) أيضًا.

الفرق بين 1.0.1 (أ) و 1.0.1 جرام أمر بالغ الأهمية.

الأسئلة:

  • ما هي الطريقة الموثوقة للتحقق من الإصدار ، ويفضل أن يتم عرضه عبر توزيعة؟
  • لماذا لا يظهر خطاب الإصدار في المقام الأول؟ لم أتمكن من اختبار ذلك على أي شيء آخر غير Ubuntu 12.04 LTS.

آخرون الإبلاغ عن هذا السلوك كذلك. بعض الأمثلة:

بعض الاقتراحات (الخاصة بالتوزيع) تتدحرج في:

  • أوبونتو وديبيان: apt-cache policy openssl و apt-cache policy libssl1.0.0. قارن أرقام الإصدارات مع الحزم هنا: http://www.ubuntu.com/usn/usn-2165-1/
  • فيدورا 20: yum info openssl (شكرا @ znmeb على تويتر) و yum info openssl-libs

التحقق مما إذا كان إصدار أقدم من OpenSSL لا يزال مقيماً:

لقد تبين أن تحديث حزمة OpenSSL على Ubuntu و Debian لا يكفي دائمًا. يجب أيضًا تحديث الحزمة libssl1.0.0 ، ثم التحقق من ذلك openssl version -a يشير built on: Mon Apr 7 20:33:29 UTC 2014.


86
2018-04-07 23:51


الأصل


على الأقل تأكد من أن إصدار OpenSSL لديك ليس ز بسبب التاريخ الذي يظهر فيه - Pato Sáinz
هذا يعمل على CentOS [root@null~]# openssl version -a OpenSSL 1.0.1e-fips 11 Feb 2013 - Jacob
@ PatoSáinz لقد راجعت apt-cache policy openssl ورد عليها مع: Installed: 1.0.1-4ubuntu5.12 وهو 1.0.1g صدر للتو من قبل Ubuntu عن 12.04 LTS. قمت بتسجيل الخروج والعودة. هل هناك أي شيء آخر يمكنني القيام به للتحقق؟ - Martijn
سأشير إلى أن ذلك لا يعرف ، في حال كان ذلك مفيدًا ... Ubuntu 12.04 LTS يشحن مع OpenSSL 1.0.1 (vanilla). - HopelessN00b
إذا كان تاريخ الإنشاء هذا دقيقًا ، فلا يمكن أن يكون لديك رمز "نسخة إصدار" أحدث من 1.0.1e ، حيث أن 1.0.1f ظهرت في عام 2014 ملاحظات الإصدار OpenSSL 1.0.1. قد تكون الخطوط الفردية أو الأقسام قد تم إعادتها إلى إصدار Ubuntu الخاص بك قبل الإصدار الرسمي OpenSSL 1.0.1f ، بالطبع. وقد يكون تاريخ البناء أقل فائدة بشكل كامل. - Anti-weakpasswords


الأجوبة:


استنادًا إلى التاريخ المعروض بواسطة إصدار OpenSSL ، يبدو أنك هي رؤية النسخة الكاملة المعروضة هناك.

تم إصدار Open SSL 1.0.1 في 14 آذار 2012. تم إصدار 1.0.1a في 19 أبريل 2012.

لذلك ، سأذهب إلى الأمام وأؤكد ذلك openssl version -a هي الطريقة المناسبة للتقاطع العرضي لعرض الإصدار الكامل من OpenSSL المثبت على النظام. يبدو أنه يعمل مع جميع توزيعات لينكس التي يمكنني الوصول إليها ، و هي الطريقة المقترحة في وثائق help.ubuntu.com OpenSSL ، كذلك. Ubuntu LTS 12.04 الذي يتم شحنه مع الفانيلا OpenSSL v1.0.1 ، وهو الإصدار الذي يشبه إصدارًا مختصرًا ، بسبب عدم وجود حرف يتبعه.

بعد قولي هذا ، يبدو أن هناك رائد علة في أوبونتو (أو كيف أنها حزمة OpenSSL) ، في ذلك openssl version -a يواصل إرجاع الإصدار 1.0.1 الأصلي من 14 مارس 2012 ، بغض النظر عما إذا تمت أو لم تتم ترقية OpenSSL إلى أي من الإصدارات الأحدث. وكما هو الحال مع معظم الأشياء عندما تمطر ، يصب.

إن أوبونتو ليس التوزيعة الرئيسية الوحيدة في العادة المتعلقة بإرجاع التحديثات إلى OpenSSL (أو حزم أخرى) ، من خلال الاعتماد على التحديثات الأولية وترقيم الإصدارات التي يتعرف عليها الجميع. في حالة OpenSSL ، حيث تمثل أرقام إصدار الحروف إصلاح الأخطاء والتحديثات الأمنية فقط ، يبدو هذا غير مفهوم تقريبًا ، ولكن تم إخباري بأن هذا قد يكون بسبب التحقق من صحة FIPS- البرنامج المساعد توزيعة توزيعة لينكس توكلت مع OpenSSL. نظرًا للمتطلبات حول إعادة التحقق التي تحدث بسبب أي تغيير ، حتى التغييرات التي تعمل على سد ثغرات الأمان ، يتم قفل الإصدار.

على سبيل المثال ، في دبيان ، يعرض الإصدار الثابت رقم إصدار 1.0.1e-2+deb7u5 بدلا من النسخة المنبع من 1.0.1g.

ونتيجة لذلك ، في هذا الوقت ، لا توجد طريقة محمولة وموثوقة للتحقق من إصدارات SSL عبر توزيعات Linuxلأنهم جميعًا يستخدمون تصحيحاتهم الخلفية الخاصة بهم والتحديثات مع أنظمة ترقيم الإصدارات المختلفة. سيتعين عليك البحث عن رقم الإصدار الثابت لكل توزيع مختلف لنظام التشغيل Linux الذي تقوم بتشغيله ، والتحقق من إصدار OpenSSL المثبت مقابل ترقيم الإصدار الخاص بهذا التوزيع لتحديد ما إذا كانت الخوادم تعمل بإصدار ضعيف أم لا.


67
2018-04-08 00:05



التثبيت الخاص بي هو Ubuntu 12.04 LTS بسيط دون أي شيء قمت بتجميع نفسي أو تنزيلها من مصادر أخرى من مستودعات أوبونتو. إذا كان Ubuntu يوزع OpenSSL مع أرقام الإصدارات المختصرة ، عندئذٍ openssl version -a ليست طريقة محمولة (على الأقل ليست محمولة إلى أوبونتو). لقد تحققت apt-cache policy openssl ورد عليها مع: Installed: 1.0.1-4ubuntu5.12 وهو 1.0.1g صدر للتو من قبل Ubuntu عن 12.04 LTS. دخلت للخارج وأرد الدخول قبل التحقق. - Martijn
HopelessN00b ، لا يوجد شيء مشكوك فيه حول سياسة إصلاحات backporting بدلاً من النسخ bumping؛ إنها طريقة جيدة لضمان استقرار المنصة ، وهو أمر مرغوب فيه للغاية في بيئة الخادم. مثل أي قرار ، فإن له عواقب يجب على المستخدمين إدراكها ؛ ولكن فقط لأنه يكسر "أنا أقوم بتشغيل foo x.y.z لذلك أنا / لست عرضة لآخر استغلال"خط الاستدلال ، وهذا لا يجعل الأمر سيئا. - MadHatter
توجد أرقام Versiontowo لسبب ما. إذا كنا سنقوم فقط بطرح أرقام إصدارات المنبع من النافذة لأن "enterprisey" أو أيًا كان ، لماذا تهتم بأرقام الإصدارات على الإطلاق؟ قد تبدأ كذلك في تسمية جميع الأشياء لدينا باستخدام ميزة التأليف. يمكننا الاتصال بإصدارات OpenSSL الضعيفة Holy Heartbleed والثابتة مخيف الماكرة. - HopelessN00b
@ HopelessN00b أعتقد أنك ستقع في فخ "تم إصلاح هذا الإصدار في الإصدار X.Y.Z" ، ولا تتبع أرقام الإصدار لأن كل ما يتم استيراده إلى الإصدار الأحدث هو إصلاحات الأخطاء والأمان. إذا صدموا رقم الإصدار ، فستتوقعون أيضًا الوظيفة الإضافية .. "لدي OpenSSL v X.Y.Z ، فلماذا لا أملك ECDHA ؟؟؟؟ .. etc". من المنطقي عندما تفهم أنه فقط bugfixes. - NickW
NickWJubalMadHatter الشيء مع OpenSSL ، مع ذلك ، هو: 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. لذلك ، لا يتم الحصول على أي شيء يتخلى عن نظام تعيين الإصدارات الأولية ؛ يعد استبدال التحديثات بشكل أساسي نفس استخدام الإصدار المحدّث ، نظرًا لأن التحديث لا يتضمن سوى الأمان وإصلاح الأخطاء على أي حال. ما يفعله هو الخلط بين الأشياء وترك لنا بأي حال من الأحوال للتحقق من إصدار OpenSSL من خلال توزيعات لينكس. - HopelessN00b


إذا كنت تريد شيئا عبر منصة حقا ، تحقق من الثغرة نفسها بدلاً من الاعتماد على أرقام الإصدارات. 

قد يكون لديك رمز يبلغ عن رقم إصدار معروف بأنه ضعيف ، لكن الشفرة الفعلية ليست عرضة للخطر. والعكس - رمز ضعيف بصمت - يمكن أن يكون أسوأ!

سيقوم العديد من البائعين الذين يجمعون منتجات مفتوحة المصدر مثل OpenSSL و OpenSSH بإعداد إصلاحات عاجلة بشكل انتقائي لإصدار قديم من الشفرة ، من أجل الحفاظ على استقرار واجهة برمجة التطبيقات وإمكانية التنبؤ بها. هذا ينطبق بشكل خاص على "إطلاق سراح على المدى الطويل" ومنصات الأجهزة.

لكن البائعين الذين يقومون بذلك بصمت (بدون إضافة لاحقة سلسلة إصدارهم) يواجهون خطر إطلاق إيجابيات كاذبة في أجهزة الكشف عن الثغرات (والمستخدمين المربكين). لذلك لجعل هذا شفاف وقابل للتحقق ، بعض البائعين إلحاق سلاسل خاصة بهم إلى إصدار الحزمة الرئيسية. كل من دبيان (OpenSSL) و FreeBSD (في OpenSSH ، عبر VersionAddendum sshd_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

مع أشياء مثل هذه في اللعب ، كنت أفضل حالا إذا كنت لا تثق برقم الإصدار.


18
2018-04-08 20:52



من الواضح أن التحقق من الإصدارات ليس بهذه السهولة والشفافية كما كنت آمل أن تكون. التحقق من الثغرة هو عبر النظام الأساسي ، ولكن من الصعب أيضًا القيام به: يجب أن يكون لديك اختبار موثوق أو اختبار مفيد لخدمة البرامج الضعيفة الخاصة التي تقوم بتشغيلها. في هذه الحالة ، بدأ كل شيء باستخدام PoC لـ Apache و nginx. ماذا لو كنت أستخدم SMTP مع SSL فقط في تلك اللحظة ، وأردت التحقق مما إذا كنت معرضًا للخطر؟ في النهاية ، سنجري اختبارات لمعظم الخدمات ، ولكن قد يستغرق الأمر بعض الوقت. - Martijn
مارتين ، هذه نقطة عادلة. عندما لا يكون الاختبار متاحًا ، تكون الطرق الثانوية (مثل تعقب المجموع الاختباري للثنائيات المتأثرة في الأنظمة المستهدفة) أقل مثالية ، ولكنها قد تكون جيدة بما يكفي لإنجاز المهمة ... ثم تنتقل إلى النار التالية. :-) - Royce Williams


لسوء الحظ ، لست متأكدًا من ذلك هو طريقة عبر منصة للقيام بذلك. كما أناقش في نشر بلوق، عرض إصدار OpenSSL على Ubuntu 12.04 REMAINS 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 يعرض تاريخًا "مبنيًا" بتاريخ 7 نيسان 2014 أو أحدث.

شكرا لdanny للحصول على معلومات إضافية.


14
2018-04-08 03:15



حسنا ، في هذه الحالة يجب أن أقوم بإضافة إصدار الحزمة 1.0.1-4ubuntu5.12 هو فقط لـ Ubuntu 12.04 LTS. إذا كنت تستخدم Ubuntu 12.10 ، فيجب أن تشاهد إصدارًا على الأقل 1.0.1c-3ubuntu2.7وإذا كنت على 13.10 ، فيجب أن يكون الإصدار على الأقل 1.0.1e-3ubuntu1.2حسب المصدر: ubuntu.com/usn/usn-2165-1 - Martijn
هذا للأسف غير كاف. أنت يجب أيضا ترقية libssl1.0.0 صراحة على أوبونتو. إذا كنت ترى تاريخًا مبنيًا قبل 7 أبريل 2014 حتى إذا كان الإصدار openssl يبدو صحيحًا (1.0.1-4ubuntu5.12 لأوبونتو 12.04) ربما لا تزال عرضة للخطر. - danny
danny أنت فقط أنقذتني الكثير من العمل. كنت أحاول معرفة السبب في أن تاريخ البناء كان صحيحًا في بعض أنظمة 12.04 والخطأ على الآخرين. كنت منقذا للحياة! - Schof
openssl version -a قد لا تحتاج إلى تاريخ إنشاء 7 أبريل ، لأن الإصلاح يتم إعادته إلى الإصدارات الأقدم. - Patrick James McDougle


جرب ما يلي. سوف استخراج جميع الاوتار من التشفير المكتبة التي يرتبط ssh ضد. ينتج أكثر من خط إنتاج واحد ، ولكن إذا لزم الأمر يمكن تحويلها إلى سطر واحد.

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

ينتج عنه

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

مثلا على جنتو قبل أن تظهر

[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

النتائج المذكورة أعلاه في القيادة

...
OpenSSL 1.0.1c 10 May 2012

بعد

...
OpenSSL 1.0.1f 6 Jan 2014

أوتش ، لا يزال لا ز.


4
2018-04-08 14:45



اعتقدت أنك قريب جدا من تقديم حل جيد ، ولكن للأسف هذا لا يعمل لمكتبة التشفير على Ubuntu 12.04 LTS. فإنه يعرض جميع السلاسل مع الإصدار [...] part of OpenSSL 1.0.1 14 Mar 2012، بنفس طريقة openssl version -a هل. هذه خدعة قد تعمل في حالات أخرى رغم ذلك! - Martijn
Martijn حسنا هذا مؤسف ، لكنه يعمل على أوبونتو 12.10. الغريب أنه من شأنه أن يخطئ في تحديد نفسه على 12.04. هل هناك عدة ليب؟ هل من الممكن ssh لا يستخدم أحدث ما يصل إلى التاريخ؟ - waTeim
لم أتمكن من العثور على أي ثنائيات openssl أو مكتبات التشفير. يقترح آخرون أن الفرق هو أنه في 12.04 LTS ، يقوم أوبونتو بإرجاع التغييرات إلى 1.0.1 بدون رفع الإصدار. في حين أن الرقم 12.10 ليس LTS ولذلك يستخدم Ubuntu الإصدار الأحدث هناك بدلاً من المنفذ الخلفي. - Martijn


هل أي من هذه البرامج النصية اختبار جميع الخدمات ، أو أنها تختبر فقط HTTPS؟ بقدر ما أعلم، كيو ضعيف ، ولكن هذه ليست سوى إشاعة حتى يبرز هجوم في البرية.

هناك metasploit البرنامج النصي متاح للاستخدام.

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

يمكنك كتابة هذا (اختبار مع GnuWin32 OpenSSL الثنائي الإصدار 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

ستحصل على استجابة نبضات تشبه هذا واحد.

على المضيف المصحح ، سترى استجابة مشابهة لما يلي ، وسيتم قطع اتصالك:

أدخل ب

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

مصدر:

هناك أيضا هذه الأدوات:


2
2018-04-09 11:43





بالنسبة إلى Ubuntu ، يمكنك استخدام:

aptitude show libssl1.0.0 | grep Version

وقارن مع http://www.ubuntu.com/usn/usn-2165-1/. بعد إعادة تشغيل (!!!) يمكنك التحقق مع http://possible.lv/tools/hb.


0
2018-04-08 11:14





كنت أفضل الترقية إلى أحدث OpenSSL OpenSSL 1.0.1j.

http://blog.vincosolution.com/2014/10/upgrade-openssl-1-0-1j-debianubuntu.html


0
2017-10-19 01:57





وجدت هذا البرنامج النصي في devcentral:

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

يحل محل example.com مع اسم أو عنوان IP للخادم الذي تريد التحقق منه.

سيعود "safe" إذا كان الخادم الخاص بك على ما يرام أو "server extension "heartbeat" (id=15)" ان لم.

هذا لا يعتمد على رقم الإصدار ، ولكن على إدراج ملحق الخادم الذي يسبب المشكلة ، لذلك يجب أن يكون في مأمن من shenanigans نسخة المكتبة.

الجهاز الذي تقوم بتشغيله openssl s_client على يجب استخدام OpenSSL 1.0.1 أو أحدث لكي يعمل هذا.


0
2018-04-08 09:12



مفيد ، ولكن لا يخبرك إذا كان لديك إصدار بالامتداد والإصلاح. - mattdm
هذا بالفعل طريقة جيدة للتحقق من الضعف وهو ما تفعله بعض البرامج النصية. لا يتطلب بالفعل الوصول إلى SSH. - Stefan Lasiewski
تحذير هام للغاية تحذير - الجهاز الذي تقوم بتشغيله openssl s_client يجب استخدام OpenSSL 1.0.1 أو أحدث لكي يعمل هذا. إذا قمت بتشغيل هذا الأمر على جهاز مع 0.9.8 أو 1.0.0 سيكون دائما تقرير "آمنة" ، حتى بالنسبة للخوادم الضعيفة. - voretaq7
الفردية. أنا أقوم بتشغيل إصدار OpenSSL الذي من المفترض أن يتأثر بهذا الخطأ ، ولكن هذه السلسلة لا تظهر في الإخراج ... - Michael
StefanLasiewski قمت بتحديث إجابتي وأزلت الجزء "need ssh" - egarcia