ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

pam-u2f模糊测试基础设施揭秘:Yubico如何用Fuzzer猎杀凭据解析隐藏漏洞

pam-u2f模糊测试基础设施揭秘:Yubico如何用Fuzzer猎杀凭据解析隐藏漏洞 pam-u2f模糊测试基础设施揭秘Yubico如何用Fuzzer猎杀凭据解析隐藏漏洞【免费下载链接】pam-u2fPluggable Authentication Module (PAM) for U2F and FIDO2项目地址: https://gitcode.com/gh_mirrors/pa/pam-u2fpam-u2f 是 Yubico 开发的 PAM 模块用于支持 U2F 和 FIDO2 硬件安全密钥登录。这个项目里隐藏着一套堪称教科书级的模糊测试基础设施fuzzing infrastructure两个专门的 Fuzzer、30 多个被劫持的系统函数、结构化变异器和完整的覆盖率管线。本文将带你拆解这套基础设施看懂 Yubico 是如何用模糊测试猎杀凭据解析中的隐藏漏洞的 为什么 PAM 模块需要模糊测试pam-u2f 的工作流程是读取配置文件和凭据文件authfile解析 SSH 格式或原生格式的密钥数据再与硬件安全密钥交互完成认证。其中凭据解析是典型的解析不可信输入场景——格式稍有偏差就可能出现缓冲区越界、整数溢出、内存泄漏。模糊测试Fuzzing正是对付这类问题的利器向程序投喂海量畸形输入观察它是否会崩溃或触发异常。pam-u2f 的模糊测试设施集中在fuzz/目录核心文件如下文件作用fuzz/fuzz_auth.c全链路认证 Fuzzerfuzz/fuzz_format_parsers.c凭据格式解析 Fuzzerfuzz/wrap.c系统函数劫持与故障注入fuzz/pack.c二进制输入的结构化打包/解包fuzz/make_seed.py从测试凭据生成种子语料fuzz/coverage.shLLVM 覆盖率统计脚本fuzz/wiredata.h录制的 CTAP2 硬件通信数据fuzz/authfile.h内置的凭据样本两大 Fuzzer从凭据解析到完整认证链路1️⃣ fuzz_format_parsers凭据解析器专用fuzz/fuzz_format_parsers.c目标非常聚焦只测get_devices_from_authfile()这一个凭据解析函数。它的输入格式经过精心设计第 1 字节小于 9 时开启 debug 模式模拟异常日志路径第 2~5 字节伪随机数种子保证变异可复现第 6 字节偶数走原生格式解析器奇数走 SSH 格式解析器其余字节真正的凭据文件内容这种头部控制 数据主体的布局让 Fuzzer 能系统性地覆盖两种格式的每条解析分支。2️⃣ fuzz_auth整条 PAM 认证链路fuzz/fuzz_auth.c野心更大它直接调用pam_sm_authenticate()走完整认证流程。输入被打包成 6 个字段随机种子、用户名、模块配置串、PAM 会话应答、凭据文件内容、配置文件内容。有个巧妙细节authfile 和 conf 文件都通过memfd_create()创建为纯内存文件不落盘、不污染测试环境每次运行都干净如初。wrap.c给系统函数套上缰绳这是整套设施最精彩的部分。pam-u2f 正常工作时依赖大量系统调用查用户信息、获取主机名、打开设备、分配内存……但 Fuzzer 必须做到可预测、可移植否则在不同机器上行为不一致崩溃就没法复现。fuzz/wrap.c利用链接器--wrap机制见fuzz/CMakeLists.txt中约 30 个-Wl,--wrap选项把系统函数替换成可控版本getpwnam_r/getpwuid_r永远返回固定用户不再查真实 /etc/passwdgethostname、secure_getenv返回恒定值pam_get_user、pam_get_itemPAM 上下文完全由 Fuzzer 注入fido_dev_open/fido_dev_info_manifestlibfido2 的设备访问被替换从fuzz/wiredata.h中读取录制好的真实 CTAP2 通信字节流——这是从真机安全密钥上抓下来的初始化、INFO、ASSERT 报文Fuzzer 因此能模拟硬件而无需真机更妙的是随机故障注入malloc、calloc、strdup、read、BIO_read等函数被包装成有 0.25% 概率返回失败。这是专门用来揪出错误处理路径漏洞的——内存分配失败时程序会不会崩溃或泄漏只有故障演习才能知道。结构化变异自定义 Mutator 精准爆破默认的 libFuzzer 只做字节级随机变异面对打包成二进制的输入效率很低。pam-u2f 实现了LLVMFuzzerCustomMutator见fuzz/fuzz_auth.c用fuzz/pack.c中的解包函数还原出用户名、配置、凭据、wiredata 等结构化字段对每个字段单独做变异并通过--pam-u2f-mutateseed|param|wiredata参数选择变异目标重新打包后交给 Fuzzer 继续探索这样 Fuzzer 的火力集中到语义正确的位上而不是在格式无效的数据上浪费算力。配合fuzz/prng_init()种子libfido2 内部的随机数也是可复现的。种子语料make_seed.py 与测试凭据的联动fuzz/make_seed.py展示了工程上的闭环思维它扫描tests/credentials/目录下的全部.cred.in测试凭据涵盖空文件、各种参数组合new_-P-N、new_double_-r-V等 30 余个边界样本为每条凭据生成带头部字节的种子文件原生格式 SSH 格式各一份。也就是说功能测试的输入自动变成模糊测试的起点。新增一条凭据测试后重跑make_seed.py再把种子合并进语料库即可零维护成本。覆盖率驱动coverage.sh 量化测试效果fuzz/coverage.sh是一条龙的覆盖率统计脚本用-fprofile-instr-generate -fcoverage-mapping重新编译下载社区共享的种子语料并运行fuzz_format_parsers -runs1 -dump_coverage1用llvm-profdata mergellvm-cov report输出函数级覆盖率这让维护者随时能回答一个关键问题哪些解析分支还没被 Fuzzer 踩到覆盖率不达标就补种子或加变异策略。新手如何跑起这套 Fuzzer如果你想在本地体验克隆仓库后进入fuzz/目录构建即可git clone https://gitcode.com/gh_mirrors/pa/pam-u2f构建依赖 Clang 的 libFuzzer-fsanitizefuzzerCMake 会自动把fuzz_format_parsers和fuzz_auth两个可执行文件连同fuzz/wrap.c一起编译。运行方式就是标准的 libFuzzer 语法传入语料目录例如./fuzz_format_parsers corpus/。建议先用fuzz/coverage.sh的方式跑一轮覆盖率报告建立基线认知再加大-runs参数长时间运行。总结这套基础设施做对了什么pam-u2f 的模糊测试设施给所有安全敏感项目提供了 5 条可复用的经验分层设防解析器 Fuzzer 快而专全链路 Fuzzer 慢而全各司其职彻底解耦用--wrap把文件系统、用户数据库、硬件设备全部虚拟化崩溃 100% 可复现录制真实数据wiredata 来自真实安全密钥的 CTAP2 报文仿真度极高结构化变异自定义 Mutator 让 Fuzzer 按字段爆破效率远超盲变测试闭环功能测试凭据、种子语料、覆盖率三者联动形成可持续的安全质量飞轮对新手而言这套设施也是学习模糊测试的绝佳教材——从fuzz/fuzz_format_parsers.c入手只需百来行代码就能看懂一个完整的认证 Fuzzer 是如何组装起来的 【免费下载链接】pam-u2fPluggable Authentication Module (PAM) for U2F and FIDO2项目地址: https://gitcode.com/gh_mirrors/pa/pam-u2f创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表