Жизнь на дополнениях Node.js
Нативные модули — это скомпилированные файлы Node.js, которые позволяют приложениям Node.js взаимодействовать с нативным кодом, написанным на таких языках, как C, C++ или Objective-C. Эти файлы представляют собой скомпилированные бинарные файлы, которые могут содержать машинный код и выполняться с теми же привилегиями, что и процесс Node.js, который их загружает. В отличие от файлов JavaScript, файлы .node не читаемы и могут напрямую вызывать системные API и выполнять операции, которые не может выполнять чистый код JavaScript. Эти дополнения могут использовать Objective-C++ для прямого доступа к нативным API macOS из Node.js, что позволяет выполнять произвольный код вне обычного песочницы. Приложения Electron часто используют формат файлов ASAR для упаковки исходного кода приложения, но проверка целостности ASAR по умолчанию отключена. При включении проверка целостности ASAR проверяет хеш заголовка архива ASAR во время выполнения и предотвращает подделку файлов внутри архива. Однако многие приложения запускаются извне проверенного архива, под именем app.asar.unpacked, поскольку скомпилированные файлы .node не могут быть выполнены напрямую из архива ASAR. Это позволяет локальному злоумышленнику изменять или заменять файлы .node в распакованном каталоге, аналогично перехвату DLL в Windows. Для решения этой проблемы были разработаны два инструмента: Electron ASAR Scanner, который оценивает, реализуют ли приложения Electron защиту целостности ASAR, и NodeLoader, простой компилятор нативных дополнений Node.js. Инструменты Electron ASAR Scanner и NodeLoader могут помочь выявить и устранить потенциальные уязвимости безопасности в приложениях Electron, использующих нативные модули.