SSL 是網路加密通訊協定。用來確保 client 與 server 間的通訊是加密而不被第三方所窺見的。
OpenSSL 則是實作 SSL 的一個 open source 軟體兼函式庫。許多的 open source 網路軟體都使用 OpenSSL 來實現 SSL 功能。包括知名的 Apache 與 Nginx。只要瀏覽器上的網址列是 https:// 開頭,就是在使用 SSL 加密通訊。
SSL 是網路加密通訊協定。用來確保 client 與 server 間的通訊是加密而不被第三方所窺見的。
OpenSSL 則是實作 SSL 的一個 open source 軟體兼函式庫。許多的 open source 網路軟體都使用 OpenSSL 來實現 SSL 功能。包括知名的 Apache 與 Nginx。只要瀏覽器上的網址列是 https:// 開頭,就是在使用 SSL 加密通訊。
SSL 加密通訊協定的原理,簡單講是下面流程:
好了。瞭解加解密流程後,接下來就要看它的漏洞在哪。
一般來說,以上流程只有第一步會傳送 request 明碼,接下來就都會在加密過程中進行 (第2步的取得 server 公鑰,此公鑰是由 CA 的私鑰所加密,而 client 端通常已經有 CA 的公鑰了,故可取得 server 公鑰明碼。)。所以過程(演算法)是沒有問題的。
但過程沒問題,不代表化為程式就沒問題。寫過程式的人都知道,在程式的運算中,必須把金鑰、密碼、密文、明文這些東西放在變數中進行運算。也就是會放在記憶體裡。所以,就算程式執行完,得到密文了,有可能加解密的金鑰還在記憶體中,甚至明文也還在記憶體中。所以嚴謹的加解密程式,必須在程式結束時,得把自己用過的記憶體《清理》過,而不是一個 free() 釋放掉就沒事了。
OpenSSL 做為安全通訊函式庫的元老,當然也知道這個問題。只不過,就算最後有做清理,你我都明白,駭客也明白,明文、密碼或金鑰,還是會存留在記憶體一段時間,特別是程式還在執行的時候。所以只要在加解密進行的這時候去記憶體撈,就有可能會撈到寶!也就是明文、密碼或金鑰。對!只要懂這招,那麼世上幾乎沒有一種加密機制可以擋得住你。
本來,加解密也就只在 server 的記憶體中執行,外界的駭客根本無從接觸到。奈何,OpenSSL Heartbleed 有個可超出邊界值的漏洞,原本只是傳給 client 正常資料的通訊,變成 client 可以藉由指定這個沒有檢查邊界值的通訊,而《撈》到 server 記憶體裡的東西。於是嚴重的問題就來了。
駭客可以側錄到這個沒有檢查邊界值的通訊,並且指定去撈取特定記憶體的內容,假設他撈到 session key,那麼就可以解開這整個 client 與 server 的通訊,包含之前他已經側錄到的密文也能解開成明文。
若撈到 server 私鑰,那就可以冒充 server。
若直接撈到 client 的明文,包含登入帳密、個資、信用卡號、... 那後果可想而知。
所以,這問題就跟沒有使用 https 一樣嚴重,甚至更嚴重。因為在 https 之下,通常會傳送更多敏感資料,當然也就被視為有史以來最嚴重的 Bug 了。