4、SIP协议安全机制:认证、加密与威胁全景

聊到SIP协议的安全,我得先跟你交个底——SIP协议本身在设计之初,对安全的考虑其实并不算周全。它更像是一个“先跑起来再说”的协议,很多安全机制都是后来打补丁加上去的。我在做VoIP渗透测试时,见过太多因为没配好安全机制而被攻破的系统了。

这一节,咱们就掰开揉碎,把SIP的认证、加密手段,以及那些常见的攻击手法,一次性讲清楚。

4.1 SIP认证机制:Digest认证

SIP最常用的认证方式就是HTTP Digest认证。说白了,就是用挑战-响应的方式验证身份,避免明文传输密码。

流程其实很简单:

  1. 客户端发请求(比如REGISTER或INVITE),不带认证信息。
  2. 服务器返回401 Unauthorized,附带一个随机数(nonce)。
  3. 客户端用密码和nonce算出一个哈希值,再发回去。
  4. 服务器验证哈希值,通过则放行。

嗯,这里要注意:Digest认证虽然不传明文密码,但它防不了中间人攻击。如果攻击者截获了认证报文,是可以做重放攻击的。我曾在一次项目中,用Wireshark抓包,直接重放了一个REGISTER请求,就成功注册了一个不存在的用户——因为服务器没配防重放机制。

核心要点:Digest认证只是“比没有强”,不是银弹。生产环境中一定要配合nonce计数或时间戳使用。

4.2 SIP加密:TLS与S/MIME

认证搞定了“你是谁”,但解决不了“别人能不能偷看你的通话内容”。这时候就需要加密上场了。

4.2.1 TLS加密

TLS(Transport Layer Security)是SIP信令加密的主力。它工作在传输层,加密整个SIP消息流。我个人习惯在SIP trunk对接时,强制启用TLS,否则抓包就能看到所有SIP消息,包括认证哈希值——虽然哈希值不能直接还原密码,但足够做重放攻击了。

配置TLS时,有几个坑:

  • 证书验证不能跳过:我见过有人图省事,把证书验证关了,结果TLS形同虚设。
  • TLS版本要选对:别用SSLv3或TLS 1.0,已经被攻破了。至少TLS 1.2起步。
  • 双向认证更安全:服务器验证客户端证书,能防止伪造UA接入。

避坑指南:我曾经遇到一个客户,TLS配好了但通话质量极差。排查半天发现是TLS握手太频繁——他们没配会话复用。加上session ticket后,问题解决。

4.2.2 S/MIME加密

S/MIME(Secure/Multipurpose Internet Mail Extensions)是另一种思路——它加密的是SIP消息体,而不是整个传输通道。比如,你可以用S/MIME加密SDP中的媒体密钥,防止别人窃听通话内容。

但说实话,S/MIME在SIP领域用得不多。为什么?因为证书管理太麻烦。每个UA都要有自己的证书,还要做公钥分发。我在实际项目中,几乎没见过大规模部署S/MIME的SIP系统。TLS才是主流。

注意:S/MIME只加密消息体,不加密SIP头域。攻击者仍然能看到From、To、Call-ID等信息。所以别指望它保护隐私。

4.3 SIP安全威胁概述

好了,讲完防御手段,咱们来看看攻击者都在干什么。我按攻击目标分四类来讲。

4.3.1 注册劫持

这是SIP系统最常见的攻击之一。攻击者伪造REGISTER请求,把自己的UA地址绑定到别人的SIP URI上。后果?所有打给受害者的电话,都会转到攻击者那里。

为什么会这样?因为很多SIP服务器默认不验证REGISTER请求的来源IP。我做过一个实验:在同一个内网里,直接发一个REGISTER请求,把用户A的Contact头改成我的IP,服务器就接受了——没有任何额外验证。

防御方法:

  • 启用Digest认证(必须的)
  • 限制REGISTER请求的源IP范围
  • 使用IP白名单或VPN

4.3.2 会话篡改

攻击者截获SIP信令后,修改SDP中的媒体地址或端口,把通话重定向到自己的设备上。这种攻击在未加密的SIP网络中非常容易实现。

我记得有一次做红队演练,我用ettercap做ARP欺骗,截获了SIP信令,然后把SDP中的c行IP改成了我的RTP代理服务器地址。结果?通话双方都以为在直接通话,实际上所有语音流都经过了我的机器——我不仅能听,还能录。

防御关键:使用TLS加密信令,使用SRTP加密媒体流。双管齐下,会话篡改基本就废了。

4.3.3 消息体修改

这个和会话篡改类似,但范围更广。攻击者可以修改SIP消息中的任何字段——比如修改From头域冒充他人,修改Expires头域让注册立即过期,甚至插入恶意SDP参数导致UA崩溃。

你想想看,如果攻击者修改了INVITE请求中的Content-Type头,从application/sdp改成text/plain,UA解析SDP时就会出错,直接拒绝通话——这就是一种拒绝服务。

防御方法:

  • TLS加密传输
  • S/MIME签名消息体
  • 在SBC(Session Border Controller)上做SIP消息合法性校验

4.3.4 拒绝服务攻击

DoS攻击在SIP世界里花样很多。最经典的就是REGISTER洪泛——攻击者用大量伪造的REGISTER请求冲击服务器,导致CPU满载、内存耗尽,正常用户无法注册。

还有一种叫BYE攻击:攻击者伪造BYE请求,强制终止正在进行的通话。我见过一个案例,攻击者扫描到某个SIP中继的IP后,批量发送伪造BYE请求,导致整个公司的外呼系统瘫痪了半小时。

防御手段:

  • 限速(Rate Limiting):限制每个IP的请求频率
  • 黑名单/白名单:封禁恶意IP
  • SIP扫描检测:识别并阻断扫描行为
  • 使用SBC做流量清洗

4.4 知识体系总览

为了让你更直观地理解SIP安全机制和威胁之间的关系,我画了一张图:

SIP协议安全机制与威胁全景 安全机制 Digest认证(挑战-响应) TLS加密(传输层) S/MIME加密(消息体) 安全威胁 注册劫持 会话篡改 消息体修改 对抗 对抗 对抗 防御建议 1. 强制启用Digest认证,配合nonce计数防重放 2. 信令走TLS,媒体走SRTP,双加密保平安 3. 部署SBC做流量清洗和合法性校验 4. 限速+黑名单+异常检测,防DoS于未然 图:SIP安全机制与威胁对抗关系图

这张图把安全机制和威胁的对应关系画得很清楚。你仔细看——没有一种机制能防住所有攻击。Digest认证防注册劫持,但防不了会话篡改;TLS防会话篡改,但防不了应用层的DoS。所以,纵深防御才是王道

好了,SIP安全这块就聊到这儿。记住一句话:安全不是配一个功能就完事了,而是一个持续对抗的过程。你在实际项目中遇到什么奇葩的安全问题,欢迎来交流。