OpenSSL再曝CCS注入漏洞-心傷未愈又成篩子

太戲劇了,昨晚看了佳片有約,還不錯,2012版的《完美回顧》,像我這樣的人依舊選擇用電視或者去影院看電影,在沒有中間插播廣告的時候,體驗憋尿得過程中,總是能突然有非常多的想法,這是用電腦或者手機看電影所體會不到的。看完以后已經12點半了,突然想再看一遍《黑客帝國》,這下不用電腦不行了,因為電視上沒得播...結果正在緩沖的時候,突然看到了旁邊的小公告:“OpenSSL再爆嚴重安全漏洞--CCS注入”,完了,電影看不成了,不是說不想看了,突然感覺自己比神還無恥,怎么人家曝出漏洞會這么高興啊,關掉已經緩沖完畢的電影,就想看一下OpenSSL的笑話,同一時候心里還極度扭曲地想,我不近期在搞基于OpenSSL的一個改動么,向OpenSSL這樣的代碼,就我這樣的垃圾coder配得上它,因為我的垃圾代碼和它非常般配...
?????? 當我看了一篇博客《How I discovered CCS Injection Vulnerability (CVE-2014-0224)》后,我認為我錯怪OpenSSL了,這次或許真的不是OpenSSL的錯,而是RFC的錯,即這次的這個漏洞不是實現問題,很多其它的是協議本身的設計問題。假設你還沒有讀過上面我提到的那篇博客,一定要看一下,假設看過了,我們就接著往下走,看看這個漏洞的一些細節。
?????? 我們知道,OpenSSL協議分了兩個層次,一個是記錄協議層,一個是數據協議層,后者包括了握手協議,告警協議,CCS協議等,注意這個“等”字,搞知道國密標準的應該知道這個等字的含義,不知道國密標準的人奉勸永遠都不要知道,這次的CCS漏洞本質上就和這個“等”字有關。言歸正傳,SSL/TLS的安全通道通過握手協議建立,安全通道上通行的數據顯然是加密的,而在握手過程中,在密鑰等安全參數沒有協商完畢之前,數據都是明文的,那么在握手狀態機中就肯定有那么一個點,在該點之前數據是明文的,而在該點之后數據是加密的,這個點就是接收到ChangeCipherSpec消息,問題是,這個消息在握手狀態機中交換,可是卻不在握手協議中定義,它被定義為一個單獨的協議,不屬于握手協議。這樣做的理由,依照漏洞發現者Masashi Kikuchi在RFC挖掘出的理由那就是:

Note:????????? To help avoid pipeline stalls, ChangeCipherSpec is
???????????????? an independent SSL Protocol content type, and is not
???????????????? actually an SSL handshake message.
這是一個什么理由?顯然沒有考慮安全因素。那么問題就來了,既然CCS獨立于握手狀態機,那么它便能夠在握手過程中的不論什么一點收發,在協議層面并沒有強制CCS必需要在master keys在握手協議中已經完備的情況下才干發送,假設那樣強制,就是兩個協議之間的交疊。其實,依照規范而言,SSL/TLS的握手中,CCS的位置是被嚴格規定的,即master keys準備好之后,Finish消息之前,那么安全機制就必須由實現者自己負責。稍有不慎,關于握手協議和CCS之間的關系就會處理不好造成能夠利用的漏洞。在一篇文章《Early ChangeCipherSpec Attack 》中,作者披露了OpenSSL1.0.1h是怎樣解決問題的,實際上加了不多的幾行代碼,當中之中的一個就是ssl3_do_change_cipher_spec函數中的一個推斷:
if (s->session == NULL || s->session->master_key_length == 0){/* might happen if dtls1_read_bytes() calls this */SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,SSL_R_CCS_RECEIVED_EARLY);return (0);}

在之前的漏洞影響的版本號中,并沒有確認master_key_length不為0,這就意味著即便master key還沒有準備好,也是能夠發送CCS的,而這樣的話,所謂的密鑰也沒有秘密可言了。CCS的發送時間并沒有強制要求,可是要求master keys必須準備好!以下是一個基于中間人攻擊的漏洞利用場景,中間人在作為server的時候,在ServerHelloDone完畢后即發送一個CCS,注意此時還沒有生成master keys,因此使用一個空值取代,因為OpenSSL在收到CCS的時候并沒有檢查自己的握手狀態機處于哪一步驟,因此會無條件接收,此時它也沒有master key,后面的事情就是使用不是密鑰的密鑰對數據進行加密,注意,因為OpenSSL的實現原因,僅僅要已經經過了key的計算,在一個session中以后就不會再次計算,因此以下的代碼(相同處于ssl3_do_change_cipher_spec中)其實助長了漏洞:
if (s->s3->tmp.key_block == NULL){if (s->session == NULL){/* might happen if dtls1_read_bytes() calls this */SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,SSL_R_CCS_RECEIVED_EARLY);return (0);}s->session->cipher=s->s3->tmp.new_cipher;if (!s->method->ssl3_enc->setup_key_block(s)) return(0);}

??? 關于SSL/TLS規范中將CCS設計成獨立的一個數據協議,我在《TCP/IP協議族》這本經典教材中找到了更真切的理由,那就是它將發送方和接收方切割成了兩個狀態,依照分權原則,這個事不能在握手協議本身完畢。
??? 漏洞發現者Masashi Kikuchi所述,僅僅要保證幾點就可以,非常easy:

IMHO, this sentence is the very cause of the vulnerability. According to it, the reason that CCS is assigned an independent record type is to avoid a stall. This is the point where the most complex synchronization is required in TLS/SSL handshake. First, you need to wait until the handshake proceeds to the proper phase. Then, you need to check whether the handshake receives CCS before Finish.

More precisely, when accepting CCS, you must verify the following three conditions (*):

??? the handshake proceeds to the proper phase, i.e., just before to receive Finished,
??? no fragments from the handshake remains,
??? and, the next message is Finished.

Being more careful, you should also check

??? no Alert fragment remains (they can be rejected in the first place),
??? and, no Heartbeat fragment remains

事實非常easy,保證CCS發送的時候,master keys真的已經準備好了,這實際上就是CCS本身的意思,假設我能跟我的三歲的小小講清楚這個,她肯定會說她的口頭禪:難道不是嗎?
?????? 一個獨立的CCS協議,獨立于握手協議的CCS協議,在SSL/TLS中必定不可能是全然獨立的,協議封裝上是獨立的,語義卻不可能是獨立的,否則,我在ClientHello后發送一個CCS,可否?唉,心病還未痊愈,CCS又來搗亂,假設說心臟出血是OpenSSL的問題的話(它實際上是一個低級的代碼級錯誤),CCS漏洞則是一個協議層面的問題,這個問題可不低級!我相信不止OpenSSL的實現會有這個問題。

?????? 我不再吐嘈了,可是我想澄清互聯網時代系統兩種死法的不同之處,對于安全而已,死法也僅僅有兩種,我舉一個現實中的樣例,一種是生病或中毒而死,一種是外力置死,比方車禍,地震,或者被砍死,這兩種本質是不同的,第一種是你自身出了問題,另外一種則是外部原因導致。映射到互聯網,對于password被破解,CCS漏洞之類的,這就是第一類的,這類問題一般都是系統本身的設計問題,而對于像棧溢出,Heartbleed,堆溢出之類的,則屬于第二類,這類問題一旦碰到,非常公平,可是不屬于系統設計的問題,僅僅是實現問題。再說一下現實世界,即便吃再安全的食品,也怕菜刀,可是能夠請保鏢,武夫之流能擋刀,可是終于可能會因為吃了太多的不健康的油而致癌...

?????? 做個廣告,最好的篩子:OpenSSL



轉載于:https://www.cnblogs.com/hrhguanli/p/3788316.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何從JavaScript數組中獲取多個隨機唯一元素?

The JavaScript is a very versatile language and it has a function almost everything that you want. JavaScript是一種非常通用的語言,它幾乎具有您想要的所有功能。 Here, we will show you how to generate random unique elements from an array in JavaSc…

用SQL語句添加刪除修改字段

1.增加字段 alter table docdsp add dspcodechar(200)2.刪除字段 ALTER TABLE table_NAME DROP COLUMNcolumn_NAME3.修改字段類型 ALTER TABLE table_name ALTER COLUMNcolumn_name new_data_type4.sp_rename 改名 EXEC sp_rename [dbo].[Table_1].[fi…

通過命令修改wampserver的mysql密碼

WAMP安裝好后,mysql教程密碼是為空的,那么要如何修改呢?其實很簡單,通過幾條指令就行了,下面我就一步步來操作。 首先,通過WAMP打開mysql控制臺。 提示輸入密碼,因為現在是空,所以直…

DBNull

1、執行ExecuteScalar時,要進行Null判斷,因為對Null進行操作會報:NullReferenceException 2、返回DBNull的情況,因為DBNull是用來表示數據庫中Null的,所以如果數據中返回null,程序中就是DBNull&#xff0c…

什么是ACID理論(二階段、三階段提交、TCC)

目錄二階段提交協議TCC(Try-Confirm-Cancel)預留成功預留失敗三階段提交協議總結Some questionsreferenceACID理論時對事務特性的抽象和總結,想要實現ACID需要掌握二階段提交協議以及TCC 這里是有關協議的論文PDF鏈接: CONCURRENC…

oracle安裝后新建數據庫實例及配置

ORA-12514 TNS 監聽程序當前無法識別連接描述符中請求服務 的解決方法 (2011-01-20 13:50:37) 轉載▼標簽: it 分類: 技術早上同事用PL/SQL連接虛擬機中的Oracle數據庫,發現又報了“ORA-12514 TNS 監聽程序當前無法識別連接描述符中請求服務…

html5游戲開發--動靜結合(二)-用地圖塊拼成大地圖 初探lufylegend

一、前言 本次教程將向大家講解如何用html5將小地圖塊拼成大地圖,以及如何用現有的高級html5游戲開發庫件lufylegend.js開發游戲。 首先讓我們來了解了解如何用html5實現動畫,畢竟“動靜結合”是先有動再有靜。看了上一章的內容,或許你就有了…

BASE理論(基本可用策略+ 最終一致性實現)

目錄實現基本可用的幾個策略1、流量削峰(不同地區售票時間錯峰出售)2、延遲響應,異步處理(買票排隊,基于隊列先收到用戶買票請求,排隊異步處理,延遲響應)3、體驗降級(看到…

一天一道算法題--6.15--卡特蘭數

感謝微信平臺---一天一道算法題---每天多一點進步- problem: 12個高矮不同的人 排成兩排 每排必須是從矮到高排列 而且第二行比對應的第一排的人高 問排列方式有多少種? analyse: 據說 這題 是來自于 阿里巴巴的面試題 果然 很有分量 ~~ 我反正 胡思亂想了好多 沒搞…

現有一些開源ESB總線的比較

現有的開源ESB總線中,自從2003年第一個開源總線Mule出現后,如今已經是百花爭鳴的景象了。如今我就對現有的各種開源ESB總線根據性能、可擴展性、資料文檔完整程度以及整合難易程度等方面展開。 一.CXF CXF的定位不是ESB總線,而是一…

Paxos算法(Basic Paxos 與 Multi-Paxos思想)

目錄Basic Paxos三個角色達成共識的方法對于Basic Paxos的總結Multi-Paxos領導者優化 Basic Paxos 執行referencePaxos 算法包含 2 個部分: 1、Basic Paxos : 描述多節點之間如何就某個值達成共識 2、Multi-Paxos : 描述執行多個Basic Paxos實…

vs2012下調試mvc4源代碼

當前流行的應該是mvc3才對。然后在研究mvc3的源代碼時候,Html這個屬性下的擴展方法Partial()都沒有。IntelliSense不會提示該方法,找了半天的資料也問了一些博友,沒看到好的解決棒法。最后沒轍另辟蹊蹺,就開始著手研究mvc4的源代碼…

JAVA UDP網絡編程學習筆記

一、UDP網絡編程概述 采用TCP協議通信時,客戶端的Socket必須先與服務器建立連接,連接建立成功后,服務器端也會持有客戶端連接的Socket,客戶端的Socket與服務器端的Socket是對應的,它們構成了兩個端點之間的虛擬通信鏈路…

firefox 插件開發

IDE,你可以嘗試下NetBeans foxbeans這個插件。轉載于:https://www.cnblogs.com/sode/archive/2013/01/25/2876562.html

13種負載均衡算法

目錄前言(1)輪轉調度(Round-Robin Scheduling)算法(2)加權輪轉調度(Weighted Round-Robin Scheduling)算法(3)隨機均衡調度(Random Scheduling&am…

對于shell腳本參數獲取時的一點小技巧

問題如下: 根據腳本參數的個數$#進行一個循環,在依次輸出每個參數$1 $2 $3...... 我有一個循環變量i $i 取到這時的i為1,我想使用這個1再去調用$1,也是就是打印出第一個參數 就是$($i)的意思來取到第幾個參數,當然$($i)是不好用的…

(轉)頁游安全攻與防,SWF加密和隱藏密匙

原文鏈接:http://netsecurity.51cto.com/art/201211/364775.htm 頁游,最最核心的就是客戶端(swf)與服務端的游戲通信了。游戲通信產生的封包,內容是否可識別,可篡改,可重放,處理邏輯…

C++自動類型推導 : auto 與 decltype 用法

基本用法與區別 auto 總是推導出“值類型”,絕不會是“引用”,如果有引用,auto會把引用去掉,推導出值類型; auto 可以附加上 const、volatile、*、& 這樣的類型修飾符,得到新的類型。 auto x 10L; // auto推導為…

C++智能指針使用指南 part1:基本使用

加粗樣式>TOC 智能指針是代理模式的具體應用,它使用 RAII 技術代理了裸指針,能夠自動釋放內存, 無需程序員干預,所以被稱為“智能指針”。 智能指針不是指針,而是一個對象,所以不要對其調用delete&…

AS3.0 BitmapData類介紹

注:文中的Bitmapdata和BMD均為同一意思BitmapData,BMD為其縮寫一,概括: Bitmapdata繼承Object對象,實現IBitmapDrawable接口,這個接口有什么用,你可以理解為Drawable,能被畫。官方介紹是:IBitma…