151 ·GitHub
Что это?
GoodmansKernel — подписанный драйвер режима ядра Windows со встроенным интерпретатором wasm3: он позволяет загружать неподписанные модули .wasm и исполнять их внутри ядра с прямым FFI-доступом к экспортам nt/hal. Логику для ядра вы пишете на C или Rust, компилируете в wasm32, загружаете в драйвер и итерируете без переподписывания каждого пейлоада.
Это полноценное приложение или просто драйвер?
Это драйвер режима ядра WDM (.sys) с графическим фронтендом на Qt6 для загрузки модулей и просмотра логов; гостевые модули wasm компилируются отдельно и загружаются в драйвер через IOCTL.
Как его собрать и установить?
Соберите драйвер в Visual Studio 2022 с WDK 10.0.26100.0, Qt 6.9 и clang с целью wasm32 для гостевых модулей. Чтобы запустить его без надлежащей подписи, включите тестовую подпись командой 'bcdedit /set testsigning on' перед загрузкой драйвера.
Какие инструменты нужны, чтобы это собрать?
VS 2022, WDK 10.0.26100.0, Qt 6.9 для графического интерфейса и clang с поддержкой цели wasm32 для компиляции гостевых модулей.
Каковы главные ограничения запуска wasm-пейлоадов в ядре таким способом?
Гостевые модули не могут использовать типы f32/f64, проверки границ памяти wasm выброшены при компиляции, так что модуль с багом всё же может повредить память, у каждого модуля одновременно может быть только один вызывающий, полезная нагрузка IOCTL ограничена 16 МБ, и есть жёсткий предел в 32 слота для модулей.
Это безопасно использовать с точки зрения лицензий?
Сам драйвер под лицензией MIT, как и входящие в комплект wasm3 и InfinityHook, но он линкует Qt 6, который под LGPLv3, поэтому распространение собранного бинарника влечёт обязательства LGPL.
Что реально может загруженный wasm-модуль после запуска?
Каждый модуль получает битмаску возможностей на слот (ALLOC, READKMEM, WRITEKMEM, MSRREAD/WRITE, PHYSMEM, CPUIDTSC, CALLBACKS, HOSTCALL, INTROSPECT), которая определяет, какие хостовые импорты вроде hostreadmsr или hostphysread ему разрешено вызывать.
Как на практике общаться с модулем после его загрузки?
Через IOCTL: LOADMODULE линкует импорты модуля .wasm, CALLEXPORT вызывает экспорт с числом аргументов до 8, а TAILLOG/TAILTRACE позволяют опрашивать его кольца логов и трассировки.
Зачем wasm, если можно просто внедрить шеллкод в ядро?
wasm3 интерпретирует гостевой байткод без JIT, поэтому ядро никогда не исполняет динамически сгенерированный нативный код — это сохраняет соответствие драйвера HVCI и прочим механизмам W^X, которые блокировали бы неподписанное нативное исполнение.
Для чего здесь используется InfinityHook?
Это сторонняя trampoline-техника с указанием авторства, которую драйвер использует для хуков: она даёт перехват коллбэков в стиле process/image notify без опоры на недокументированный патчинг SSDT.
What are similar projects?
scriptc, CalcKernel, open-gpu-kernel-modules, ZygiskNext, linux, mquickjs, reactos, lytlnyblOS
Which topics is it in?
qt6, clang, interpreter, driver, virtual-machine, webassembly, kernel, low-level, systems-programming, native, sandbox, wasm
