Mininode 是一个 CLI 工具,通过静态分析源代码来减少 Node.js 应用程序的攻击面。它支持两种精简模式:(1) 粗粒度,(2) 细粒度。
Mininode 从主文件(即应用程序的入口点)开始构建依赖关系图(应用程序使用的模块和函数)。Mininode 会优先使用 package.json 文件中的 main 字段作为入口点;若不存在,则默认使用 index.js。
示例用法:node index.js <Node 应用程序根目录路径> --mode=(coarse|fine)。以下是可传递给 Mininode 的选项列表。
可传递给 mininode 的命令行选项列表。
--destination, -d:mininode 保存精简后 Node.js 应用程序的路径。默认值:mininode。--dry-run:仅生成 mininode.json,不修改原始应用程序。--mode, -m:精简模式。值可以是 coarse 或 fine。在 coarse 模式下,mininode 仅执行粗粒度精简;而在 fine 模式下,mininode 会执行细粒度精简。通常粗粒度精简更可靠,因为 mininode 不会尝试减少模块内部未使用的函数。默认值:coarse。--silent:禁用控制台输出。这将提升 mininode 的性能。--verbose:向控制台输出更多信息。默认值:false--log:mininode 会在其中生成包含应用程序依赖关系图(JSON 格式)的日志文件。默认值:true。--log-output:mininode 生成的日志文件名。默认值:mininode.json。--compress-log:压缩最终的日志文件。默认情况下会将所有内容写入日志文件。在生产环境中,建议传递 --compress-log 标志以节省空间。--seeds:mininode 开始构建依赖关系图的种子文件。您可以使用冒号分隔多个种子文件。--skip-stat:跳过计算统计数据。--skip-reduction:若传递,mininode 不会精简 JavaScript 文件。默认值:false。--skip-remove:若传递,mininode 不会移除未使用的 JavaScript 文件。默认值:false。eval)的 Node.js 应用程序的攻击面。如果 Mininode 在应用程序中检测到动态行为,会以错误 DYNAMIC_BEHAVOUR_DETECTED 退出。您可以在以下研究论文中了解更多关于我们工作的细节:
Mininode: Reducing the Attack Surface of Node.js Applications [PDF]
Igibek Koishybayev, Alexandros Kapravelos
Proceedings of the International Symposium on Research in Attacks, Intrusions and Defenses (RAID), 2020
如果您在研究中使用了 Mininode,请考虑使用以下 Bibtex 条目引用我们的工作:
@conference{mininode-raid20,
title = {{Mininode: Reducing the Attack Surface of Node.js Applications}},
author = {Koishybayev, Igibek and Kapravelos, Alexandros},
booktitle = {{Proceedings of the International Symposium on Research in Attacks, Intrusions and Defenses (RAID)}},
year = {2020}
}
我们遵循 semistandard。