- 1 -
中国科技论文在线
基于状态机的 SIP协议栈健壮性检测方法
张博*
作者简介:张博,(1985-),男,硕士研究生,主要研究方向,下一代网络安全
(北京邮电大学网络技术研究院,北京 100876)
摘要:为了避免有状态的 SIP 功能实体在对畸形 SIP消息进行解析前便将其丢弃,从而有效
的测试出 SIP 协议栈中存在的 BUG,本文提出一种基于状态的 SIP 协议栈健壮性检测方法,
即通过状态机将 SIP功能实体驱动到某一状态后,再发送畸形 SIP 消息。利用该方法实现了
SIP 协议栈健壮性检测系统,并对开源的 IMS 网络 OpenIMSCore 进行了测试,发现了 3个之
前不曾发现的内存溢出漏洞。
关键词:IMS;SIP;状态机
中图分类号:TP393
A Method Based on State Machine to Evaluate the
Robustness of SIP Stack
Zhang Bo
(Institute of Network Technology, Beijing University of Posts and Telecommunications,
Beijing 100876)
Abstract: IStateful SIP implementation may discard some SIP request message before parsing and
handling it at a wrong state. This situation brings some difficulty for evaluating the robustness of SIP
stack. In order to avoid this situation, this paper presents a evaluating method based on state machine.
This method firstly makes SIP state transit to a proper state, at which a SIP message will be handled by
SIP implementation certainly, after that a malformed SIP mesage is sent to SIP implementation.
According to this method, an evaluating system has been developded and used to test the robustness of
OpenIMSCore, an open source IMS network. And three memory leakage bugs were found.
Keywords:IMS; SIP; State Machine
0 引言
会话初始化协议(SIP[1])是一种应用层的信令控制协议,由于简单灵活,易于扩展和
实现,被 3GPP选做下一代网络的通信协议。为移动和固网融合以及电信和互联网融合提供
良好技术基础的 IP多媒体子系统(IMS[2]),采用 SIP作为其信令协议。
正是由于 SIP协议的灵活性,要想实现一个健壮的 SIP协议栈是比较困难的。除了 SIP
协议本身的可扩展性等影响着 SIP协议栈的健壮性之外,SIP功能实体中有限的计算资源也
将成为其健壮性的一个壁垒。当 IMS 网络遭受到畸形 SIP 攻击时,一旦进入拒绝服务状态
(DoS),将会对电信运营商造成巨大的影响。随着 IMS大规模部署的日益临近,如何能够
评价 IMS网络中 SIP协议栈的健壮性成为业界急需解决的难题之一。
目前采用较多的 SIP协议栈健壮性测试方法是通过向 SIP功能实体发送畸形 SIP消息,
然后检测 SIP协议栈的状态,一旦崩溃,则认为该协议栈中存在 BUG。大多数研究成果[3][4][5]
没有考虑到 SIP状态问题,只是简单的将畸形 SIP消息发送到该 SIP功能实体让其处理。然
而,IMS网络中的 SIP功能实体均为有状态的 SIP功能实体。如果没有做任何前提准备,便
直接向其发送 SIP消息的话,很有可能被抛弃掉,而不是被 SIP协议栈解析处理,这样的话
很难发现 SIP协议栈中存在的 BUG。
本文的研究目的在于提出一种基于状态机的 SIP协议栈健壮性检测方法。利用该方法,
可以在将 IMS 网络中的协议栈驱动到某一个恰当的状态,之后再发送畸形 SIP 消息,这样
- 2 -
中国科技论文在线
能够更多的发现 SIP协议栈中存在的 BUG。
1 背景介绍
SIP(Session Initiation Protocol)是一个应用层的信令控制协议。用于创建、修改和释放
一个或多个参与者的会话。这些会话可以好似 Internet多媒体会议、IP电话或多媒体分发。
SIP消息由三部分组成,即:开始行(start line),消息头(header)和消息体(body),
如图 1所示。开始行的内容根据 SIP消息是请求还是响应而有所不同。若是请求,则称为“请
求行”;若是响应,则称为“状态行”。
图 1 SIP请求消息示例
Fig. 1 An example of SIP request message
请求中的开始行通常被称为请求行,由三个部分组成:方法名、请求 URI和协议版本。
彼此之间由单个空格符分开。
响应中的开始行通常被称为状态行,由三部分组成:协议版本、状态码以及原因短语。
彼此之间由单个空格符分开。
消息头字段包含与请求有关的信息,如请求的发起者、接收者和呼叫标识等。消息头字
段也可以指示消息正文的特征。消息头字段的格式如下:Header-name: header-value。
消息体可以携带任何基于文本的信息,而请求的方法和响应的状态码决定了消息正文该
如何解释。当描述一个会话时,典型的 SIP消息体是一个会话描述协议(SDP)消息。上图
中的消息体部分即为 SDP的一个典型例子。
2 基于 SIP状态机的 SIP协议栈检测方法
IMS网络中的 CSCF都是有状态的 SIP实体。为了充分测试 CSCF中 SIP协议栈的健壮
性,较理想的方法是确保测试用的 SIP消息被 SIP协议栈处理,而不是直接被丢弃。对于 IMS
来讲,只有 REGISTER和 OPTIONS消息不需要任何前提条件就能够被处理;而其它消息,
如 INVITE,MESSAGE,200OK 等都需要在某一合适的状态下才会被处理。因此,需要一
个状态机能够驱使 IMS 状态机转移到某一个合适的状态,然后发送相应请求消息类型的畸
形 SIP消息。
- 3 -
中国科技论文在线
SIP协议中的状态机
每一类 SIP请求消息都对应着一个合适的状态,图 2描述了六种基本 SIP请求消息对应
的合适状态。节点表示状态机所处的状态,边表示能够促使状态转移的事件。
S:
RE
G
IS
TE
R
R:180ri
ngingR:200O
K
S:REG
ISTER
M
ESSAGE
图 2 SIP状态转换图
Fig. 2 SIP state transition diagram
上图总共包含六个状态, INIT, AUTH, REG-SUC, PROCEEDING, SUCCESS 和
ACTIVE,以及六种 SIP请求消息,包括 REGISTER,INVITE,CANCEL,BYE,MESSAGE,
和 OPTIONS。
INIT:初始状态,该状态下用户可以发起注册事件,然后状态机向 IMS 网络发送
REGISTER消息发起注册请求;此状态下状态机也可以发送 OPTIONS,询问服务器的能力。
AUTH:等待授权,存在于需要授权认证的 IMS网络中,等待 IMS网络对其 REGISTER
消息的授权确认(200OK)。一旦接收到 200OK,则转入 REG-SUC状态。
REG-SUC:注册成功,处于该状态的用户已经成功登录到 IMS系统中,并可以发起呼
叫请求或者短消息,此时状态机会向 IMS网络发送 INVITE消息和和MESSAGE消息。
PROCEEDING:等待对方确认,用户发起呼叫请求后,等待对方响应的状态,如果接
收到来自 IMS网络的 200OK则进入 SUCCESS状态;如果接收到用户在自己的挂断事件,
则继续发送 CANCEL消息并转入 REG-SUC状态。
SUCCESS:对方确认,此时如果向对方回复 ACK消息,则呼叫被建立起来,然后转入
ACTIVE状态,即通话状态;如果接收到用户的挂断事件,则发送 BYE消息后转入 REG-SUC
状态。
ACTIVE:通话状态,此时可以接受用户的挂断事件,然后向 IMS网络发送 BYE消息
后转入 REG-SUC状态。
该状态机支持用户注册、呼叫发起、呼叫拆除,以及解注册等基本功能,因此能够对
IMS网络进行各种 SIP请求消息的测试。
检测系统中的状态机特点
本文的应用场景不同于普通 SIP终端的地方有二:
1. SIP终端除了能够作为主叫方发起呼叫之外,还能够作为被叫方接受来自其它 SIP终
端的呼叫请求。而本文中的 SIP状态机作为测试机器而用,仅仅需要具备主动呼叫功能即可
- 4 -
中国科技论文在线
完成对所有请求消息的测试。因此,上图并没有标识当接收到来自 IMS网络的请求消息时,
SIP 状态机的对应动作,所以上图中的请求消息都是发送(S)出去的,而响应消息都是接
收(R)到的。
2. 为了将测试过程自动化,状态机的驱动事件除了来自 IMS网络的响应消息之外,还
包括来自用户的输入事件。为了保证能够驱动状态机发送请求消息的用户输入事件(如,注
册、呼叫、挂断等)由程序自动完成,需要针对某一种请求消息,设计一系列连续的事件并
由程序自动读取并驱动状态机运转。连续事件之间的发生间隔可以通过定时器进行设置。例
如,当要测试 INVITE 消息之时,选择 REG-SUCÆPROCEEDINGÆREG-SUC 这个最短的
状态转移环作为测试路径,那么输入事件序列则为:
注册Æ呼叫Æ挂断
注册,驱动状态机将状态从 INIT转移到 REG-SUC,为发送 IVNITE消息提供状态基础;
呼叫,促使状态机发送一条 INVITE 消息,由于要测试畸形消息对 IMS 的影响,因此
此时发送的为畸形 INVITE消息;
挂断,促使状态机发送 CANCEL消息,驱动状态机恢复到 REG-SUC 状态,为测试下
一条畸形 INVITE消息做准备。
由于要通过发送多条不同的畸形 INVITE消息,因此需要多次循环执行“Æ呼叫Æ挂断”
的事件。每执行一次“Æ呼叫Æ挂断”,状态机将选择一条不同的畸形 INVITE消息。
3 SIP协议栈健壮性检测系统设计
系统模块设计如图 3所示,其中通信模块用于发送和接受SIP消息;状态机模块依照设
计模式中的状态模式实现了 SIP状态机,并通过调用通信模块发送 SIP请求消息和接收 SIP
响应消息;文件访问模块支持对文件的快速访问;管理模块从配置文件中读取配置参数。
图 3 检测系统架构图
Fig. 3 Evaluating System Architecture
通信模块
通信模块封装了 Socket的相关函数,对外提供统一的发送和接收的接口。
发送接口:用户调用发送接口时,仅仅需要指定对方 IP 地址和端口号以及要发送的消
息即可,而省去了端口绑定,连接等一些列 Socket操作。
接受接口:采用消息驱动模式,当有新消息到来的时候,通信模块会主动调用某个函数,
比如 OnMessage,并将新消息作为参数传入,用户仅需要在 OnMessage 中完成具体的操作
即可。
- 5 -
中国科技论文在线
状态机模块
由于该状态机包含六个状态,每个状态也有一个到多个的转移路径,因此采用设计模式
中的状态机模式是较理想的选择。图 4展示了该 SIP状态模式的类图设计。
+getRequestEvent()
+getResponseEvent()
+Handle()
-m_curState : State
Context
+Handle()
-m_name : string
State
1 *
+Handle()
AUTH
+Handle()
REG-SUC
+Handle()
PROCEEDING
+Handle()
SUCCESS
+Handle()
INIT
+Handle()
ACTIVE
图 4 状态模式类图
Fig. 4 Class Diagram of State Pattern
其中基类 State包含虚函数 Handle。Handle负责接收事件(包括请求事件、响应事件以
及定时器),并作出相应的处理。六个继承于 state 的状态子类分别代表了状态机中的六个
不同状态,因此均需要重写基类中的 Handle函数。Handle函数根据接收到的消息事件类型,
做出相应的处理,并负责转移到下一个状态。不同的状态子类完成的功能不同,表 1列举了
不同状态子类中的 Handle函数,以及对应不同接收消息时所采取的处理方法及其返回值。
表 1状态子类及其对应的 Handle函数
Tab. 1 State subclass and their Handle function
状态名 接收事件 处理方法 返回值下个状态
注册 发送 REGISTER AUTH INIT
功能查询 发送 OPTIONS INIT
200OK - REG-SUC AUTH
超时 - INIT
呼叫 发送 INVITE PROCEEDING REG-SUC
短消息 发送MESSAGE REG-SUC
180ing - PROCEEDING
200OK - SUCCESS
挂断 发送 CANCEL REG-SUC
PROCEED
ING
超时 - REG-SUC
挂断 发送 BYE REG-SUC SUCCESS
超时 发送 ACK ACTIVE
挂断 发送 BYE REG-SUC ACTIVE
超时 发送 BYE REG-SUC
注:-表示不需要进行处理
Context 类包含类型为 State 的成员变量,用于记录状态机所处的当前状态。Context 的
成员函数Handle负责捕获事件信息,并通过调用当前状态的Handle函数完成状态机的转移。
捕获的事件从两个线程独立获取,一个是 getResponseEvent,通过通信模块接收到来自 IMS
网络的响应消息;另一个是 getRequestEvent,从配置文件中获取用户的输入事件列表。输入
事件列表用来模拟用户行为的一系列事件。由于在确定了要利用哪种 SIP请求消息进行测试
之后,状态机的转移流程就确定了,因此驱动状态机转移的输入事件顺序也确定了。因此,
- 6 -
中国科技论文在线
可以实现将这些事件按顺序写进配置文件中,每次程序执行的时候先从配置文件中读取出用
户输入事件列表以及各事件之间的间隔,之后便可以根据这些信息来模拟用户的输入行为
了。图 5描述了该事件分发过程。
获取请求事件线程 处理事件线程获取响应消息线程 事件队列
AddResponseEvent
AddRequestEvent
OK
OK
getEvent
Event
图 5 事件交互图
Fig. 5 Event Interaction Diagram
事件队列,共享变量,用于存储当前需要处理的事件,包括用户输入事件和 IMS 网络
响应消息事件;
获取请求事件线程,用于读取用户的输入事件,并将其写入事件队列中;
获取响应消息线程,用于接收来自 IMS网络的响应消息,并将其写入事件队列;
处理事件线程, 即 Context类中的 Handle函数,当获取到一个事件后,将其传给当前
状态类的 Handle函数,从而完成状态的转移和消息的发送。
典型的检测系统与 IMS网络之间的信令交互流程如图 6所示:
图 6 SIP信令交互图
Fig. 6 SIP Interaction Diagram
- 7 -
中国科技论文在线
如果下一个事件为用户输入事件,则根据当前状态,向 IMS 网络发送一个请求消息,
并转移状态;如果是一个响应消息,则根据当前状态,转移到下一个状态;至于定时器事件,
则在每个状态类中的 Handle函数中自动完成的。
图中仅仅列出了部分 SIP请求消息,如有必要可以根据状态机的转移图画出其它请求消
息的流程图。
4 实验结果及分析
该系统于 linux环境下实现,采用 Proto-c07[3]中提供的畸形 INVITE消息作为测试用例,
对开源 IMS 网络 OpenIMSCore[6]进行了测试。该系统发现了三个之前未曾发现的内存泄漏
的 BUG,而利用 Proto-c07对 OpenIMSCore进行测试,并没有发现这些 BUG。
究其原因,本系统利用 SIP状态机,首先向 IMS网络发送 REGISTER消息进行注册,
然后才发送畸形 INVITE 消息。此时 OpenIMSCore 认为应当处理该 INVITE 消息,而恰好
IMS网络中存在该 BUG时,便能够被发现。而 Proto-c07在发送 INVITE消息之前并没有发
送 REGISTER消息,这样的结果是 OpenIMSCore会认为该用户不具备发送 INVITE消息的
资格,从而将其直接丢弃掉。如果该畸形消息不会被 SIP协议栈解析的话,即使其存在 BUG
也不会被触发。
5 结论
本文介绍了一种基于状态机的 SIP 协议栈健壮性检测的方法。该方法能够将 IMS 网络
中的 SIP状态机驱动到某个恰当的状态,在此状态下发送畸形 SIP消息,能够更加有效的测
试 IMS网络中 SIP协议栈的健壮性。通过对比实验,证明该系统在测试 IMS网络 SIP协议
栈的健壮性方面,具有一定的应用价值。
[参考文献] (References)
[1] ,Henning Schulzrinne, et al. SIP:Session Initiation Protocol. IETF RFC 3261[S].
2002.
[2] Miikka Poikselka,Georg Mayer,Hisham Khartabil等.《IMS:移动领域的 IP多媒体概念和服务》. 机械工
业出版社.2005.
[3] C. Wieser, M. Laakso, and H. Schulzrinne. SIP Robustness Testing for Large-Scale Use. In SOQUA/TECOS,
pages 165–178, 2004.
[4] Geneiatakis, D., Kambourakis, G., Dagiuklas, T., Lambrinoudakis, C., Gritzalis, S., A framework for detecting
malformed messages in SIP networks ,In proc. of IEEE, 2005.
[5] H. Srinivasan and K. Sarac. A SIP Security Testing Framework. In Proceedings of the IEEE Consumer
Communications and Networking Conference, pages 1-5, Las Vegas, Nevada, USA, 2009.
[6] Open IMS Core.[Online:].