DuckDB 拥有一个强大的扩展机制,这些扩展拥有与运行 DuckDB 的(父)进程用户相同的权限。 这引入了安全考虑。因此,我们建议查看本页列出的配置选项,并根据您的攻击模型进行设置。
DuckDB 签名检查
DuckDB扩展在每次加载时都会通过二进制文件的签名进行检查。 目前有三种类型的扩展:
- 使用
core
密钥签名。只有经过DuckDB核心团队审核的扩展才会使用这些密钥进行签名。 - 使用
community
密钥签名。这些是通过DuckDB社区扩展仓库分发的开源扩展。 - 无符号。
扩展安全级别概述
DuckDB 为扩展提供了以下安全级别。
可用的扩展 | 描述 | 配置 |
---|---|---|
core | 扩展只能从core 仓库安装。 |
SET allow_community_extensions = false |
核心和社区 | 扩展只能从core 和community 仓库安装。 |
这是默认的安全级别。 |
任何扩展包括未签名的 | 可以安装任何扩展。 | SET allow_unsigned_extensions = true |
安全相关的配置设置锁定自身,即只能在当前进程中限制功能。
例如,尝试进行以下配置更改将导致错误:
SET allow_community_extensions = false;
SET allow_community_extensions = true;
Invalid Input Error: Cannot upgrade allow_community_extensions setting while database is running
社区扩展
DuckDB 有一个社区扩展库,可以方便地安装第三方扩展。 像 pip 或 npm 这样的社区扩展库本质上是通过设计实现远程代码执行的。这听起来并不那么戏剧化。无论好坏,我们已经习惯了从网络上随意获取脚本并直接运行,并且经常毫不犹豫地安装大量的传递依赖。像 CRAN 这样的库在某些时候会进行人工检查,但这也不能保证任何东西。
我们已经研究了几种不同的社区扩展仓库方法,并选择了我们认为合理的方法:我们不尝试审查提交的内容,但要求扩展的源代码是可用的。我们确实接管了完整的构建、签名和分发过程。请注意,这比允许上传任意二进制文件的pip和npm更进一步,但比手动审查所有内容更进一步。我们允许用户报告恶意扩展,并显示采用统计数据,如GitHub星标和下载次数。因为我们管理仓库,我们可以快速从分发中删除有问题的扩展。
尽管如此,从社区扩展仓库安装和加载DuckDB扩展将执行由第三方开发者编写的代码,因此可能是危险的。恶意开发者可以创建并注册一个看起来无害的DuckDB扩展,窃取你的加密货币。如果你正在运行一个使用DuckDB执行来自用户的不受信任的SQL的Web服务,完全禁用社区扩展的安装和加载可能是一个好主意。可以这样做:
SET allow_community_extensions = false;
禁用自动安装和自动加载已知扩展
默认情况下,DuckDB会自动安装并加载已知的扩展。
要禁用自动安装已知扩展,请运行:
SET autoinstall_known_extensions = false;
要禁用自动加载已知扩展,请运行:
SET autoload_known_extensions = false;
要锁定此配置,请使用 lock_configuration
选项:
SET lock_configuration = true;
始终要求签名扩展
默认情况下,DuckDB要求扩展必须被签名为核心扩展(由DuckDB开发者创建)或社区扩展(由第三方开发者创建但由DuckDB开发者分发)。可以在启动时启用allow_unsigned_extensions
设置,以允许运行完全没有签名的扩展。虽然这对于扩展开发很有用,但启用此设置将允许DuckDB加载任何扩展,这意味着必须更加小心,以确保不会加载恶意扩展。