Rayhunter 启发式引擎详解:9 个 IMSI 捕食器检测分析器的原理、事件等级与配置
【免费下载链接】rayhunterRust tool to detect cell site simulators on an orbic mobile hotspot项目地址: https://gitcode.com/GitHub_Trending/ra/rayhunter
Rayhunter 的核心价值在于它内置的一组启发式分析器(analyzers),用于从热点设备捕获的 GSM/LTE 空口流量中识别 IMSI 捕食器(IMSI catcher,即伪基站/捕获设备)的攻击特征。本篇逐一走读doc/heuristics.md中记录的每个分析器:它们各自的检测逻辑、源码中的具体判定条件与事件等级,以及如何通过config.toml的[analyzers]段按需启用或禁用。读完后,你将能够解释 Rayhunter 每一条告警背后的协议依据,并针对所在网络的误报情况调整分析器组合。
分析管线:Harness 与 Analyzer 抽象
所有启发式共享同一个抽象层,定义在 analyzer.rs 中。每个分析器实现Analyzertrait:对每一条解析出的信息元素(InformationElement)调用analyze_information_element,可选地返回一个Event;Harness按AnalyzerConfig装配启用的分析器集合(见 Harness::new_with_config),逐包把元素分发给所有分析器,每个分析器独立产出一个事件槽位。
事件严重程度(severity)由EventType枚举定义(EventType):
| 等级 | 数值 | 含义 |
|---|---|---|
Informational | 0 | 仅记录,不触发屏幕/通知告警 |
Low | 1 | 低严重度警告 |
Medium | 2 | 中严重度警告(当前各分析器未直接使用) |
High | 3 | 高严重度警告,最可能是攻击特征 |
每个分析器还通过get_version()暴露一个只增不减的版本号,用于在分析报告中区分新旧逻辑;报告首行的ReportMetadata会记录本次分析所用各分析器的名称、描述与版本(当前报告格式版本为 2,见 REPORT_VERSION)。这也解释了文档中部分分析器标题后的(v2)、(v3)等标记——它们指的是启发式逻辑的修订代次(例如 IMSI Requested 在文档中标注为 v3,而 当前源码中get_version()返回 5,说明该启发式仍在持续迭代)。
全部 9 个分析器总览与默认状态
[analyzers]配置段与默认值定义在 AnalyzerConfig,与仓库中的配置模板 config.toml.in 一致:
# Analyzer Configuration # Enable/disable specific IMSI catcher detection heuristics # See https://github.com/EFForg/rayhunter/blob/main/doc/heuristics.md for details [analyzers] imsi_requested = true # IMSI Requested connection_redirect_2g_downgrade = true # Connection Release/Redirected Carrier 2G Downgrade lte_sib6_and_7_downgrade = true # LTE SIB6/7 Downgrade null_cipher = true # Null Cipher (RRC EEA0) nas_null_cipher = true # NAS Null Cipher incomplete_sib = true # Incomplete SIB test_analyzer = false # Test Analyzer(默认禁用) diagnostic_analyzer = true # Diagnostic Information no_nas_messages = false # No NAS Messages(默认禁用)这些开关既可以通过编辑设备上的/data/rayhunter/config.toml修改,也可以在 Web UI 的Analyzer Heuristic Settings中切换(详见 配置指南)。官方文档特别提醒:部分启发式是实验性的,或在某些区域网络(如美国与欧洲网络)中误报行为不同,因此可按需关掉误报严重的分析器。
IMSI Requested:状态机检测“要身份、不认证、就断开”
这是 Rayhunter 最重要的启发式(ImsiRequestedAnalyzer)。
背景:网络何时会合法地索要 IMSI
移动网络通常在以下场景请求 IMSI 或 IMEI 身份:设备初次开机(尤其长时间关机后)、重启后临时标识过期(TMSI/GUTI 失效)、长期无信号区域或飞行模式后重连、接入漫游网络、更换 SIM 卡、移动到新跟踪区/位置区后网络无法将临时标识映射到设备,以及核心网重启之后。网络会周期性重新分配临时标识以增强隐私、防跟踪,但通常不会为此索要 IMSI。文档同时指出:真正的 IMSI 捕获攻击链是:
- 手机连接到一座新基站;
- 基站索要手机身份(IMEI 或 IMSI);
- 认证(Authentication)没有发生;
- 基站要求手机断开连接。
监控这条事件链,比单纯监控“任何一次 IMSI/IMEI 上行”误报率低得多——这正是商用 IMSI 捕获器(执法使用的)采用的攻击方式。已知残余误报场景:飞机降落阶段,设备长时间断连后飞越无法路由回归属网络的基站,仍可能触发告警。
源码中的状态机
分析器维护六个状态:Unattached、AttachRequest、IdentityRequest、AuthAccept、Disconnect、LikelyValidAttachReject(见 State 枚举)。关键输入是 NAS/RRC 消息:
EMMAttachRequest、RrcConnectionRequest等进入AttachRequest;EMMIdentityRequest进入IdentityRequest;EMMAttachComplete/EMMAuthenticationResponse进入AuthAccept;RrcConnectionRelease、Detach、Service Reject 等进入Disconnect。
告警判定(transition 方法):
| 事件链 | 等级 | 告警文案(节选) |
|---|---|---|
| 认证完成后又收到身份请求 | High | "Identity requested after auth request" |
| 未先连接基站就索要身份 | High | "Identity requested without Attach Request" |
| 索要身份后直接断开、且属于归属网络 | High | "Disconnected after Identity Request without Auth Accept on home network!" |
| 索要身份后直接断开、但疑似漫游 | Low | 附 Tower/UE/SIM 三方 PLMN 对比信息 |
| 无效 SIM 的合理 Attach Reject | Low | 提示“除非你的 SIM 是有效套餐,否则可能是误报” |
| 身份请求后 50 个包内无认证跟进 | Informational | "Identity request happened without auth request followup" |
两个值得注意的设计细节:
- 归属网络加权:分析器会比对基站 SIB1 广播的 PLMN 与 UE 附着请求中的旧 TAI PLMN 及 SIM 卡中的归属 PLMN(
home_plmn,来自 EF_HPLMNwAcT,由 Harness 在装配时注入)。同样是“要身份→不认证→断开”,发生在归属网络上比发生在漫游网络严重得多,前者报 High、后者降为 Low 并给出三方 PLMN 便于人工研判。注释明确说明“宁可误报 High 也不漏报”,因为归属网络上的严重度更高。 - 超时计数器:进入
IdentityRequest后每处理一个包计数器加 1,达到 TIMEOUT_THRESHHOLD = 50 仍无认证跟进,则发一条 Informational 提示;任何认证成功会清零计数器。
文档还说明:在非可疑情形下每次身份被发送到网络时,该启发式也会发一条通知,用途是诊断(diagnostic)。
Connection Release/Redirected Carrier 2G Downgrade
该分析器检测基站释放你的连接并把设备重定向到 2G 基站的场景。部分 IMSI 捕获器的工作方式就是把连接降级到 2G,从而在 GSM 上实施中间人(MitM)攻击。
实现极为直接(ConnectionRedirect2GDowngradeAnalyzer):只关注 DL-DCCH 中的RrcConnectionRelease消息,解出 r8 扩展里的redirected_carrier_info:
- 若重定向目标是
Geran(即 GSM 载频列表),立即返回High事件 "Detected 2G downgrade"; - 其他 RAT 的重定向信息则降级为 Informational 记录,便于排查。
源码注释表明该启发式参考了 HITBSecConf 上 Lin Huang 的报告《Forcing a targeted LTE cellphone into an eavesdropping network》。
LTE SIB6/7 Downgrade (v2)
SIB(System Information Block)是 eNodeB 向所有设备广播的未加密、未认证的无线配置信息。攻击者可借此伪造系统信息,把本应停留在 4G 的设备驱赶到更不安全的 2G,进而窃取 IMSI 或实施 MitM——即“降级攻击”。
SIB6 用于向 CDMA2000 小区重选,现代手机大多不支持,因此 SIB6 消息较少见;SIB7 提供向 GSM/EDGE 重选的信息,畸形 SIB7 在现实中更常见。
实现(LteSib6And7DowngradeAnalyzer,基于 Shinjo Park《Why We Cannot Win》中的启发式 T7)的工作方式是优先级对比:
- 跟踪
lte_priority:从 SIB3(同频重选优先级)和 SIB5(LTE 异频频点列表中的优先级)中取最大值; - 跟踪
legacy_priority:从 SIB6(UTRA FDD/TDD 频点列表)和 SIB7(GSM 频点列表)中取最大值; - 每当遇到一条新的 SIB1(视为一次新的广播周期),重置两个计数器并做判定:
legacy_priority > lte_priority且 LTE 邻居存在 →High,文案形如 "LTE cell advertised a legacy (3G/2G) cell for priority X reselection over LTE neighbors at priority Y";legacy_priority > lte_priority但从未见到 LTE 邻居 → Informational。
文档强调:一个行为良好的基站总是把其他 4G 邻居的广告优先级放在 2G/3G 邻居之上;这一版本(v2)针对早期版本误报多的问题做了修正,即使在 2G 仍普遍的国家也适用。
Null Cipher:RRC 层建议关闭加密
正常商用网络中几乎从不使用空密码(null cipher,即 EEA0)——它基本只存在于实验室调试环境;加密协商失败或法规特批的应急场景是仅有的例外。而 IMSI 捕获器恰恰常用空密码,因为它没有合法密钥,建立不了安全上下文,诱骗设备走未加密链路可大幅降低窃听难度。
NullCipherAnalyzer 监听 DL-DCCH 中的两类 RRC 消息,检查其中任何一处密码算法字段是否为EEA0:
- RRCConnectionReconfiguration:覆盖三个位置——r8 扩展中的
security_config_ho(站内 LTE 或 Inter-RAT 切换两种分支)、v1250 扩展中 SCG 配置的ciphering_algorithm_scg_r12(SCG 分支),以及 v1530 扩展的security_config_ho_v1530(Intra5GC / 5GC↔EPC 三个分支); - SecurityModeCommand(RRC 层):检查
security_config_smc的密码算法。
任一处为 EEA0 即返回High事件 "Cell suggested use of null cipher"。注意该分析器只看 RRC 层;NAS 层的空密码由下一个分析器负责。
NAS Null Cipher:MME 在安全模式命令中要求 EEA0
NasNullCipherAnalyzer 检查 NAS 层的EMM Security Mode Command:若nas_sec_algo中的ciph_algo为EPSEncryptionAlgorithmEEA0Null,返回High事件 "NAS Security mode command requested null cipher"。
这一事件比 RRC 空密码更“诡异”:安全模式命令通常发生在设备已经成功完成与 MME 的认证之后,此时刻意要求空密码几乎不应发生。文档给出的可能解释包括:攻击者借助 SS7 从 HLR 获取了密钥材料从而能完成认证、伪基站通过与政府及电信运营商合作接入 MME/HLR,或极少数情况下运营商自身的配置/合规问题(例如某些国家禁止加密)。无论哪种,都值得一查。
Incomplete SIB:SIB1 的“不完整链条”
合法的 SIB1 应包含完整的时间调度表,覆盖至少两个后续 SIB(SIB3/4/5 最常见);而伪基站常常懒得发送 SIB1、SIB2 之外的内容。
实现(IncompleteSibAnalyzer)检查每条 SIB1 的scheduling_info_list,长度小于 2 时返回Informational事件 "SIB1 scheduling info list was malformed"。文档明确:单独看它可能只是配置错误的基站(野外只在可疑场景见过),但结合IMSI Requested等其他启发式同时触发时,就是恶意的强信号。
Diagnostic Information:IMSI 暴露类消息的“记录仪”
DiagnosticAnalyzer 不参与判定,而是把可能暴露 IMSI 的消息逐条记录下来,供分析可疑 PCAP 时使用。判定依据是 Marlin 论文归纳的 IMSI 暴露消息清单(源码注释写明 "Based on the list of IMSI exposing messages identified in the 'Marlin' paper"),包括:
- 一切
EMMIdentityRequest(IMSI/IMEI/IMEISV); - 带特定原因的
EMMTrackingAreaUpdateReject、EMMAttachReject、EMMServiceReject(如 IllegalUE、EPSServicesNotAllowed、TrackingAreaNotAllowed、RoamingNotAllowedInThisTrackingArea 等); - 非 IMSI Detach 类型的
EMMDetachRequestMO/MT。
每条命中都产生 Informational 事件("Diagnostic: EMM Attach Reject (…)" 等),文档建议:在没有低/中/高严重度告警出现前,这些 informational 警告可以安全忽略。
No NAS Messages(默认禁用,实验性)
这个分析器解决的是“SIM 根本没在工作”的问题:设备持续 5 分钟只有诊断流量、却没有任何 NAS(Non-Access Stratum,设备与核心网之间的信令层)消息时,说明 SIM 可能缺失、欠费停用、配置不当或接触不良——此时捕获虽然还能记录广播消息,但绝大多数依赖 SIM 信令的启发式都已失效,整段录制的价值大打折扣。
实现(NoNasMessagesAnalyzer)的几个关键机制,与文档描述一一对应:
- 用录制时间戳而非设备墙钟:窗口基于 QMDL 消息自带的时间戳测量(超时常量
NAS_TIMEOUT为 5 分钟),保证重新分析(reanalysis)时结果可复现; - 不可解码的消息也推进时钟:
report_skipped_packet被 Harness 在跳过包时调用,保证“收不到任何 NAS”的判断不被解析失败干扰; - 时钟跳变防护:时间戳回退、或单次前跳 ≥ 5 分钟(典型如 NITZ/GPS 校时)都被视为不连续,窗口重新开始计时(见 不连续检测逻辑);
- 只警告一次:一旦超时发出 Low 事件 "No NAS messages seen in 5 minutes, SIM possibly not working",或一旦观察到任何一条 NAS 消息,该录制内分析器即永久关闭;
- 完全没有任何诊断消息的录制无法触发它(没有可测的 5 分钟);录制进行中 Web UI 的“5 分钟无诊断消息”提示是独立功能,不属于任何保存的报告。
配套的单测覆盖了超时触发、NAS 消息关闭分析器、时间戳回退重开窗口、前跳重开窗口、小间隙不重开窗口等场景(tests 模块),可以推断该时间窗口逻辑的边界行为是经过严格测试的。文档同时声明这是实验性启发式:设备能收到射频流量但所处网络不产生 NAS 流量时可能误报。
Test Analyzer(默认禁用)
用于验证 Rayhunter 安装是否工作:每收到一条 SIB1(基站的“信标”广播)就发一条 Low 告警,内容是解码出的小区标识与位置信息(告警格式):"SIB1 received CID: {}, TAC: {}, PLMN: {}-{}"(MCC 固定 3 位,MNC 支持 2/3 位)。文档明确说明它刻意设计得非常吵闹,只建议临时打开自检、不要长期开启;只要它能告警,就证明设备抓取与解析链路是通的。
误报治理与告警组合策略
综合文档与源码,实际部署时的建议是:
- 以事件等级定优先级:
Informational不触发告警,只进报告;Low/Medium/High 才会体现为屏幕红线与通知。因此incomplete_sib、diagnostic_analyzer大量产生 Informational 属预期行为。 - 组合判断:单一分析器(尤其 Incomplete SIB)单独触发不足以定罪;
imsi_requested(High,归属网络变体)+ 空密码 + 不完整 SIB 同时出现,则恶意概率显著上升。 - 按网络环境裁剪:配置文档指出美国与欧洲网络下各启发式误报行为存在差异;
imsi_requested在飞机降落场景有已知误报;no_nas_messages属实验性、默认关闭。若某区域误报严重,可单独关闭对应开关,并留意新版版本对误报的改进(分析器版本号即用于区分新旧逻辑)。 - 报告可追溯:分析输出(ndjson 报告)首行记录各分析器名称、描述与版本,后续行按包记录事件,因此任何一条历史告警都能回溯到当时使用的具体启发式版本。
小结
Rayhunter 的检测能力来自这 9 个各司其职的分析器:状态机式的 IMSI Requested 抓“要身份、不认证、就断开”的核心攻击链,两级 2G 降级检测(信令重定向 + SIB 优先级)覆盖显式与隐式降级,RRC/NAS 双重空密码检测封堵“未加密链路”路径,Incomplete SIB 与 Diagnostic 提供旁证与诊断,No NAS Messages 与 Test Analyzer 则分别守护录制有效性与设备自身健康。所有分析器共享统一的Analyzertrait、事件等级体系与版本化报告格式,并通过[analyzers]段实现细粒度启停——这套设计让启发式的每一次演进都能被报告中的版本号精确记录,也为后续扩展新检测项保留了清晰的接口。
核心参考文件:分析器总览、抽象层与 Harness、IMSI 请求分析器、2G 信令降级、SIB6/7 优先级降级、RRC 空密码、NAS 空密码、不完整 SIB、诊断分析器、无 NAS 分析器、测试分析器、配置模板、配置指南。
【免费下载链接】rayhunterRust tool to detect cell site simulators on an orbic mobile hotspot项目地址: https://gitcode.com/GitHub_Trending/ra/rayhunter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考