2024下半年SIG-Main周会公告&会议总结

20240829(0901) Sig-Main会议总结

分享人: 池克俭

主题:关于引入自动化内核测试的设想

关于引入自动化内核测试的方案设想

内部测试:syzkaller 模糊测试

Syzkaller 是一个无监督的、覆盖率引导的内核模糊测试工具,它能够自动化地生成随机的系统调用序列,并将其作为测试用例输入到内核中,以此来发现内核中可能存在的漏洞。syzkaller是谷歌开源的,业界正在使用的解决方案。

外部测试:基于固定用例与UI的测试

模拟开发者的行为,例如可以通过 VNC 拿到 QEMU 里面的数据,在启动阶段定时每隔一小段时间来截一次图,判断现在这个状态是卡住了,还是说崩了,还是说正确正常的进入到了系统里面。

而当然这里其实有可能可以做更多的工作,比如说基于用例的去做,进到系统之后,可以跑一些现有的拿来做单元测试的用户空间的测试程序。好处是这是一个固定用测试用例的,对比起模糊测试,会更加精准,能清楚的知道各个模块的测试覆盖情况;并且时间上开销也比较小。

可能需要使用 AI 或者 OCR 来辅助实现这样的需求。

讨论关于引入syzkaller模糊测试的方案

在使用 Syzkaller 进行模糊测试时,需要被测的内核处于运行状态。Syzkaller 通过生成系统调用并将其发送到运行中的内核来执行测试。这些系统调用序列是随机生成的,目的是尽可能覆盖内核代码的各种执行路径,以便发现潜在的错误或漏洞。

Syzkaller 的工作流程通常包括以下几个步骤:

  1. 启动 Syzkaller 管理器(syz-manager),它会根据配置文件启动一个或多个虚拟机(QEMU)或物理机。

管理器会将 Syzkaller 生成的测试用例(系统调用序列)发送到虚拟机或物理机上运行的内核中。

内核执行这些系统调用,并产生执行结果,如正常返回、异常、崩溃等。

  1. Syzkaller 收集执行结果,并根据结果更新其测试策略,优先执行那些能够增加代码覆盖率的测试用例。

通过持续的测试和反馈,Syzkaller 能够发现并报告内核中的错误。

  1. 在实际应用中,Syzkaller 可以配置为在隔离的环境下运行,例如通过 SSH 连接到远程物理机或使用虚拟机。在这种情况下,被测内核需要在目标机器上运行,并且 Syzkaller 需要能够通过网络与之通信。
  • 明确引入syzkaller框架的方式是在测试环境(Linux)物理机上使用 qemu,远程(使用ssh等方式)在DragonOS里面跑一个进程,或者说启动相应的测试程序,捕获对应的信息。
需要引入基础支持
  • 需要考虑重新考察支持 no-graphic

  • sshd的支持

打包磁盘镜像的问题
  • 调查能否在非特权级下完成磁盘进行打包

  • 调查特权级打包磁盘镜像后是否能够在 GitHub CI上运行

  • 参考 asterinas 调研一下是怎么完成这个流程的

  • 相关的讨论: