Label Studio Enterprise 2.20.1 安全更新深度解析:路径穿越防护、XSS 加固与 S3 端点信任域配置
2026/9/13 6:43:27 网站建设 项目流程

Label Studio Enterprise 2.20.1 安全更新深度解析:路径穿越防护、XSS 加固与 S3 端点信任域配置

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

Label Studio Enterprise 2.20.1(Helm Chart 1.9.2,发布于 2025 年 2 月 12 日)是一次聚焦安全加固的维护版本,围绕三类风险进行修复:图片文件路径的任意路径穿越、/projects/upload-example接口的 XSS 风险,以及 S3 存储端点错误信息的信息泄露问题。本文以该版本官方 Release Notes 为核心,结合本仓库源码实现逐一拆解每项修复的原理、影响面与运维配置方法,帮助自托管(on-premise)部署团队完成升级评估与安全加固。

版本概览:一次纯安全向的维护版本

该版本没有新增功能特性,官方将其定级为 "Security-related fixes"(安全相关修复),核心变更全部集中在安全边界收紧上:

  • 发布日期:2025 年 2 月 12 日
  • 配套 Helm Chart 版本:1.9.2
  • 修复类型:路径穿越(Path Traversal)、XSS 防护、S3 错误信息泄露

对于运行在公网或多人协作环境中的 Label Studio 实例,这三个修复点分别对应了文件访问边界、接口副作用、错误信息敏感度三个维度的常见安全短板,建议部署 2.20.1 之前版本的用户尽快升级。

修复一:限制图片文件路径,阻止任意路径穿越

问题本质

任意路径穿越(Arbitrary Path Traversal)是一类经典的目录逃逸攻击:攻击者通过构造包含../、绝对路径或编码变体的文件路径,尝试读取/写入 Web 服务运行目录之外的文件,例如服务器上的/etc/passwd、应用配置文件或源码文件。在标注平台场景下,这类漏洞通常出现在本地文件存储(local files)、数据导入或任务附件等涉及文件路径拼接的功能中。

Label Studio Enterprise 2.20.1 对图片文件路径进行了显式限制("Image file paths are restricted as to prevent arbitrary path traversal"),即在文件路径进入磁盘读写逻辑之前增加了校验与规范化处理,使传入路径无法逃逸出允许的根目录范围。

源码佐证

仓库中针对"路径穿越"类攻击的防护并非孤立实现,而是作为统一的输入校验策略贯穿于多个模块:

  • 在 react 代码代理模块的测试 中,存在test_returns_400_for_path_traversal用例,验证包含路径穿越意图的请求会被直接拒绝并返回 400 状态码,说明该修复在前端/代理层就已拦截畸形路径;
  • 数据管理模块的列名校验 中实现了_reject_fk_traversalvalidate_filter_column_no_fk_traversal,用于拒绝__形式的外键遍历表达式,其对应的单元测试 test_prepare_params.py 逐一验证了遍历路径被拒绝、合法查询被放行的边界。

从这些实现可以看出,2.20.1 对图片路径的收紧延续了 Label Studio 一贯的"输入即边界"策略:凡是可能进入文件系统或 ORM 查询的路径/列名字符串,都必须通过白名单式校验,未匹配即拒绝。

运维影响

此修复对正常使用的影响极小——合法的相对路径、项目内资源路径不受影响;只有尝试构造../或绝对路径逃逸的请求会被拦截。若你的标注配置中曾依赖非常规的绝对路径引用图片(例如直接引用服务器磁盘路径),升级后需改为通过 Label Studio 的云存储 / 本地存储绑定(storage)方式引用。

修复二:/projects/upload-example不再接受 GET 请求

问题本质

/projects/upload-example是 Label Studio 提供的"上传示例数据"接口,用于向项目中导入内置的示例任务数据。由于 GET 请求会在浏览器的地址栏、历史记录、代理日志、预加载(prefetch)等场景中被无意触发,且会携带可被第三方页面诱导的副作用,因此有副作用的操作(如写库、导入数据)通过 GET 暴露本身就是一个 XSS 与 CSRF 的温床——攻击者可以构造<img src="/projects/upload-example">之类的标签,诱导浏览器以已登录用户身份静默执行导入。

2.20.1 的修复方式是收紧 HTTP 方法约束:该端点不再接受 GET 请求,只允许提交性质的请求方式(如 POST)。这意味着浏览器默认发起的图片/链接式 GET 请求将直接失败,从而消除基于 GET 的跨站利用链。

源码佐证

仓库的端点安全测试 test_endpoints.py 中将/projects/upload-example//projects/1000/upload-example/(按项目 id 路由的版本)分别列入端点清单,测试断言其在各类请求方法下的行为,其中包括 GET 方法的拒绝路径(401 场景),并在多处清单(L113-L119、L183-L189、L253-L259)中保持一致。这些测试覆盖了未认证访问该端点时所有 HTTP 方法均返回 401 的边界,而版本修复的核心在于:即便在已认证场景下,GET 也不再被允许执行导入副作用。

运维影响

  • 如果你有脚本、集成或浏览器书签直接以GET /projects/upload-example的方式触发示例数据导入,升级后必须改为 POST 请求,并携带正常的认证凭据(Session 或 API Token);
  • 该端点仍可用于快速为项目填充示例数据,只是方法约束更严格,属于"破坏性较小、收益较高"的安全收敛。

修复三:S3 端点异常信息白名单化与S3_TRUSTED_STORAGE_DOMAINS配置

问题本质

当 Label Studio 向 S3 兼容存储发起 HTTP 调用(如列举桶、检查对象)失败时,错误信息中通常会携带底层 HTTP 响应细节。这类"完整异常信息"可能暴露内网地址、存储凭证片段、签名细节等敏感内容。旧版本对任意自定义 S3 endpoint 都会原样抛出完整异常,攻击者可通过故意触发错误来探测存储架构。

2.20.1 的修复策略是:仅当 S3 endpoint 属于一份已知的 S3 API 提供商名单时,才返回完整异常信息;其余域名一律返回脱敏后的通用错误,避免敏感信息外泄。

源码实现:异常装饰器与信任域名单

该逻辑在 io_storages/s3/utils.py 中由catch_and_reraise_from_none装饰器实现,其工作流程为:

  1. 捕获被装饰函数抛出的任何异常;
  2. 使用tldextract(仓库中配置为suffix_list_urls=()以禁用联网更新后缀列表,见同文件 L156)解析self.s3_endpoint的注册域名(registered domain);
  3. 将解析结果与settings.S3_TRUSTED_STORAGE_DOMAINS名单做大小写不敏感比对;
  4. 若域名不在名单内:记录详细错误日志(logger.error(..., exc_info=True),供运维排查),但对外抛出统一的S3StorageError,提示 "Debugging info is not available for s3 endpoints on domain: ...",并采用from None抑制原始异常上下文,彻底避免异常链泄露细节;
  5. 若域名在名单内:原样重新抛出完整异常,保证受信任云厂商下排障体验不受影响。

默认信任域名单与覆盖方式

默认信任域在 core/settings/base.py 中定义,涵盖主流 S3 API 提供商:

S3_TRUSTED_STORAGE_DOMAINS = get_env_list( 'S3_TRUSTED_STORAGE_DOMAINS', [ 'amazonaws.com', 'scw.cloud', 'yandexcloud.net', 'digitaloceanspaces.com', 'orange-business.com', 'computecanada.ca', 'cloudflarestorage.com', 'wasabisys.com', 'oracle.com', 'amazon.com', 'appdomain.cloud', ], )

说明:名单中的域名为"注册域名"(registered domain)粒度,因此foo.s3.amazonaws.combucket.customdomain.scw.cloud等子域名均可命中信任规则;判断逻辑对大小写不敏感。

自定义 S3 域名的配置方法(官方示例)

如果你使用非标准/自定义域名托管 S3 API,且希望完整异常信息继续可见,官方明确给出的方案是设置环境变量S3_TRUSTED_STORAGE_DOMAINS,多个域名用英文逗号分隔。沿用 Release Notes 中的示例,假设你的端点为https://foo.mys3endpoint.nethttps://myothers3endpoint.biz,则配置为:

export S3_TRUSTED_STORAGE_DOMAINS="mys3endpoint.net,myothers3endpoint.biz"

Docker Compose 或 Helm 部署场景下可写入环境变量文件或 values 中的env段;设置后重启服务即可生效,无需修改代码。

源码佐证:配置在测试中的验证方式

仓库测试 io_storages/s3/test_utils.py 使用 Django 的@override_settings(S3_TRUSTED_STORAGE_DOMAINS=['trusted-domain.com'])覆写该配置,验证信任域名单对异常处理行为的实际影响,可作为理解该配置语义的最小可复现样例:被覆盖的域名进入白名单后,对应 endpoint 抛出的异常将保留完整细节。

运维建议

  • 默认清单外但可信任的自建 MinIO / Ceph RGW / 内网对象存储:出于安全考虑,默认情况下不应将内网域名加入白名单(否则内网拓扑与异常细节会暴露给客户端);建议保持脱敏,通过服务端日志排查问题;
  • 明确需要完整异常的第三方 S3 兼容服务:按官方示例将对应注册域名加入S3_TRUSTED_STORAGE_DOMAINS
  • 升级前检查是否有脚本依赖 S3 错误消息中的底层字段(如 AWS 错误码文本),如有则需同步配置白名单。

升级与验证清单

针对自托管部署,建议按以下步骤完成本次安全更新:

  1. 升级版本:将 Label Studio Enterprise 升级到 2.20.1,Helm 部署同步升级 Chart 至 1.9.2;
  2. 回归测试:验证项目创建、示例数据导入(改用 POST)、图片标注任务加载、S3/自定义存储的数据列举与导入流程;
  3. 配置检查:若使用非标准 S3 域名,按上文设置S3_TRUSTED_STORAGE_DOMAINS并重启验证;
  4. 安全复测:确认GET /projects/upload-example返回错误/拒绝,确认../类图片路径被拦截(可参考 react 代码代理测试 的 400 场景),确认未信任域名的 S3 endpoint 异常信息已脱敏。

总结

Label Studio Enterprise 2.20.1 的三项修复分别对应文件系统边界(路径穿越)、HTTP 方法语义(GET 副作用导致的 XSS 面)与错误信息泄露(S3 端点信任域)三类问题,均为低成本高收益的安全收敛。对运维团队而言,核心动作有三:尽快升级、将自定义 S3 域名按需加入S3_TRUSTED_STORAGE_DOMAINS、并在升级后复测示例数据导入与存储连接流程。相关配置项与实现均可在本仓库的 io_storages/s3/utils.py、core/settings/base.py 与 tests/test_endpoints.py 中直接查阅验证。

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询