strongSwan RADIUS 属性迭代器预认证无限循环 / 远程拒绝服务。
attribute_enumerate() 函数(位于 src/libradius/radius_message.c:247-271)接受 length 字节小于 sizeof(rattr_t)(2)的 RADIUS 属性。当 length == 0 时:
data->len = next->length - sizeof(rattr_t) 下溢为 (size_t)-2this->left -= next->length 即 left -= 0 — 计数器永不减小this->next += next->length 即 next += 0 — 指针永不前进每次迭代枚举器都会返回同一个伪造属性,导致调用方的 while (enumerate(...)) 循环挂起。
eap_radius_dae.c 中的 DAE 接收回调在根据 RADIUS 代码分发之前调用 request->verify(..., NULL, secret, ...)。对于 code == Access-Request,verify() 跳过 Response-Authenticator MD5 检查并遍历属性枚举器以查找 Message-Authenticator — 因此零长度属性在 共享密钥被检查之前 就困住了解析器。该攻击未经身份验证。
一个 UDP 包便能使一个 charon 工作线程永久占用 100% CPU。重复 N 次即可耗尽所有 N 个工作线程。
受影响版本:strongSwan <= 5.9.13。已在上游主分支提交 e067d24293 中修复(2026-04-21)。
python3 poc.py --target <charon-host> --port 3799
eap-radius 插件且启用 dae.enable = yes(UDP/3799 监听)的 strongSwan charon本项目基于 GNU GPLv3 发布。
它仅供防御性安全研究、教育和授权测试使用。请勿在未经拥有者明确许可的情况下针对系统或服务使用此代码。
未经授权使用可能违反适用法律。作者未授权对第三方系统进行测试,且不对滥用行为负责。
有关免责和赔偿责任条款,请参见 LICENSE 文件。