评估Jupyter环境的安全性
如何判断您的 Jupyter 实例是否安全? NVIDIA AI 红队开发了一个 JupyterLab 扩展来自动评估 Jupyter 环境的安全性。 jupysec 是一种根据近 100 条规则评估用户环境的工具,这些规则检测配置和工件,这些配置和工件已被 AI Red Team 识别为潜在漏洞、攻击向量或妥协指标。
NVIDIA AI Red Team 和 Jupyter
NVIDIA AI Red Team 主动评估 NVIDIA AI 产品和开发管道的安全性。 在运营方面,该团队经常遇到来自 Jupyter 生态系统的软件,这是一组功能强大且灵活的工具,许多机器学习 (ML) 研究人员和工程师都在使用它。 AI 红队确定了可用于扩展访问、获得持久性或操纵开发运行时和工件的 Jupyter 配置和功能。
Jupyter 生态系统由许多相互连接的组件组成,这些组件旨在在客户端-服务器模型中执行 Julia、Python 或 R 代码。 通常,用户在基于浏览器的交互式开发环境中与代码进行交互。 该代码通过 HTTP/S 和 WebSockets 发送到可能在本地、远程本地或云端运行的 Jupyter 服务器。 然后,Jupyter 服务器通过消息队列分派代码以在内核中执行。 有关更多信息,请参见下图 和 Jupyter 体系结构文档。
虽然非常灵活,但这种模块化架构为威胁参与者提供了多种机会来影响机器学习开发周期和衍生系统。 例如,通过访问像 JupyterLab 这样的客户端应用程序,他们可以在经过身份验证的用户的上下文中向服务器发送命令。 用 Jupyter 团队的话说,“命令可能会相互冲突、破坏和覆盖。” 有关详细信息,请参阅运行notebook服务器。
同样,通过访问服务器和内核,威胁参与者可能能够与用户运行时进行交互,而无需访问用户的主机。 请注意,JupyterLab 仅适用于一个用户。 根据 运行notebook服务器,官方的多用户解决方案是 JupyterHub。
凭借其模块化和广泛的用例,Jupyter 生态系统有多个配置文件和值来实现定制。 Jupyter 开发人员和贡献者一直致力于通过默认值和安全相关的功能和配置来平衡安全性和可用性。
但是,用户可能会无意中引入安全漏洞。 此外,如果有足够的访问权限,这些配置可能会被威胁行为者恶意更改以影响 ML 过程。 NVIDIA AI Red Team 的一些技术示例包括:
-
默认情况下,启动 Jupyter Server 时(独立启动或作为 JupyterLab 实例化的一部分),服务器仅侦听本地主机生成的请求。 但是,通过修改用于启动进程的配置值或命令行参数,可以使服务器侦听其他接口,包括广播域。 用户可能故意这样做以通过网络访问他们的服务器,无意中将他们的服务器暴露给恶意访问。
-
Jupyter 默认启用检查以防止跨站点请求伪造 (CSRF)。 这可以防止用户在不知不觉中将攻击者控制的代码提交到 Jupyter 服务器。 但是,威胁参与者可以在配置文件中禁用此检查,从而使用户暴露于 CSRF。
-
有了足够的访问权限和凭证材料,攻击者就可以将他们自己的 Jupyter 客户端附加到用户正在运行的内核中。 这意味着他们可以创建变量和函数,用恶意克隆覆盖导入,以及以其他方式在与用户相同的上下文中运行任意代码。 成功瞄准 Jupyter 部署的威胁行为者很可能拥有训练时间访问权限,因此可能会显着影响最终 AI 系统的功效。
总而言之,有风险的配置值可能是有意的、无意的或恶意活动的结果。 由于 Jupyter 生态系统的模块化特性,控制应用程序行为的值可能分散在十几个配置文件和命令行实用程序中。 您如何识别和分类它们,并在必要时采取行动?
使用 jupysec
jupysec 是一组 Jupyter 安全规则和 JupyterLab 扩展,旨在针对已知的安全风险审计 Jupyter 环境。 它可作为独立脚本或 JupyterLab 扩展使用,以最大限度地提高用户将该工具集成到现有工作流程中的能力。
如图 2 所示,该扩展将安全报告小部件添加到启动器。 这是在用户浏览器中运行的扩展的客户端组件。 当用户单击此小部件时,Jupyter 客户端会向 Jupyter 服务器发送 HTTP/GET 请求。 服务器验证请求来自经过身份验证的用户,执行 jupysec 规则,并呈现并将任何发现返回给用户。
每个 jupysec 调查结果都包含一个类别、发现调查结果的文档、违规行、有关为什么该配置代表安全风险的其他详细信息以及建议的补救措施。 每个发现都有一个 UUID,并通过 Jinja 模板呈现给用户。 jupysec 不维护状态,因此每次执行都会重新评估整个规则集。
下图显示了 jupysec 检测到的潜在代码执行。 IPython 启动目录中有一个名为 10_norm.py 的文件。 每当使用该配置文件启动 JupyterLab 时,该脚本就会运行,如 IPython 所记录并在 IPython 配置文件:Big Bag o’ Functionality 中进行了演示。 该发现是根据特定的 jupysec 规则生成的。
jupysec 不会为用户修复结果,因为这几乎肯定会对环境产生重大改变。 与任何自动化安全工具一样,可能存在误报。 例如,在图 3 所示的发现中,启动目录可用于通过自动连接到远程数据存储来改善开发人员体验。
但是,同样的配置更改也可用于泄露敏感信息。 jupysec 无法区分,但可以提醒您潜在的问题。 消除误报后,用户和管理员应采取建议的步骤来强化环境或调查异常指标。
总结
Jupyter 生态系统非常强大且可配置,这使其成为对研究人员和开发人员以及威胁参与者具有吸引力的工具。 jupysec 可以自动评估 Jupyter 环境的安全性。
NVIDIA AI Red Team 将继续研究 jupysec 规则中的 Jupyter 安全和编码知识和技术。 无论您的 Jupyter 部署是本地的还是托管在云端,都可以使用 pip install jupysec [jupyterlab] 尝试 jupysec。 访问 GitHub 上的 jupysec,以问题的形式分享您的反馈和贡献。