一个给 X11 桌面“下雪”的小程序,最近把 Debian 社区拉进了一场不小的争论。

这个程序叫 xsnow。它本来做的是桌面装饰:飘雪、树木、圣诞老人。但代码里有一个彩蛋:当语言设置为俄语,也就是 ru 时,它会以约 30% 的概率显示乌克兰旗帜;其他语言环境下也可能出现,概率约 2%。

投诉者 Alexander Ivanov 认为,这种按俄语界面提高触发概率的隐藏视觉元素带有政治指向,像一种“protestware”。他还认为这违反 Debian Free Software Guidelines(DFSG)第 5、6 条。

我更在意的不是旗帜本身,而是触发方式。一个软件可以有立场,也可以有彩蛋。但如果它隐藏地读取本地语言设置,并对某一类用户提高触发概率,这就不只是作者表达了。

它开始碰到发行版仓库的信任边界。

争议源头:一个按 ru 提高概率的彩蛋

目前能确认的事实并不复杂。

相关代码在 xsnow 的 src/scenery.c。在启用 USE_EXTRATREE 时,如果 global.Languageru,并且随机数小于 0.3,程序会把树木类型切到 MAXTREETYPE。对应图像文件是乌克兰旗帜。

非俄语环境下,也有一次约 0.02 的随机触发。

这不是 Debian 专门加入的补丁。相关代码来自上游 xsnow。更微妙的是,Debian 包维护者 Willem Vermin 同时也是 xsnow 的上游维护者。

这让投诉者没有直接走 bug 系统,而是写信到 Debian 开发邮件列表,希望社区介入。但到原文发布时,投诉者还没有提交正式 bug。

问题已知事实我会怎么判断
软件是什么xsnow 是 X11 桌面降雪/装饰程序不是核心组件,但进入官方仓库仍带有信任背书
触发差异俄语约 30%,其他语言约 2%争议点在“隐藏且按本地信息区别对待”
代码来源来自上游,不是 Debian 单独补丁不能写成 Debian 主动植入政治内容
当前流程原文发布时尚未提交 bug邮件抱怨很难直接推动包变更

这里有一个容易被忽略的差别:如果程序开关里明写“显示乌克兰旗帜”,用户知道自己启用了什么,那是另一回事。现在的问题是,它藏在 locale 后面。

这对俄语用户尤其敏感。不是所有使用俄语界面的人都住在俄罗斯,也不是所有人都有安全表达政治态度的环境。工作屏幕、公共场合、学校或单位设备上突然出现旗帜,风险可能落到用户身上,而不是落到写代码的人身上。

DFSG 管许可证,不是用来审查所有软件内容

Ivanov 把问题落到 DFSG #5、#6 上。大意是 Debian 的自由软件准则不允许许可证歧视个人、群体,也不允许歧视使用领域。

但 Debian 讨论中,多名参与者指出:DFSG 约束的是许可证条款,不是要求软件行为完全不带政治表达。xsnow 主要采用 GPLv3。就目前线索看,许可证本身没有因为这个彩蛋变得不自由。

这点很重要。

如果把 DFSG 解读成“Debian 仓库里的程序不能出现政治内容”,那会滑向内容审查。开源软件里一直有玩笑、彩蛋、观点表达。Debian 自家的 apt moo 就是老例子。fortune 包也曾因为冒犯性内容,在 2025 年 trixie 发布前被移除。

但 xsnow 这次不只是“有没有表达”。Russ Allbery 的判断更贴近要害:隐藏地根据 locale、用户名或其他用户未预期会影响行为的本地信息改变表现,未必违反 DFSG,但可能不是 Debian 想收录的东西。

我认同这个区分。

DFSG 是门槛,解决“许可证是不是自由”。仓库治理还要解决另一件事:用户安装一个官方包时,能不能合理预期它不会暗中按身份线索改变行为。

对开源维护者来说,这意味着一件很具体的事:如果软件里有按 locale、地区、用户名、主机名触发的隐藏逻辑,最好主动说明、加开关,或者移除差异触发。不要等用户在邮件列表里把它定义成 protestware。

对关注供应链治理的团队来说,动作也很具体:这类包不一定要立刻拉黑,更不该被夸大成恶意软件;但如果它会进入默认镜像、桌面基线或教学/办公环境,至少应延后纳入,等 bug 结论或维护者回应。风险不在破坏系统,而在把未告知的政治表达推给终端用户。

真正会改变结果的是 bug 和项目流程

Debian 给维护者很大裁量权,但不是维护者一个人说了算。

项目有自己的纠偏机制。原文提到,Debian Technical Committee 曾在 2025 年要求回退 systemd 对 /run/lock 的改动;项目也曾在讨论后移除不适合发布的包。也就是说,只要问题被正式提出,Debian 可以把它当作包质量、用户风险或发布适配问题来处理。

但邮件列表上的抱怨,通常不是最有效的入口。

接下来最该看的不是谁在政治上赢了,而是三件事:

  • Ivanov 是否提交正式 bug,并把争议从邮件讨论变成可跟踪事项;
  • Vermin 是否作为上游和 Debian 包维护者回应,选择保留、加开关、降概率或移除;
  • Debian 是否把“按 locale 隐藏触发政治内容”归入应修复的包行为问题。

据原文,截至发布,投诉者尚未提交 bug。原文作者联系 Vermin,询问是否愿意回退乌克兰旗帜显示,也没有得到回复。

这就是这件事目前的边界:Debian 没有认定 xsnow 违规,也没有决定移除或修改它。现有事实只能说明,一个上游彩蛋进入了 Debian 包,并引出了仓库治理问题。

小程序不等于小问题。官方仓库里的软件,靠的不只是许可证合格,也靠用户相信它不会暗中拿本地信息做差异化触发。彩蛋可以有,立场也可以有;但藏起来、按语言群体挑人出现,就失了分寸。