把 SQLite 数据库直接变成 Linux 可执行文件

Simon Willison9 小时前

SQLite 文件也能直接执行?

Farid Zakaria 展示了一种颇有意思的 Linux 模式:创建一个 SQLite 数据库文件,同时让它能够像普通二进制程序一样被直接执行。

核心做法是利用 SQLite 文件格式中的 4 字节 Application ID。这个字段位于文件偏移量 68 字节的位置,将其设置为 SELF,代表 Structured Executable & Linkable Format

随后,不再按照普通 ELF 文件的方式保存可执行程序,而是把 ELF 可执行格式所需的不同组成部分组织到多个 SQLite 数据表中。

self-exec 负责真正执行

仅仅把 ELF 数据放进 SQLite 并不足以运行程序,因此还需要一个名为 self-exec 的解释器。

它负责从数据库中提取执行所需的内容,并完成后续执行过程。也就是说,这里的 SQLite 文件并不是 Linux 内核原生理解的新型 ELF,而是通过额外的解释器建立了 SQLite 数据结构与程序执行之间的桥梁。

再结合 binfmt_misc

Linux 提供了 binfmt_misc 机制,可以根据文件中的特定二进制模式,为一种文件格式注册对应的解释器。

由于这种 SQLite 文件在偏移量 68 字节的位置带有 SELF 标记,因此可以注册规则,让内核遇到符合这一特征的可执行文件时自动调用 self-exec

示例注册命令大致如下:

printf '%s\n' ':self:M:68:SELF::/usr/local/bin/self-exec:' \
  > /proc/sys/fs/binfmt_misc/register

原方案在 NixOS 环境中进行了配置;对于非 NixOS 系统,上述命令展示了直接通过 binfmt_misc 注册解释器的大致方式。

这个实验有趣在哪里?

它把几个原本相对独立的机制组合了起来:SQLite 的 Application ID 用来识别特殊文件,SQLite 表负责组织 ELF 相关数据,self-exec 负责读取和执行,而 binfmt_misc 则让 Linux 能根据文件特征自动选择解释器。

最终得到的文件既保持 SQLite 数据库的组织形式,又可以借助 Linux 的解释器注册机制获得类似普通可执行文件的使用方式。

这并不意味着 SQLite 本身突然具备了执行 ELF 程序的能力,而是展示了 Linux 文件格式识别、解释器机制与 SQLite 可扩展文件结构可以如何组合。

评论

请登录后发表观点

暂无数据