手机终端Android4.0用户认证失败分析报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手机终端Android4.0用户认证失败分析报告
手机终端Android4.0认证失败
分析报告
1 问题描述
现场版本: V1.2.1
故障主题: 使用android4.0系统进行WLAN业务上网时,无法通过认证
故障详细描述: android4.0系统的手机在中兴WLAN的热点下,进行WEB进行认证时,无法认证成功,而在其他厂家的热点下,可以正常认证。
2 故障分析
通过现场在安卓手机和AC下行的抓包分析,发现认证不通过的原因是AC给用户发送的302重定向报文长度异常,即丢失了后半部分的内容,导致用户无法通过认证。
进一步分析发现,在用户和AC建立TCP连接的3次握手中,终端和AC协商使用了window size的扩展属性Window scale,最终由于该属性AC实际不支持,导致了故障发生,具体分析如下:window size在TCP中占两个字节,正常情况最大为65535 Byte。
同时,RFC 1323中定义了Window scale option字段(取值范围为0-14,通过window size的大小左移Window scale的值计算实际的window size),使最大的window size增加到1Gbyte(216<<14 = 230)。
window scale可选项只在TCP 3次握手期间使用,并且需要两端均在syn报文中添加此属性才可生效。
终端和AC建立TCP连接的三次握手时的window size协商流程:终端AC
由终端向AC发起一个TCP SYN握手报文[flag=0x02]
报文中的option字段中标识了window scale属性,
表示终端支持这个属性
同时终端标识了自己的win窗口大小
AC收到握手报文后,给终端回一个SYN和ACK,这两
个报文被合并在一起发送[flag=0x12]
报文中的option字段中,如果标识了window scale
属性,表示AC也支持该属性。
如果字段中没有标识
window scale属性,则表示AC不支持该属性
同时AC也标识了自己的win窗口大小
终端收到AC的SYN后,给AC回复一个ACK,代表三
次握手完成,TCP连接建立[flag=0x10]
终端根据前两次的协商结果,来确定自己的win值,
告知AC。
1.I9308 android 4.0手机系统
a)sta 的syn报文,window size大小为0x3908 = 14600,同时
在syn报文中携带window scale(值为64);
b)AC响应的syn ack报文,window size大小为8192,同时在
syn报文中携带window scale(值为0),通知对端AC也支持window scale属性。
c)STA响应的ack报文,window size大小为229,由于在AC在syn-ack报文中携带过window scale option,此时ACK报文的实际window size应该为229 * 26 = 14656。
d)而AC在收包时并未进行该可选属性的处理,直接按照ACK报文中的window size(229)来处理,由于302重定向报文(大约700字节)的大于229,所以报文长度只被限制在229,造成故障。
如上图,Content-Type:text/html后的部分丢失,正常情况下,还应该有javascript部分代码。
2.I9228 android 2.3手机系统
a)sta 的syn报文,window size大小为0x16D0 = 5840,同时
在syn报文中携带window scale(值为2);
b)AC响应的syn ack报文,window size大小为8192,同时在
syn报文中携带window scale(值为0),通知对端AC也支持
window scale属性
c)STA响应的ack报文,window size大小为1460,由于在AC 在syn-ack报文中携带过window scale option,此时ACK报文的实际window size应该为1460*22 =5840。
d)AC直接按照ACK报文中的window size(1460)来处理,由于302重定向报文的小于1460,所以此时报文长度正常,也就android2.3手机可正常认证的原因。
假设重定向报文大小为600字节,那么当2x> 5840/600时,也就是syn报文中的window scale 大于4时,那么也会造成重定向报文分片。
3.I9308 android
4.0系统内核升级后
a)STA的syn报文,Option字段中的携带window scale属性,
且值为1
b)AC对终端的SYN/ACK报文中,option字段也携带window scale
属性,且值为0,并且声明自己的window size为8192
c)TCP握手的最后一步终端回给AC的ACK中,根据a)中协商的
scale为1的情况,告知AC自己的window size为7300,实际是7300×21=14600。
d)由于AC只能解析7300这个系数,并不能正确解析为14600,
但由于7300本身足够大,比重定向报文的700多字节要大很多,
所以AC发给用户的重定向报文长度正常,后半部分不会丢失。
认证可以通过
上图可以看出,Content-Type: text/html后部分没有丢失,这
样的重定向报文才可以被手机解析并进行从定向推送Portal操作。
3 原因分析:
1、AC不支持window size scales属性,但是和终端协商时却声明支持该属性,造成终端使用该属性而AC不识别scales,只能识别其系数当作window size的值。
2、由于安卓4.0版本较2.3版本,在TCP协议栈在建立TCP握手时,其scales值由2.3版本的value=2,变更为value=6,导致安卓4.0协商的系数远远小于2.3版本,造成window size值小于302重定向的报文长度。
以上两个原因,造成了安卓4.0版本在本AC上无法推出portal页面,而2.3版本可以推出。
4 结论及影响分析
安卓2.0和安卓4.0系统终端与AC TCP握手的ACK报文Window scale option字段中的Window scale携带的值,AC是不会根据此值来计算Window size的大小,而是直接提取报文中的Window size 值,而实际上终端是想服务器即AC通过报文中Window size乘以Window scale计算得出最终的Window size值,而终端认为AC 在SYN ACK 报文中携带了window scale属性则支持该属性,在ACK报文里面携带Window size值为229、window scale值为6,但对于AC只提取229,不计算229 * 26 = 14656,导致AC只回一个229的分片报文。
5 解决方案
补丁解决方法如下:
1,AC本身不支持window scale属性的处理,补丁会在相应的SYN ACK报文中,不携带window scale属性,即告知终端AC不支持window scale属性,则终端会以默认第一次握手的windows size
为准,可以解决该问题。
2、升级安卓4.0的最新内核,最新内核协议栈对于windows scale 的默认配置由6改为1,这样window size窗口系数较大,在AC没有升级的情况下,也可以解决该问题。