跨越17年的误解

一个2008年的DRM在2025年引发的「供应链攻击」焦虑

故事要从一台高达模型说起……

骗你的。我其实根本不懂高达,但我那次去朋友家里做客,他坚持要给我展示他的众多高达模型收藏。他把这些宝贝放在一个柜子里。我听着他介绍,一边似懂非懂地点头,一边仔细打量这个柜子里的其他东西。此时,我注意到它了。

我说:“原来你家有打印机啊,怎么一直吃灰,也从来没听你提过?”

他说:“几个月前从Facebook Marketplace收的二手,总共才花了50刀(加元,约250人民币),卖家还送了一大堆墨盒。可惜,它太老了,不能连WiFi,得专门接一台电脑。但我手上没多余的电脑了,也许过段时间再去收一台二手机器,专门拿来供它。”

我说:“不必。今天就能用上。”

这是一台佳能MX850,喷墨机,复印、扫描、传真一体,还有我从来没见过的纸盒和后置进纸器,连扫描仪都是平板和进纸器两种扫描方式,甚至这扫描仪的进纸器还配了自动双面(Duplex ADF),让我这个只用过破烂打印机的人开了眼了。这台机器2008年发布,确实不能自主连接到网络,必须有线连接PC。不过,我立刻想到了答案:树莓派。CUPS。把它变成网络打印机。而很巧的是,我手上正好有一个闲置的树莓派3。

我大战打印机的故事,就这么开始了。

用树莓派加CUPS复活古董打印机

我此前从未在Linux上用过CUPS,自然免不了是要折腾一番。安装和配置CUPS算是最容易的部分,首先,给树莓派重新灌入Raspberry Pi OS,这个系统基本上就是原汁原味的Debian加上树莓派的私有驱动。之后,通过apt安装CUPS:

sudo apt update
sudo apt install cups
sudo systemctl enable cups --now

就这样,没了。这台树莓派现在已经是一个CUPS服务器了。

因为我们的树莓派不会暴露到公网,而我们信任家里的每一个设备,所以我放宽了CUPS的默认安全设置,把CUPS的Web界面开放给局域网内的所有设备访问,这样我和朋友就都能直接通过浏览器管理打印机了。修改/etc/cups/cupsd.conf文件,找到这些部分:

Listen localhost:631
...

<Location />
  Order allow,deny
</Location>

<Location /admin>
  Order allow,deny
</Location>

<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>

<Location /admin/log>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
</Location>

分别改为

Listen localhost:631
Listen 10.0.0.250:631 # 加上树莓派在局域网内的IP地址
...

<Location />
  Order allow,deny
  Allow from 10.0.0.*
</Location>

<Location /admin>
  Order allow,deny
  Allow from 10.0.0.*
</Location>

<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  Allow from 10.0.0.*  
</Location>

<Location /admin/log>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  Allow from 10.0.0.*
</Location>

重启一下CUPS服务:

sudo systemctl restart cups

此外,还可以再安装一个avahi-daemon,这样就能在局域网内自动发现打印机了,也可以通过形如http://raspberrypi.local:631的地址访问它:

sudo apt install avahi-daemon
sudo systemctl enable avahi-daemon --now

现在,整个局域网内的设备都能直接发现它,并且直接向它发送打印任务,就像用USB连接的一样方便。

“PC到树莓派”的部分已经做完了,接下来要做的就是补完“树莓派到打印机”的部分。点亮打印机,用USB线连接到树莓派上,打开CUPS的Web界面(http://raspberrypi.local:631),进入“Administration”标签页,点击“Add Printer”,用Linux的账户登录,选择USB上的这台MX850,然后……

在这一步记得勾选“Share This Printer”,这样才能在局域网内发现它!

然后,就是每一个打印机用户最痛恨的部分:驱动。

请享受无法回避的痛苦之打印机驱动

和打印机驱动作战是永恒的痛。这台佳能MX850已经停产多年,佳能官网上只能找到x86版本的Linux驱动,而且极其臃肿,就算能瞎猫碰死耗子般地用qemu-user运行它,也根本不知道该怎么把它连入CUPS,只能求助于第三方驱动了。

幸运的是,已经有人来过了,而且还不止一种选择。

Gutenprint是一个开源驱动,支持大量老旧打印机,包括MX850。Gutenprint的安装和配置都很简单,直接通过apt安装:

sudo apt install printer-driver-gutenprint

安装完成后,重新打开CUPS的“Add Printer”界面,这次在“Make”列表里就能看到“Canon”选项了。选择它,然后在“Model”列表里找到“Canon MX850 series - CUPS+Gutenprint v5.x.x”,继续下一步,就全部完成了。

现在,打印机已经完全可用了。无论是Windows、Mac,还是iPhone,都能直接发现这台打印机,并且直接发送打印任务。至于打印质量,由于没有原厂驱动可供对比,所以不清楚具体是好是坏,但至少打印黑白文档已经完全足够了。彩色和双面打印也能正常使用。

不过,这个故事还没完。

还记得我刚刚提到的“不止一种选择”吗?除了Gutenprint,还有另一个选择:TurboPrint。

TurboPrint是一个商业打印机驱动,和Gutenprint类似,支持各种古董打印机,并且号称打印质量更好,还有诸如校色这样的高级功能。毕竟MX850是一台喷墨机,我当然期望它能达到打印照片的水平,校色功能尤其重要。

TurboPrint并没有包含在大多数Linux发行版的官方软件源里,但它提供了tgz包,可以直接下载并安装。安装完成后,TurboPrint会自动集成到CUPS里,重新打开“Add Printer”界面,此时“Make”列表里会多出“CANON TurboPrint”以及另外几个有TurboPrint后缀的选项。选择它,然后在“Model”列表里找到“Canon MX850 series - TurboPrint v2.xx”,继续下一步,同样的,这样就可以了。

但……它是商业软件——要钱的。TurboPrint不限制免费使用,只是会在打印输出上加水印,很大,而且水印不透明,换句话说免费版完全没法用。

TurboPrint提供了30天的免费试用期,在这30天内,可以免费使用全部功能,不会有任何水印。只是,在我的树莓派上,我一安装完TurboPrint,它就立刻告诉我试用过期。

$ tpconfig
**************************************************************************
TurboPrint Studio XL 2.55-1 (20-SEP-2023) (c) ZEDOnet GmbH
Demo version expired
**************************************************************************

我检查过,系统时间没问题。一定是TurboPrint的DRM机制出了问题。不过我也没多想,毕竟Gutenprint已经能满足基本需求了,此后我们也一直用着Gutenprint。

这时是2025年3月。

大变

半年后。

Debian 13发布了,但新的Raspberry Pi OS还没跟进,我决定自己动手升级一下。升级过程不太顺利,后来我才知道Raspberry Pi OS官方不推荐跨大版本升级,不过这是另一件事了。

尽管不推荐,但原位升级仍然是可行的,请务必按照这个指南操作:https://gist.github.com/jauderho/5f73f16cac28669e56608be14c41006c

树莓派的私有部分卡了不少,我不得不反复回应apt的用户干预请求——总有这个包的依赖关系不满足,那个包的文件被修改之类的问题。

但是,在众多提示中,大概是某种冥冥之中的安排,我立刻注意到了一个特别的提示:

Configuration file '/etc/mime.types'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** mime.types (Y/I/N/O/D/Z) [default=N] ?

好像哪里不对。mime.types?我从来没动过它。

这是系统识别文件类型的基础配置,Linux上的程序在读取或处理内容时,往往要根据它判断该怎么解释数据。它的更新频率很低,通常,只有跨大版本更新系统时,它才会被更新。它不应该被篡改过,一定有鬼——一定有人搞鬼。

按“D”查看的差异变化太多,因为包含原本从Debian 12到13的变更,我没法一眼看出到底改了什么。让我们先中断apt,看看哪里出了问题。

下载mime.types的Debian 12版本:

apt download media-types=10.0.0 # 如果失败,先将source.list改回bookworm,然后apt update
dpkg-deb -x media-types_10.0.0_all.deb /tmp/mime12

对比mime.types文件:

$ diff -u /tmp/mime12/etc/mime.types /etc/mime.types
--- /tmp/mime12/etc/mime.types  2023-02-11 06:45:22.000000000 -0700
+++ /etc/mime.types     2023-03-20 19:46:13.000000000 -0600
@@ -1574,6 +1574,7 @@
 application/x-oz-application                   oza
 application/x-pkcs7-certreqresp                        p7r
 application/x-pki-message
+application/x-posiwgnpntxd
 application/x-python-code                      pyc pyo
 application/x-qgis                             qgs shp shx
 application/x-quicktimeplayer                  qtl

这是毫无意义的乱码,看起来像某种密码。我Google过了,没有结果。最怪异的是,文件修改时间就是当时装系统的时间。

……

不好,有刺客!

无数种最糟糕的可能性涌上心头。黑客入侵?供应链攻击?是你吗,Jia Tan?

我立刻检查了journald日志,看看有没有异常登录记录。没有。这台树莓派本来就不暴露到公网,而朋友不懂Linux。

查查bash历史记录吧。一边看,一边回忆我在这一版本的系统上都做过什么,装过什么。

所有的包都是走apt安装的……等等,有一个例外。


TurboPrint。

它是闭源的。而且不经过apt,是自己的二进制安装程序。

它的嫌疑最大。


用strings看看它的可执行文件里都包含什么字符串:

$ strings /usr/bin/turboprint | grep mime
/etc/mime.types

$ strings /usr/bin/turboprint | grep application
application/x-p
...

TurboPrint的其他几个可执行文件,/usr/bin/tpconfig/usr/bin/tpsetup等,也呈现完全相同的结果。现在,我有99%的把握,就是它。

但我没有证据。我需要100%的把握。而且,更重要的是,我现在该干什么?

大调查

稍冷静后,我决定做一个实验:在一台全新机器上安装TurboPrint,看看它会不会修改mime.types。这次我在x86虚拟机上测试,使用inotifywait监控系统文件变化,看看它都修改了什么。

$ sudo inotifywait -m -r /etc /usr /bin /sbin /boot /var /home /root /opt --exclude '^/var/log(/|$)' -e create -e modify -e delete -e attrib -e move > inotifywait_install.log
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

然后,让我们安装TurboPrint。

$ wget https://www.zedonet.com/download/tp2/turboprint-2.58-1.x86_64.tgz
$ tar -zxf turboprint-2.58-1.x86_64.tgz
$ cd turboprint-2.58-1
$ sudo ./setup

TURBOPRINT 2 INSTALLATION

Installation language (e)nglish or (d)eutsch? e

./setup.sh: line 201: /var/log/turboprint/install.log: No such file or directory
./setup.sh: line 202: /var/log/turboprint/install.log: No such file or directory
./setup.sh: line 207: /var/log/turboprint/install.log: No such file or directory

Installation for CUPS printing system (TP_CUPS=1)
Configuration files will go to.. /etc/turboprint
Shared files will go to......... /usr/share/turboprint
Executable files will go to..... /usr/bin
Logfiles files will go to....... /var/log
Documentation will go to........ /usr/share/doc/turboprint
Browser for documentation....... firefox

(edit system.cfg to change installation paths)

Begin installation now (y/n)? y
Copying program files...
install: omitting directory 'lib/appindicator'
install: omitting directory 'lib/gimpplugin'
install: omitting directory 'lib/gnomeapplet'
install: omitting directory 'lib/kde3applet'
install: omitting directory 'lib/kde41applet'
install: omitting directory 'lib/kde42applet'
install: omitting directory 'lib/kde5applet'
done
Installing TurboPrint daemon with systemd
Restarting TurboPrint printer port daemon
Creating PPD printer description files...
done
Updating existing TurboPrint printer entries...
done
Installing bjnp network backend for canon printers
Installing Ghostscript version for TurboPrint
E: Unable to locate package python-gobject
RESULT 0

Checking shared libraries:
(add missing libraries with your package manager)

* gdk     library NOT found (part of gtk)
* gdk     library NOT found (part of gtk)
* gtk     library NOT found

Checking filter programs:
(if required, add missing packages with your package manager)

  gs            found          (needed for PS,PDF,FIG,DVI,troff,html,ASCII)
  lp            found          (command line printing)

Installation completed

HTML documentation can be found in /html /usr/share/doc/turboprint/html
Do you want to read the manual now (y/n)? n

$

让我们看看inotifywait.log里都记录了什么:

/usr/bin/ CREATE csrh
/usr/bin/ MODIFY csrh
/usr/bin/ ATTRIB csrh
...
/etc/ MODIFY mime.types
/etc/ ATTRIB mime.types

再看一眼mime.types:

$ cat /etc/mime.types | grep application/x-p
...
application/x-pojqujcbptxd
...

同样的乱码出现了。果然是你。

那么,卸载掉会如何呢?执行同样的inotifywait监控,然后卸载:

$ sudo ./uninstall.sh

Turboprint deinstallation
=========================
Will delete the following directories:
/etc/turboprint
/usr/share/turboprint
/usr/lib/turboprint
/var/log/turboprint
/var/spool/turboprint

And the following files:
/usr/bin/tpprint
/usr/bin/tpsetup
/usr/bin/tpconfig
/usr/bin/turboprint
/usr/share/man/man1/tpprint.1
/usr/share/man/man1/tpsetup.1
/usr/share/man/man1/tpconfig.1
/usr/share/man/man7/tpfilter.7
/usr/share/man/man7/turboprint.7
/usr/share/cups/model/turboprint

Start deinstallation now? y
Removing TurboPrint files...
Deinstallation complete
RESULT 0

$
/var/spool/ DELETE,ISDIR turboprint
...
/usr/local/share/ DELETE,ISDIR gpturboprint
/usr/bin/ DELETE gszedo
...
/etc/ DELETE,ISDIR turboprint
...
/usr/lib/ DELETE,ISDIR turboprint
/usr/bin/ DELETE tpprint
/usr/bin/ DELETE tpsetup
/usr/bin/ DELETE tpconfig
/usr/bin/ DELETE turboprint
/usr/bin/ DELETE turboprint-monitor
...

(点此查看完整的inotifywait_install.loginotifywait_uninstall.log

它的确删掉了自己的绝大多数文件,不得不说,处理得还是很干净的。但是,有两个例外。

/usr/bin/csrh还在,/etc/mime.types也没有被还原。

$ cat /etc/mime.types | grep application/x-p
...
application/x-pojqujcbptxd
...

小手不太干净。

让我们再看看另外那个留下的可执行文件csrh是什么东西:

$ strings /usr/bin/csrh
...
fxww
w6Zxdg7n
j4e;
BXa6
...

没有人类可读的字符串。试试直接执行它吧。

$ csrh
bash: /usr/bin/csrh: cannot execute binary file: Exec format error

有问题。再仔细看看:

$ file /usr/bin/csrh
/usr/bin/csrh: data

$ cat /usr/bin/csrh | head -c 30
`Ö�[]}�i]�T䆁�w�8�p퉏>m

这不是可执行文件,而是一堆不可读的数据。

但是TurboPrint到底在用它干嘛?让我们重新装一次,然后看看它都做了什么。

/usr/bin/turboprint需要X11,我们换另一个可执行文件。它要求root权限执行:

$ sudo strace tpsetup
...
openat(AT_FDCWD, "/usr/bin/csrh", O_RDONLY) = 3
openat(AT_FDCWD, "/etc/mime.types", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=78309, ...}) = 0
fstat(4, {st_mode=S_IFREG|0644, st_size=78309, ...}) = 0
lseek(4, 77824, SEEK_SET)               = 77824
read(4, "ttools.smacker\t\t\tsmk\nvideo/vnd.s"..., 485) = 485
lseek(4, 0, SEEK_SET)                   = 0
read(4, "################################"..., 77824) = 77824
read(4, "ttools.smacker\t\t\tsmk\nvideo/vnd.s"..., 4096) = 485
close(4)                                = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/bin/csrh", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=1976, ...}) = 0
read(3, "`\303\226\243[]}\366i]\371T\344\206\201\310w\2558\364\3p\24\33<\355\211\217>m\375\333"..., 4096) = 1976
close(3)                                = 0
openat(AT_FDCWD, "/usr/bin/csrh", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=1976, ...}) = 0
read(3, "`\303\226\243[]}\366i]\371T\344\206\201\310w\2558\364\3p\24\33<\355\211\217>m\375\333"..., 4096) = 1976
close(3)                                = 0
...

(点此查看完整的strace_tpsetup.log

它读了很多次这些文件,但没有修改。只是,它到底在干嘛,我实在看不懂。

它打开了几次/usr/bin/csrh,一次什么也没做,一次读了里面的内容。它也打开了/etc/mime.types,立刻seek到一个很远的位置,显然它在找那个密码。

我对着strace的输出一筹莫展,漫无目的地到处翻log。我没信心能从strace的记录里找出什么特别有用的信息,到这时候,也许只有反编译能解开它的谜团。突然,我注意到了一行:

write(1, "Demo version - trial period unti"..., 52Demo version - trial period until 13-Dec-2025 23:52
) = 52

由于缺少当时的截图,此处的日志是后来按照bash历史记录重现的

它输出了什么?让我们再试一次运行tpconfig,看得清楚些:

$ sudo tpsetup
**************************************************************************
TurboPrint Studio XL 2.58-1 (02-JUN-2025) (c) ZEDOnet GmbH
Demo version - trial period until 13-Dec-2025 23:52
**************************************************************************

=========================================================
TurboPrint printer config - main menu
=========================================================
Nr.Def.Short Configuration                Connect  Paper       Quality Mode
------------------------------------------------------------------------------

<number> - change settings for a printer
       S - Save changes & exit      Q - Quit without saving
Your choice:

23:52。那是几分钟前,第一次装它的时候。

我好像明白了。这是DRM,难道说?


我没有仔细研究它的算法,也不想立刻反编译。我只是想知道,如果把它留下的这些痕迹抹掉,它会作何反应。

让我试试移除它们,一次一个。

来看看会发生什么:

# 先删掉/usr/bin/csrh
$ sudo mv /usr/bin/csrh /usr/bin/csrh.bak
$ sudo tpsetup
**************************************************************************
TurboPrint Studio XL 2.58-1 (02-JUN-2025) (c) ZEDOnet GmbH
Demo version expired
**************************************************************************
...

$ sudo nano /etc/mime.types
# 把mime.types里的那行乱码删掉
$ sudo tpsetup
**************************************************************************
TurboPrint Studio XL 2.58-1 (02-JUN-2025) (c) ZEDOnet GmbH
*** unregistered ***
**************************************************************************

移除csrh,试用期立刻过期;移除mime.types里的那行乱码,试用期变成了“未注册”——行为上和过期是一样的,同样是打印带水印,但还能看出一个额外的信息:它不认为系统里存在任何DRM状态了。

啊哈,全搞清楚了!这就是TurboPrint的DRM。

它把安装时间加密后藏在这里,并且卸载后保留,是为了防止用户通过反复安装卸载来重置试用期。两个文件来相互验证,任何一个不对都会触发保护,直接让试用期失效。当然,破坏两个也是一样失效。

太好了,这下可以排除黑客的可能性了。

技术债的幽灵

只是,这件事仍然在我脑海中挥之不去。

这对吗?这真的合理吗?

它没有在用户手册或许可协议中说过它会动/etc/mime.types这么一个至关重要的Linux核心文件。它把数据藏在这里,理论上就是破坏系统完整性的行为,而且也确实造成了影响——我升级系统时就遇到了问题。

况且,我感受到的冒犯和惊吓也是真实的——那一瞬间,我的第一反应就是供应链攻击。

还有,那个/usr/bin/csrh,它根本不是可执行文件,却被添加了执行权限。/usr/bin/只应该放真正的可执行文件。

让我们试想一下,如果一个生产环境的系统管理员,发现了这样的事情,他的反应恐怕只会比我更激烈。

如果是不可变系统……

如果这事发生得更早,那时我还在这个树莓派上运行openSUSE MicroOS,如果我要装TurboPrint,会发生什么?

MicroOS是一个不可变系统,它的根文件系统是只读的,/etc/mime.types不能被外部修改。理论上,确实不应该在不可变系统上用make install或者TurboPrint这种自带安装程序的软件,但假设我执意要装呢?TurboPrint安装程序会直接失败吗?如果我不得不解锁根文件系统然后安装它,未来这个系统还能正常使用,正常升级吗?

更隐蔽的是,TurboPrint在x86上提供deb和rpm包,但我测试过了,deb和rpm在卸载时也会留下这些DRM痕迹。


如果你用过不可变系统,你大概已经感觉头皮发麻了。不过,还是让我把这种情况说清楚:

假设一个(倒霉的)Fedora Silverblue用户,他也有一台这样的近代的打印机,而他需要打印一些特殊材质(比如CD封面),不得不用TurboPrint。他下载了TurboPrint的rpm包,用rpm-ostree install安装了它。TurboPrint安装成功了,打印机也能用了。

之后,他卸载了TurboPrint,觉得自己再也不需要它了。rpm-ostree uninstall turboprint,一切看起来都很顺利。

但实际上,TurboPrint在卸载时留下的DRM痕迹依然存在于根文件系统中。他的Silverblue就此进入一个不稳定,或者至少是不确定的状态,当他下一次使用rpm-ostree时,可能就会因为这些意外的污染而失败,不得不回滚整个系统——我们就假设他不会在这种时候继续让系统带病运行吧。


我没在故意挑刺,不可变系统已经在逐渐进入主流,而TurboPrint在某些情况下就是唯一选择,不可替代。

供应链攻击的阴影

让我们回到那个心肺停止的时刻:

Configuration file '/etc/mime.types'
 ==> Modified (by you or by a script) since installation.
...
+++ /etc/mime.types     2023-03-20 19:46:13.000000000 -0600

为什么我的第一反应是供应链攻击?

因为2024年的XZ Utils后门事件

化名为“Jia Tan”的维护者花了数年时间获取社区信任,然后在xz植入后门。这个后门差点进入全世界几乎所有的Linux系统。

xz后门的原理和TurboPrint DRM其实没有任何相似之处,但是,在那件事之后,整个Linux社区的安全意识已经完全变了。

任何对文件系统的异常修改,都不再是小事。它们不再被视为粗糙或者不专业,而是明显的危险信号。

我原本想就此对TurboPrint大加批判,写一篇檄文,把它挂到Hacker News上,帮它炒作一番。但很快我冷静下来,我意识到……它其实没故意犯错。


它只是过时了。

代际冲突

要想破开这套DRM设计的迷雾,我们得回到TurboPrint的起源。

1988年,TurboPrint诞生,最初为Amiga开发打印机驱动。
1991年,Linux 1.0发布。
约1999-2000年,TurboPrint for Linux的第一个版本诞生。
2007年,TurboPrint for Amiga最后一次更新。
2008年,TurboPrint for Linux 2.0发布,引入了我们现在看到的这套DRM机制。

2008年。17年前。


那时的Linux长什么样?

  • 最新的系统是Debian 5.x(Lenny)
  • 主流的桌面环境是GNOME 2和KDE 3
  • systemd还不存在
  • SELinux虽然有了,但普及度不足

至于容器和不可变系统,更是天方夜谭。

最重要的是,包管理器还不是铁律。如果你有幸经历过十多年前的Linux时代,你应该很熟悉这套流程:

./configure
make
sudo make install

make install会把文件直接复制到系统目录里,完全不经过包管理器;向/etc/mime.types自行添加新类型,也是理所当然的事情。

而TurboPrint的./setup,和make install的思路完全一样,区别只是它是GUI程序。

没人觉得这有问题。这就是那个时代的常态。


但17年过去了,我们经历了xz后门事件,迎来了Docker、Snap Flatpak,还有Silverblue和MicroOS这样的不可变系统。我们开始留心供应链攻击,开始重视系统完整性。

时代变了,而TurboPrint的DRM设计,停留在了17年前。

没有完美答案

TurboPrint确实违反了现代Linux的准则。

可是,问题不光是整整17年的时间,还有单机软件DRM这个永恒的困境。

如果让我穿越回2008年,站在那个年代的开发者角度:我需要防止试用期被重置,但是很多机器可能并不联网,也没有可靠的硬件级指纹。

我会怎么做?

可能,我也会选择在/etc/mime.types藏个标记。


到了2025年,这个设计就一无是处吗?

从隐私角度看,TurboPrint的选择其实很克制。

它没有收集任何用户数据,不访问硬件标识符,甚至完全不连接互联网。它只是把安装时间藏在一个不显眼的地方。

这在GDPR的视角下,可能是最保险的做法——TurboPrint的开发商ZEDOnet GmbH位于德国。


联网DRM,膈应用户;离线DRM,要么漏得像筛子,要么膈应系统管理员。

Linux的系统完整性和纯离线的完美隐私,在这一刻,竟然成了难两全的问题。

琥珀里的昆虫

至此,TurboPrint的故事就要迎来尾声了。

我理解了所有的来龙去脉,也接受了它自己的局限性。

可是,我还是感觉五味杂陈。

它像一只被困在琥珀里的昆虫,凝固在17年前的时光里。

我该用一种什么样的心态去看待它呢?

是宽容,还是批判?

或许,不需要一个明确的答案。

它就在那里,一个已经远去的时代的最后见证者。

最后一个谜题

还记得吗?在树莓派(arm64)上,TurboPrint从安装那一刻就显示“Demo version expired”。

我后来在另一个arm64虚拟机上测试过,结果也是一样的——TurboPrint的arm64版本,试用的功能是损坏的,表现和树莓派一样。x86版本则不受影响。

我能修好它吗?请听下回分解。