随着基于SIP协议应用的不断增多,其安全性能成为人们关注的焦点。在用户向注册服务器进行注册的过程中,如何验证用户的身份,从而防止恶意用户接收到本不属于他/她的内容;在SIP消息传输的过程中,如何防止恶意用户对该SIP消息进行修改,如何防止恶意用户对SIP消息的内容进行窃听;如何防止恶意用户发送虚假的消息,来对会话进行修改或者恶意结束会话,这些都是需要解决的安全问题。这些攻击可能造成会话双方(或多方)通话中私密信息的泄漏,也可能使用户在不知情的情况下与恶意用户建立会话,或者会造成会话的非正常中断,给会话参与者造成经济上或精神上的损失。
SIP协议面临的安全攻击
图1给出了基于SIP协议的会话建立过程,在这个过程中包含的SIP实体有SIP客户端(图中的UA)、SIP注册服务器以及SIP转发服务器。
在基于SIP协议的应用中,每个SIP客户端要与其他的客户端建立会话连接。它首先必须向SIP注册服务器进行注册,告诉注册服务器自己当前的具体地址信息,这个过程通过向注册服务器发送Register消息来完成,注册服务器向客户端UA返回200 OK消息,则表示注册成功。
客户端UA则会通过向目标UA发送INVITE消息来与该目标UA建立会话,例如Alice希望与Bob建立会话,那么Alice将向Bob发送INVITE消息,这个消息首先会被发送到Alice对应的转发服务器,该转发服务器将该INVITE消息转发给下一跳的服务器,最后当消息转发到Bob所对应的转发服务器之后,该服务器根据Bob注册的地址信息,将该INVITE消息发送到Bob当前的具体地址。Bob收到该消息之后,如果同意与Alice建立会话,则会返回一个200 OK消息,该消息通过各个转发服务器的传递,最后会发送到Alice,Alice向Bob返回一个ACK消息,从而Alice与Bob之间就建立了一个SIP会话。该会话建立后,通话双方根据会话建立过程中SDP报文协商的媒体传输的相应参数来建立媒体流通话,进行媒体流的传输。
在SIP会话建立的过程中,由于缺乏相应的身份认证机制和加密措施,就使得攻击者能够进行假冒身份、窃听会话内容,修改SIP消息内容等多种安全攻击。
注册劫持攻击
在客户端UA向注册服务器进行注册的过程中,由客户端向注册服务器发送Register消息。在这个消息中,消息头To记录了客户端UA对应的SIP URI,例如sip:Alice@example.com,这个地址是其他UA知道的,籍以向Alice发起请求的URI;消息头Contact中记录了Alice当前的具体地址信息,例如sip:Alice@200.201.202.203。当注册服务器接收到这一注册消息之后,它将这一对地址信息存储在数据库中以备后来查询之用,同时向Alice返回200 OK消息,注册过程结束。
我们可以看到,由于在注册过程中缺少身份验证机制,攻击者可以很容易伪造假的注册消息。例如恶意UA Trudy希望截获发往Alice的会话请求,那么它就可以通过向注册服务器发送一个伪造的注册消息来达到这一目的,这被称为注册挟持。在这个假的注册消息中,它将To消息头的内容填为sip:Alice@example.com,然后将Contact的内容填为自己的具体地址,如sip:Alice@100.101.102.103,如图2所示。当注册服务器将此注册信息加入到数据库中后,那么以后发往Alice的会话建立请求都会发向Trudy。这样就造成了Alice的SIP客户端不可用,Trudy也可以对发往Alice的会话建立请求进行记录与监听,这会损害到会话双方的私密性。在基于SIP的VoIP应用中,Trudy还可以通过设置Voice Mail系统来诱使会话请求者留下语音消息。Trudy也可以将接收到的对Alice的会话请求转发给Alice,这样Trudy就可以完成中间人(Man in The Middle)攻击,在会话双方进行通话的同时对会话双方的信令通信内容与媒体通信内容进行监听与修改。
假冒客户端UA攻击
在注册劫持攻击中,恶意的UA可以达到假冒其他UA的目的,这种假冒UA的攻击是在别人向被攻击UA发起会话建立请求时实现的。攻击者也可以假冒别的UA,以被攻击者的身份主动向其他的UA发起会话建立请求或修改已经存在的会话的属性。
当Alice想与Bob建立SIP会话时,Alice就向Bob发出一个INVITE消息。在这个INVITE请求消息中,From消息头标识了发送此INVITE消息的UA,例如Alice发送的INVITE消息的From消息头中就带有sip:Alice@example.com的信息(From消息头中还带有其他信息如tag等)。但由于这个SIP消息头是由UA来设定填写的,而且在SIP会话建立过程中,各个SIP实体之间没有验证彼此身份的机制,因此恶意的UA就可以通过修改此消息头来达到攻击的目的。例如攻击者Trudy将自己INVITE消息的From消息头sip:Trudy@malicious.com修改为sip:Alice@example.com,并将此INVITE消息通过SIP服务器发送给Bob,由于SIP服务器与Bob都无法验证该From消息头是真是假,它们都会认为是Alice发起了这个SIP会话。从而Trudy就达到了假冒Alice与Bob建立会话的目的。
这种通过假冒某个UA来与其他UA建立会话的攻击可能造成被攻击UA与会话中的其他UA私密信息的泄漏。另外一个严重的后果就是攻击者可以以被攻击者的身份发送假的消息,修改或中断被攻击者与其他UA已经建立的会话。例如当Alice与Bob已经建立了SIP会话,开始进行媒体流的传输,攻击者Trudy此时分别冒充Alice与Bob的身份向Bob与Alice各发送一个BYE消息,如图3所示。Alice与Bob会认为是对方发起了中断对话的请求,从而断开连接,结束会话。这种攻击会使得已经建立的会话意外中断或改变,有时会带来很严重的后果。
假冒服务器攻击
SIP客户端UA与SIP服务器(包括注册服务器,转发服务器与重定向服务器)进行通信时,并没有验证服务器的身份。服务器之间进行相互通信的时候,也缺乏相应的身份验证机制,因此攻击者假冒服务器的攻击也是SIP协议所面临的风险之一。
假冒服务器的攻击与假冒客户端UA不一样,它不是对SIP消息的改动,而是一般通过DNS哄骗攻击,或ARP缓存哄骗等攻击来实现。攻击者通过假冒服务器攻击能够实现对通过它的所有SIP消息的监听,能够随意地修改通过它的SIP消息,它也可以通过丢弃相应的SIP报文来使某些UA不可达,还可以通过发送假的SIP消息来使来中断会话或者修改会话。
假冒服务器的攻击将会导致攻击者对经过它的SIP消息与相应的SIP会话有完全的控制。
消息的完整性与机密性攻击
SIP协议没有设计相应的机制来保证SIP消息的完整性。在SIP消息的传输过程中,攻击者可以截获该SIP消息,并对该消息进行修改,再将修改过的消息发给该SIP消息对应的下一跳SIP实体。SIP消息完整性的攻击可以通过上面所说的注册劫持来实现,也可以通过假冒服务器来实现,这些都是通过对SIP实体进行攻击来实现的。SIP消息的完整性攻击也可以在SIP消息的传输链路上实现,通过在链路上截获传输的SIP消息,对其进行修改之后再发送给下一跳SIP实体。由于SIP服务器在转发SIP报文的过程中需要对SIP报文进行处理(例如修改SIP消息中的Via消息头),那么SIP服务器的误操作也可能造成对SIP消息的完整性攻击。
在SIP会话建立过程中,SIP消息是以明文的形式进行传输的,这就使得攻击者可以很轻易地通过对链路进行监听,截获SIP报文得到SIP报文中的信息。对SIP消息传输路径上的各个SIP实体来说,整个SIP消息的内容都是可见的,所以被攻击的服务器能够获得完整的SIP消息。
SIP消息完整性攻击可能造成会话的不能正常建立,例如攻击者通过修改SIP消息中SDP报文所描述的端口参数信息就能够使得后续的媒体流会话不能正常建立,攻击者也可以通过修改SDP报文使得媒体流消息被发送到攻击者的地址与端口。SIP消息机密性攻击使得攻击者能够掌握被攻击UA的会话情况,如什么时间与谁进行通信,在哪个地址端口进行媒体流会话,这些都会损害到会话双方的私密性,这些信息会被攻击者利用造成进一步的攻击。