ligurio/lunapark

GitHub: ligurio/lunapark

Lunapark 是一个专为 PUC Rio Lua 和 LuaJIT 运行时设计的模糊测试与 CBMC 形式化验证框架,旨在高效发现底层 C 实现中的内存安全和未定义行为缺陷。

Stars: 12 | Forks: 4

PUC Rio Lua
LuaJIT
Tarantool
# lunapark 是一组针对 C 实现的 Lua 运行时 (PUC Rio Lua 和 LuaJIT)的模糊测试和 CBMC 证明。
如果你想知道为什么它叫 Lunapark 最初,“lunapark”,或者更准确地说是“Luna Park”,是 目前运营中和已停业的数十个游乐园共有的名称。 通常,Luna Park 是小型的游乐园区。 对 Lua 运行时(尤其是 LuaJIT)进行模糊测试和调试,在某种意义上,同样 也是一种极具吸引力且令人难忘的冒险。 此外,第一个词在俄语中的意思是“月亮”, 即地球唯一的天然卫星,而编程语言 Lua (发音为 LOO-ah)在葡萄牙语中也同样意为“月亮”。这就是为什么 该项目被命名为“lunapark”。
### 构建 ``` git clone https://github.com/ligurio/lunapark cd lunapark git clone https://github.com/ligurio/lunapark-corpus CC=clang CXX=clang++ cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DUSE_LUA=ON [-DUSE_LUAJIT=ON] cmake --build build --parallel ``` CMake 选项: - `USE_LUA` 启用 PUC Rio Lua 的构建。 - `USE_LUAJIT` 启用 LuaJIT 的构建。 - `LUA_VERSION` 可以是 Git 分支、标签或提交。默认情况下,PUC Rio Lua 的 `LUA_VERSION` 为 `master`,LuaJIT 的为 `v2.1`。 - `ENABLE_LUAJIT_RANDOM_RA` 在寄存器分配中启用随机性。此选项 为 LuaJIT 专用。 - `ENABLE_ASAN` 启用 AddressSanitizer。 - `ENABLE_UBSAN` 启用 UndefinedBehaviorSanitizer。 - `ENABLE_COV` 启用覆盖率插桩。 - `ENABLE_LUA_ASSERT` 启用 Lua 源代码中的所有断言。 - `ENABLE_LUA_APICHECK` 启用对 C API 的一致性检查。 - `OSS_FUZZ` 启用对 OSS Fuzz 的支持。 - `ENABLE_BUILD_PROTOBUF` 启用 Protobuf 库的构建,否则将使用 系统库。 - `ENABLE_INTERNAL_TESTS` 启用内部测试。 - `ENABLE_LAPI_TESTS` 启用 Lua API 测试。 - `ENABLE_CBMC_PROOFS` 启用构建 CBMC 证明以替代测试。 - `DISABLE_LIBFUZZER_STATIC_LINKAGE` 禁止将 Lua 运行时 与 libFuzzer 进行静态链接。 ### 运行 ``` cmake --build build --target test cd build && RUNS=100000 ctest -R luaL_gsub_test --verbose 1: Done 100000 runs in 5 second(s) ``` ### 参考 - [Lua 5.5 参考手册:4 – 应用程序接口](https://www.lua.org/manual/5.5/manual.html#4) - [Lua 5.4 参考手册:4 – 应用程序接口](https://www.lua.org/manual/5.4/manual.html#4) - [Lua 5.3 参考手册:4 – 应用程序接口](https://www.lua.org/manual/5.3/manual.html#4) - [Lua 5.2 参考手册:4 – 应用程序接口](https://www.lua.org/manual/5.2/manual.html#4) - [Lua 5.1 参考手册:3 – 应用程序接口](https://www.lua.org/manual/5.1/manual.html#3) ### 已知问题 模糊测试能发现种类繁多的问题,但并非所有问题 都会被认定为 Bug。有些问题是由于实现中已知的 局限性所致。本节包含了 LuaJIT 和 PUC Rio Lua 中此类 局限性列表: 1. 在 LuaJIT 中,构建基础设施包含存在 内存泄漏及其他问题的源代码。例如, `src/host/buildvm.c` 和 `src/host/minilua.c`,这些文件仅 在 LuaJIT 构建过程中使用,而并非 LuaJIT 本身的一部分。内存泄漏在 AddressSanitizer 中通过 `__lsan_is_turned_off()` 函数进行了抑制,该 函数会禁止对其所链接的程序进行泄漏检查。 2. 在 LuaJIT 中,函数 `lj_str_new()` 可能会越界读取 缓冲区(即所谓的“脏”读取),这是正常的。在 AddressSanitizer 中通过 `__attribute__((no_sanitize_address))` 进行了抑制。 3. 在 LuaJIT 中,字节码输入是不安全的;请参见 [LuaJIT#847][LuaJIT#847] 和 [LuaJIT FAQ][LuaJIT FAQ]。字符串 "mode" 控制 代码块是文本还是二进制(即预编译的 代码块)。它可以是字符串 "b"(仅二进制代码块)、 "t"(仅文本代码块)或 "bt"(二进制和文本均可)。 默认值为 "bt"。PUC Rio Lua 和 LuaJIT 都有字节码和 Lua 源代码解析器。理想情况下应对这两种 解析器都进行测试;然而,LuaJIT 字节码解析器在运行以下 断言时失败了:LuaJIT ASSERT `lj_bcread.c:123: bcread_byte: buffer read overflow`,因此在 LuaJIT 中仅使用文本模式, 从而也只测试了文本解析器。 4. `debug` 库被定义为不安全的。有无数种 方法可以利用它导致程序崩溃。该库为 Lua 程序提供了调试接口的功能。它的几个 函数违反了关于 Lua 代码的基本假设,因此可能会 破坏原本安全的代码。请参见 [LuaJIT#1264][LuaJIT#1264] 和 [Lua 5.4 参考手册][refmanual54]。`debug` 函数不属于测试对象,且在使用这些函数时需十分谨慎。 5. 在 LuaJIT 中,有许多地方存在未定义行为 (“nonnull-attribute”、“signed-integer-overflow”、“bounds”)。 这些问题一直未得到修复,并在 UndefinedBehavior Sanitizer 中进行了抑制。 6. 在 LuaJIT 中,有一个最小的 C 声明解析器,并且它 不是一个验证型 C 解析器:“对于格式正确的 C 声明,该解析器应当返回正确的 结果,但它也可能 接受一些无效的声明(并返回无意义的结果)”。 ### 许可证 版权所有 (C) 2022-2026 [Sergey Bronnikov](https://bronevichok.ru/), 在 ISC 许可证下发布。有关完整的版权声明,请参见 LICENSE 文件。
标签:Bash脚本, CBMC, Fuzzing, Lua, LuaJIT, OSS-Fuzz, oss-sydr-fuzz, PUC Rio Lua, Tarantool, TLS抓取, 云安全监控, 内存安全, 安全测试, 攻击性安全, 有界模型检查, 质量保证, 软件安全, 静态分析