IE安全系列:IE浏览器的技术变迁(上)
聲明:為了更好地向讀者輸出更優質的內容,InfoQ將精選來自國內外的優秀文章,經過整理審校后,發布到網站。本篇文章作者為烏云白帽子blast,原文鏈接。本文是《IE安全系列》第一篇,已由烏云網授權InfoQ中文站轉載。歡迎轉發,但請保留原作者信息!
\\作者 blast
\\前言
\\本系列將簡單介紹一下IE的安全問題,限于篇幅和自己的認知,其中必有不足之處,歡迎大家指正。
\\系列中每篇文章分為三個部分,第一部分通常是背景介紹,第二部分是總結性的描述,第三部分則是詳細介紹或者實踐。
\\Internet Explorer的歷史變遷
\\在記憶中,從1999年開始接觸網絡,從那時跟隨著Windows 95一起而來的Internet Explorer 4算起,微軟已經發布了8個不同版本的IE了(如果Spartan算作是Internet Explorer 12的話)。這之中Internet Explorer(以下簡稱IE)都做了哪些變更呢?
\\- IE1、IE2(1995年):家族中最簡單的“瀏覽器”,只支持靜態的頁面,現在你能用得到的許多功能它都不支持;但現在你用到的許多功能他卻都有了雛形。\\\ \\t
- IE3(1996年):對早期版本的改進,支持了ActiveX控件,支持了JavaScript和VBScript(當時稱為Microsoft JScript和Microsoft VBScript,因為商標問題)。從這時開始支持Web Browser這個被人熟知的ActiveX控件,這保證了瀏覽器的可重用性。\\t
- IE4(1997年):引入了DHTML功能,支持數據綁定,同時增強了WebBrowser的功能,添加了一些新特性,增加了側邊欄以及BHO。\\t
- IE5(1999年):隨著Windows 98一起發售,支持持久會話,緊接著誕生了XMLHttpRequest,促使了AJAX的發展(盡管此時AJAX一詞都還沒誕生……),引入了HTA,還有自動填表等功能。IE5.5版本起還支持了128位的加密。\\t
- IE6(2001年):緊接著Windows XP一起發售,是給大家留下印象最深刻的瀏覽器,在2002~2003年中,IE6的市場份額達到了90%,IE全家族的市場份額達到了95%。同時,這也是最飽受詬病的一款瀏覽器,因為它的安全問題實在是很嚴重。這一版本中增加的大多是網頁渲染相關的功能,例如CSS1、DOM1等的部分支持。\\t
- IE7(2006年)、IE8(2009年):IE6市場份額被火狐搶走之后微軟推出的新版本瀏覽器,這兩個版本大部分都是性能調整和渲染修整以及增強。\\t
- IE9(2011年),穩定版本,性能提升和HTML5支持,多進程支持,這使得網頁假死或者崩潰時不會影響到其他頁面。\
IE9之后的版本大家很容易就能搜到產品截圖。
\\- \\t
IE10(2011年)/IE11(2013年),性能有較大的增強,渲染及兼容性也得以增強,增加DNT支持。IE10的性能已經和之前有較大的不同,但是頂著IE的名號,依然得承受著IE6帶來的深刻影響。
\\t\\t - \\t
Spartan(2015年),代號IE12。整合了語音助手,性能提升等。從程序上看,它確實和IE用的不是同一套DLL庫。
\\t\
IE的構成
\\在早期的單進程IE中,IE的結構大致如下:
\\ \\圖:以IE6為代表的單進程無Tab模式
\\ \\隨著多進程的引入,IE的網頁部分結構還是類似這樣,但是界面宿主已經有變化了,看起來像是:
\\ \\請注意上圖中外殼網頁分屬于不同進程。
\\在IE7中,一個進程中可以運行一組網頁窗口了,但是新窗口不代表在新進程里面運行。(比如你用Ctrl+N新建窗口,其實它還是在當前進程里面創建的),可以自己安裝一個IE7來試驗,如果沒用過的話看我這個描述應該會很奇怪。開啟了保護模式的進程會運行在低完整性級別下,通過一個代理進程來進行通信。
\\簡化的進程模型如下:
\\ \\ \\下圖:IE7的進程模式
\\ \\在IE8中,微軟引入了IE8松散耦合進程框架(LCIE),它使用Jobs來限制進程權限(筆者試著用Jobs控制權限,實際應用在IE中的話深知不易,微軟也是下了不少功夫),這個時候,開啟了保護模式與未開啟保護模式的IE8的結構類似與:
\\ \ \\可以看到的是這個版本中IE的UI Frame和一些管理功能所在的進程運行在中完整性級別上,而保護模式下,Tab和網頁進程運行在低完整性級別中(禁用保護模式的域下依然是中完整性級別)。
\\如上,HTML和ActiveX控件都在網頁進程里面,還有一個比較特殊的是工具欄,它也在網頁進程里面。
\\采用這種模式的好處都有啥?首先是每個Tab都獨立出去了,其中一個崩了也不會影響其他的;至于把UI Frame移動到了代理進程那邊,理由是加快啟動速度。
\\而且由于采用了網頁分進程的模式,所以不同完整性級別的網頁、Tab都可以歸屬于同一個UI Frame,管理起來也比較方便。如果你使用過mordenie、metroie,你會發現也許它的網頁進程都是64位的,這是因為這個版本中不加載任何插件。即便現在許多插件都有了64位版本,比如Adobe Flash Player,但是如果一味的追求64位化還是會導致各種插件不兼容。所以在IE10、IE11的64位版本中,瀏覽器的UI Frame以64位運行,而網頁進程為了保證插件的兼容性,依然默認采用了32位進程。換句話說,即使你打開的是64位的IE,但網頁進程還是32位的。
\\所以,也許你會看到有64位的IE和32位IE同時存在你電腦里面的樣子:
\\ \\以及,啟動IE后出現一個64位進程和n個32位進程的樣子:
\\ \\圖:IE11 64bit Frame進程和32bit Content進程
\\相對于IE7的模式,在IE11中,即使你手動執行兩次iexplore http://www.wooyun.org,出來的也僅僅只有一個64位的UI進程。
\\ \\圖:IE11的進程模式
\\當然,如果你開啟了增強保護模式,那網頁進程也會變成64位的。
\\ \\圖:IE11啟用增強保護模式
\\在Windows 7下開啟這個模式,唯一的用處就是把進程變成了64位,但是Windows 8下則會引入AppContainer這個進程隔離模式,具體的可以參考這里。
\\限于篇幅,與之相關的內容之后再敘述。
\\重要概念:什么是Markup Service?
\\回到IE的核心功能上來,作為網頁的渲染器,超文本標記語言HTML想必是離不開Markup,那這個Markup到底是什么呢?歷史上來說,Markup其實是給演員看的,簡單的說就是劇本,通常還會給它畫一道藍色的標記,標明這個東西應該誰怎么演才合適。在瀏覽器中,Markup通常可以看作是一個個的標簽。關于Markup Service的內容,建議大家最開始只了解個大概即可。
\\ \\圖:Markup Script,當然,這個是演員用的,圖像來自Google Image
\\ \\圖:IE可以識別的Hyper Text Markup Langauge
\\例如,一個HTML文件可能有如下內容:
\\ \u0026lt;DIV\u0026gt;blast\u0026lt;DIV\u0026gt;off\\\當瀏覽器解析這個文本時,瀏覽器會對內容做一次標準化(我比較習慣這么稱呼),之后,DOM內容看起來像是:
\\ \u0026lt;HTML\u0026gt;\u0026lt;HEAD\u0026gt;\u0026lt;TITLE\u0026gt;\u0026lt;/TITLE\u0026gt;\u0026lt;/HEAD\u0026gt;\u0026lt;BODY\u0026gt;\u0026lt;DIV\u0026gt;blast\u0026lt;DIV\u0026gt;off\u0026lt;/DIV\u0026gt;\u0026lt;/DIV\u0026gt;\u0026lt;/BODY\u0026gt;\u0026lt;/HTML\u0026gt;\\\這個過程你可以自己去網頁DOM看:
\\ \\圖:IE11的文檔標準化
\\由于有元素的插入,因此這一項功能可能會引入額外的安全風險,例如我之前發的內容。
\\或者可以說,解析器經過這一輪后,將HTML文本轉為了元素。而且為了內容的完整,有一些原來沒有的元素也加進去了,例如html、head、title、body等會自動地被解析器構造出來。
\\同時,解析器遇到第二個div(分塊)的時候,會自動的把第一個div給封閉起來(怎么封閉要取決于瀏覽器的實現)。還有之前加入的必要(但是你沒寫)的標簽,比如\u0026lt;html\u0026gt;、\u0026lt;body\u0026gt;,都會自動地被IE添上并封閉。
\\第二個需要注意的概念是tree和stream(樹、流)的區別,比如:
\\ This\u0026lt;B\u0026gt;is\u0026lt;/B\u0026gt;atest\\\這組“this is a test”和一對b標簽的例子,將會被轉化為如下的樹。text被當為樹葉,element被作為內節點。
\\ ROOT\ |\ +-------+--------+\ | | |\\"this\" B \"a test\"\ |\ \"is\"\\\把文檔轉為tree之后,所有的操作都會變為類似對樹的操作,例如增刪子節點。提供此類操作的API被稱為Tree Service。
\\當然,自IE4.0之后,元素的模型操作比簡單的樹更強悍,比如這個例子:
\\ An \u0026lt;B\u0026gt;exmaple \u0026lt;I\u0026gt; of \u0026lt;/B\u0026gt; elements \u0026lt;/I\u0026gt; cross\\\B、I的范圍互相交叉,在HTML里面這個很常見,用樹來描述則十分困難。因此,Markup Services對這個內容不再提供類似樹的操作,而是為方便控制內容暴露了一個基于流操作的模型。
\\ \圖:相互交叉的范圍
\\所以,Markup Service的作用實際上是用來避免產生這種讓人迷惑的模型層間的。
\\當無法用Tree Service時,瀏覽器就轉而使用Markup Service來控制基于流操作的模型。
\\在基于樹的模型中,網頁內容被當作樹的節點來處理,每個元素,或者一塊Text都是一個節點。節點通過這種類似對樹的操作方式來操作,例如從父節點中增刪一個子節點。
\\在基于流的模型的內容操作方式中(比如通過Markup Service來操作),文檔的內容會通過使用類似迭代器的對象來操作。這個就像是在處理上面那個元素交叉的例子一樣,這些帶有部分重疊的元素通過兩個Markup Pointer來區分,每個Markup Pointer指定著Tag從哪兒開始、到哪兒結束。所以,基于流的模型是基于樹的模型的一個超集。
\\說了這么多,要引入我們的Markup Pointer了。在這之前,舉一個類似的例子,C++中,如果要操作一個vector,使用迭代器是非常方便的做法:
\\ \\圖:使用迭代器向vector插入一個元素
\\也如你所見,Markup Pointer也有些神似迭代器。可以通過創建和操作無效文檔的過程來理解一下。
\\注意之前“This is a test”的例子,瀏覽器可能不會被認為這是一個有效的HTML文檔。
\\最小的有效HTML文檔至少要有html、head、title和body四個元素,當你提供的內容中沒有這些元素時,解析器會自動建立,然后把它們放到合適的位置上。
\\在文檔解析過程中,使用Markup Service即可刪除或者重新排列DOM。例如,你可以整塊刪除html、body元素。你可以把head移動到body里面(但是這么做的話,文檔會被當作是無效文檔)。
\\在IE中,提供這個服務的類有很多,最普遍的類即CMarkup。負責“指向元素、區域”的Markup指針類名字是CMarkup Pointer,它們都派生自CBase。
\\如果有關注類似的內容的話,之前發的一個CMarkup Pointer空指針引用的問題其實就與此相關。
\\關于CMarkup Pointer,需要注意的地方是可能會導致IE崩潰或者出其他錯誤,比如:
\\(1)Markup Pointer剛創建,或者以一個無效對象為構造函數的參數創建的時候是未指向狀態,也就是說啥都沒指,通常這個值是0,這個很可能會導致空指針引用;
\\(2)Markup Pointer設置了指針粘滯(當當前指針所在區域發生移動之后,區域內的指針是否也跟著計算新位置)的時候,如果同時也設置重力(重力分為左右重力,簡單來說,就是在指針處插入一個內容,操作完之后,指針是應該貼著左邊的內容還是右邊的內容),且在經過某些操作后發生了歧義,在對Markup Pointer指向的部分進行移動、刪除過程后,Markup Pointer有可能會重新變成未指向狀態。這是因為指針指向的內容不存在或無效了,指針已經從文檔中移除(注意是remove)了,但是指針自身還沒有被刪除(delete),以后如果重用這個指針又沒做校驗的話,很可能就會出錯。
\\(3)Markup Pointer左右移動的時候也有可能出錯。
\\還有就是一個經驗條例,IE中代碼很依賴比較上層的有效性檢查,所以一旦中底層代碼接收到了無效數據,IE就很可能會出現異常。
\\還是重提一下關于Markup Service的內容,如果之前沒接觸過的話,最開始只了解個大概即可,之后等了解了更多IE相關的內容時,這一塊的東西才容易和其他部分聯系起來。
\\參考資料
\\(1) 騰訊反病毒實驗室:深度解析 AppContainer 工作機制
\\(2) Q\u0026amp;A: 64- Bit Internet Explorer
\\(3) Windows 8 Metro/Modern Style IE 10
\\(4) Enhanced Memory Protections in IE10
\\感謝魏星對本文的策劃和審校。
\給InfoQ中文站投稿或者參與內容翻譯工作,請郵件至editors@cn.infoq.com。也歡迎大家通過新浪微博(@InfoQ,@丁曉昀),微信(微信號:InfoQChina)關注我們,并與我們的編輯和其他讀者朋友交流(歡迎加入InfoQ讀者交流群)。
總結
以上是生活随笔為你收集整理的IE安全系列:IE浏览器的技术变迁(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错过了淘宝、拼多多,今年的电商风口抖音小
- 下一篇: MySQL 规范数据库设计