为什么模糊测试没有检测到 CVE-2022-3602?

最近在 OpenSSL punycode 解析器中发现了一个备受关注的内存损坏安全漏洞。有人询问为何仍会发生这种情况,为何没人为 punycode 解析器编写模糊测试器,以及安全社区是否从 Heartbleed 事件中未学到任何东西。认为应给予开发者怀疑的好处,假设他们是出于善意行事,并尝试找出可改进之处。

  • Examining call chains:开始检查易受攻击函数的调用链,包括ossl_punycode_decodeossl_a2ulabel调用等,还找出了调用ossl_a2ulabel的文件及相关代码路径。
  • Examining coverage:通过编译带有覆盖范围的模糊测试工具,最小化 X.509 模糊测试语料库,运行可执行文件并收集覆盖数据等操作,发现当前语料库和工具无法到达某些关键代码,如crypto/x509/x509_vfy.c中的代码覆盖为零。
  • So, why did this all happen?:最初猜测模糊测试在 ASN.1 反序列化上浪费时间,实际情况更糟,当前语料库和工具无法到达某些代码,如通过特定文件v3_ncons.c可达的代码覆盖少。
  • (Update): "verify_chain" is reachable in other fuzzers, but it's still not enough.:Google 开源安全团队的 Jonathan Metzman 指出在其他模糊测试器中verify_chain可达,但仍不足,需修改相关工具以设置有效证书链等。
  • (Update 2): making "verify_chain" and "build_chain" pass (still not there).:通过修改 X.509 测试代码,可使build_chain通过并锻炼verify_chain的大部分功能,但名称验证仍需良好形式的代理证书,提出从test/sslapitest.c获取代码进行模糊测试的方法。
  • What could we try improving?:可尝试为每个函数编写单独的解析器,编写覆盖X509_verify_cert的工具,定期检查覆盖报告,利用 OSS-Fuzz 模糊测试器内部工具等,以提高测试效果。若有能到达X509_verify_cert的工具,可添加良好形式的 ASN.1 元素和 X.509 证书等。
    感谢 Hanno 及其推特线程激发研究兴趣,感谢同事介绍 Introspector 工具。并链接了相关推文。
阅读 14
0 条评论