⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000008.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;lenx&nbsp;(冷·枫),&nbsp;信区:&nbsp;Linux&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;[安全]搞死NT/95又有新方法啦&nbsp;&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Fri&nbsp;Nov&nbsp;14&nbsp;19:57:20&nbsp;1997)&nbsp;<BR>&nbsp;<BR>不过也能搞死linux&nbsp;&nbsp;:(&nbsp;<BR>不过,&nbsp;linux的patch已经有啦&nbsp;:)&nbsp;<BR>&nbsp;<BR>Subject:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Linux&nbsp;IP&nbsp;fragment&nbsp;overlap&nbsp;bug&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thu,&nbsp;13&nbsp;Nov&nbsp;1997&nbsp;22:06:15&nbsp;-0800&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Helu.&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;wrote&nbsp;this&nbsp;post&nbsp;a&nbsp;while&nbsp;back&nbsp;when&nbsp;the&nbsp;bug&nbsp;was&nbsp;first&nbsp;discovered.&nbsp;&nbsp;It&nbsp;<BR>seems&nbsp;as&nbsp;though&nbsp;this&nbsp;bug&nbsp;(and&nbsp;patch)&nbsp;has&nbsp;gotten&nbsp;out,&nbsp;so&nbsp;here&nbsp;it&nbsp;is,&nbsp;in&nbsp;it's&nbsp;<BR>entirety.&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;As&nbsp;it&nbsp;happens,&nbsp;Linux&nbsp;has&nbsp;a&nbsp;serious&nbsp;bug&nbsp;in&nbsp;it's&nbsp;IP&nbsp;fragmentation&nbsp;module.&nbsp;<BR>More&nbsp;specifically,&nbsp;in&nbsp;the&nbsp;fragmentation&nbsp;reassembly&nbsp;code.&nbsp;&nbsp;More&nbsp;specifically,&nbsp;<BR>the&nbsp;bug&nbsp;manifests&nbsp;itself&nbsp;in&nbsp;the&nbsp;`ip_glue()`&nbsp;function....&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;Linux&nbsp;reassembles&nbsp;IP&nbsp;fragments&nbsp;to&nbsp;form&nbsp;the&nbsp;original&nbsp;IP&nbsp;datagram,&nbsp;it&nbsp;<BR>runs&nbsp;in&nbsp;a&nbsp;loop,&nbsp;copying&nbsp;the&nbsp;payload&nbsp;from&nbsp;all&nbsp;the&nbsp;queued&nbsp;fragments&nbsp;into&nbsp;a&nbsp;newly&nbsp;<BR>allocated&nbsp;buffer&nbsp;(which&nbsp;would&nbsp;then&nbsp;normally&nbsp;be&nbsp;passed&nbsp;to&nbsp;the&nbsp;IP&nbsp;layer&nbsp;proper).&nbsp;<BR>><I>From&nbsp;ip_fragment.c@376:&nbsp;</I><BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp&nbsp;=&nbsp;qp-&gt;fragments;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(fp&nbsp;!=&nbsp;NULL)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(count+fp-&gt;len&nbsp;&gt;&nbsp;skb-&gt;len)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_to_big;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy((ptr&nbsp;+&nbsp;fp-&gt;offset),&nbsp;fp-&gt;ptr,&nbsp;fp-&gt;len);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=&nbsp;fp-&gt;len;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp&nbsp;=&nbsp;fp-&gt;next;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;While&nbsp;it&nbsp;does&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;fragment&nbsp;length&nbsp;is&nbsp;too&nbsp;large,&nbsp;which&nbsp;would&nbsp;<BR>have&nbsp;the&nbsp;kernel&nbsp;copy&nbsp;too&nbsp;much&nbsp;data,&nbsp;it&nbsp;doesn't&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;fragment&nbsp;<BR>length&nbsp;is&nbsp;too&nbsp;small,&nbsp;which&nbsp;would&nbsp;have&nbsp;the&nbsp;kernel&nbsp;copy&nbsp;WAY&nbsp;too&nbsp;data&nbsp;(such&nbsp;is&nbsp;the&nbsp;<BR>case&nbsp;if&nbsp;fp-&gt;len&nbsp;is&nbsp;&lt;&nbsp;0).&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;To&nbsp;see&nbsp;when&nbsp;this&nbsp;happens,&nbsp;we&nbsp;need&nbsp;to&nbsp;look&nbsp;at&nbsp;how&nbsp;Linux&nbsp;adds&nbsp;IP&nbsp;datagrams&nbsp;<BR>to&nbsp;the&nbsp;reassembly&nbsp;queue.&nbsp;&nbsp;From&nbsp;ip_fragment.c@502:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Determine&nbsp;the&nbsp;position&nbsp;of&nbsp;this&nbsp;fragment.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;offset&nbsp;+&nbsp;ntohs(iph-&gt;tot_len)&nbsp;-&nbsp;ihl;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Ok.&nbsp;&nbsp;That's&nbsp;nice.&nbsp;&nbsp;Now&nbsp;we&nbsp;have&nbsp;to&nbsp;look&nbsp;at&nbsp;what&nbsp;happens&nbsp;when&nbsp;we&nbsp;have&nbsp;<BR>overlaping&nbsp;fragments...&nbsp;&nbsp;From&nbsp;ip_fragment.c@531:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;We&nbsp;found&nbsp;where&nbsp;to&nbsp;put&nbsp;this&nbsp;one.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Check&nbsp;for&nbsp;overlap&nbsp;with&nbsp;preceding&nbsp;fragment,&nbsp;and,&nbsp;if&nbsp;needed,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;align&nbsp;things&nbsp;so&nbsp;that&nbsp;any&nbsp;overlaps&nbsp;are&nbsp;eliminated.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(prev&nbsp;!=&nbsp;NULL&nbsp;&amp;&amp;&nbsp;offset&nbsp;&lt;&nbsp;prev-&gt;end)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;prev-&gt;end&nbsp;-&nbsp;offset;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;+=&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;ptr&nbsp;into&nbsp;datagram&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;+=&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;ptr&nbsp;into&nbsp;fragment&nbsp;data&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;we&nbsp;find&nbsp;that&nbsp;the&nbsp;current&nbsp;fragment's&nbsp;offset&nbsp;is&nbsp;inside&nbsp;the&nbsp;end&nbsp;of&nbsp;a&nbsp;<BR>previous&nbsp;fragment&nbsp;(overlap),&nbsp;we&nbsp;need&nbsp;to&nbsp;(try)&nbsp;align&nbsp;it&nbsp;correctly.&nbsp;&nbsp;Well,&nbsp;this&nbsp;<BR>is&nbsp;fine&nbsp;and&nbsp;good,&nbsp;unless&nbsp;the&nbsp;payload&nbsp;of&nbsp;the&nbsp;current&nbsp;fragment&nbsp;happens&nbsp;to&nbsp;NOT&nbsp;<BR>contain&nbsp;enough&nbsp;data&nbsp;to&nbsp;cover&nbsp;the&nbsp;realigning.&nbsp;&nbsp;In&nbsp;that&nbsp;case,&nbsp;`offset`&nbsp;will&nbsp;end&nbsp;<BR>up&nbsp;being&nbsp;larger&nbsp;then&nbsp;`end`.&nbsp;&nbsp;These&nbsp;two&nbsp;values&nbsp;are&nbsp;passed&nbsp;to&nbsp;`ip_frag_create()`&nbsp;<BR>where&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;fragment&nbsp;data&nbsp;is&nbsp;computed.&nbsp;&nbsp;From&nbsp;ip_fragment.c@97:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Fill&nbsp;in&nbsp;the&nbsp;structure.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp-&gt;offset&nbsp;=&nbsp;offset;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp-&gt;end&nbsp;=&nbsp;end;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fp-&gt;len&nbsp;=&nbsp;end&nbsp;-&nbsp;offset;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;results&nbsp;in&nbsp;fp-&gt;len&nbsp;being&nbsp;negative&nbsp;and&nbsp;the&nbsp;memcpy()&nbsp;at&nbsp;the&nbsp;top&nbsp;will&nbsp;end&nbsp;<BR>up&nbsp;trying&nbsp;to&nbsp;copy&nbsp;entirely&nbsp;too&nbsp;much&nbsp;data,&nbsp;resulting&nbsp;in&nbsp;a&nbsp;reboot&nbsp;or&nbsp;a&nbsp;halt,&nbsp;<BR>depending&nbsp;on&nbsp;how&nbsp;much&nbsp;physical&nbsp;memory&nbsp;you've&nbsp;got.&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;We&nbsp;can&nbsp;trigger&nbsp;this&nbsp;normally&nbsp;unlikely&nbsp;event&nbsp;by&nbsp;simply&nbsp;sending&nbsp;2&nbsp;specially&nbsp;<BR>fragmented&nbsp;IP&nbsp;datagrams.&nbsp;&nbsp;The&nbsp;first&nbsp;is&nbsp;the&nbsp;0&nbsp;offset&nbsp;fragment&nbsp;with&nbsp;a&nbsp;payload&nbsp;of&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -