yay v13 与 AURpocalypse
摘要
yay v13 引入了 Lua 钩子以实现可扩展性,并显示 PKGBUILD 最后修改时间,帮助用户更仔细地审查软件包,以回应 AURpocalypse 事件。
<p><a href="https://lobste.rs/s/e325gb/yay_v13_aurpocalypse">评论</a></p>
查看缓存全文
缓存时间: 2026/06/18 10:01
# yay v13 与 AUR末日
来源:https://jguer.space/blog/2026-06-15-yay-v13
在 yay-v12 (https://jguer.space/blog/yay-v12) 中,我曾提到它可能是过去五年中最大的更新。那确实是 yay 核心、架构和代码的最大更新。但这次的 v13 版本 (https://github.com/Jguer/yay/releases/tag/v13.0.0) 可能会成为你在使用 yay 时体验上最大的改变。
长久以来,我一直希望 yay 能更易扩展、更便于 UI 项目封装、更友好地对待我所热爱的人们——那些喜欢折腾、美化定制的玩家,那些看到某样东西就感觉有缺失之美可以补充的人们。
这与我希望 yay 保持精简、朴素、易于维护的愿望之间存在巨大摩擦。尽管每个配置选项都有其价值,但它们也引入了新的 bug 面、新的边界情况以及新的维护负担。
因此,我们推出了可扩展的钩子。不仅仅是那种"即用即弃"的类型,而是能够真正改变体验的钩子。yay v12 中的许多改动,如可插拔接口和对 AUR 与仓库包的通用抽象,都服务于一个单一目标:grpc 插件。这在 Go 领域是一个常见的模式,用于 vault、terraform、grafana……但它们的设置很繁琐,yay 自身的二进制体积也因此大幅增加,而且实现时通常是大型扩展,是伴随大型单体应用的小型单体,而不是可以共享和复用的轻量级附加组件。
如果说最近几天我看到了什么,那就是我们有一个想要编写脚本的社区。我已经记不清在 AUR 末日事件后审查过的 bash 脚本数量了。结果发现,对于这类自动化任务,我们已经有了一种优秀的语言和思考框架。那就是 Lua 和 neovim。yay v13 带来的就是用一种非常令人愉快的语言(而且我很怀念 awesomewm,它就是用 Lua 配置的)编写的小型可扩展钩子。
## AUR末日
其实并不是什么 "AUR末日"。AUR 在其既定的信任模型内正常工作。可以针对提交、流行度计算和孤儿包采纳提交进行修改,但 Arch 用户仓库是一个社区生成内容的来源,就像 GitHub 或最新的 AI 编码工具,要求你 `curl | sh` 从其域名安装某些东西。
向所有 Arch Linux 团队成员表示感谢,感谢你们从个人生活中抽出时间来减轻此事件的影响,你们的工作值得高度赞赏和珍视。
在 yay 的问题追踪器中,有许多功能请求随之而来,要求对 `npm install yyy` 进行包扫描、延迟时间更新、维护者变更跟踪……
下一波恶意软件将以另一种形式、另一种传递方式出现,所有检测扫描都会反馈到其生成周期中,即"迭代直到不被检测到为止"。
为了确保 yay 的版本得到充分测试,有足够的时间通过社区验证,并且核心功能"我能安装一个包"保持最小且完整,发布流程无法快得跟上节奏。
我想避免安全表演:检查可以有所帮助,但它们应该补充而非取代构建文件审查。这并不意味着我们不应该针对已知威胁采取任何行动,也不意味着我们不应该让审查变得更简单。
这个版本的发布极大地受到以下目标的推动:使审查包更容易,并自动化一些无需人工干预即可完成的检查。
## 显示 PKGBUILD 最后修改时间
yay 现在会显示 PKGBUILD 最后一次修改距今多久。最近被修改的包并不是回避它的理由,但它是一个在安装前更加谨慎并审查 PKGBUILD 的理由。同样,长时间未修改的包也不是信任它的理由,但它是一个更相信它已得到社区审查的理由。感谢 `@rebelonion` 对此的贡献。
```
yay -Ss brave
aur/pi-skill-brave-search-git r24.75d32a3-1 (+0 0.00) [18d13h]
Pi coding agent skill for Brave Search web search and content extraction
aur/suave 2.0-1 (+1 0.00) [2805d5h]
Sport Utility Assault Vehicle Extreme. Drive very small, but very brave tank.
aur/brave-extension-bitwarden-git 2026.2.0.r21100.g0f113e2-1 (+1 0.00) [94d22h]
Bitwarden browser extension for Brave
aur/brave-beta-bin 1.92.120-1 (+55 0.44) [4d14h]
Web browser that blocks ads and trackers by default (beta binary release).
aur/brave-origin-beta-bin 1.92.120-1 (+14 8.77) [4d15h]
The minimalist browser from the makers of Brave (beta binary release).
aur/brave-nightly-bin 1.93.67-1 (+42 1.10) [6h17m]
Web browser that blocks ads and trackers by default (nightly binary release).
aur/brave-origin-nightly-bin 1.93.67-1 (+20 10.69) [6h39m]
The minimalist browser from the makers of Brave (nightly binary release).
aur/brave-origin-bin 1:1.91.172-1 (+20 17.41) [3d5h]
The minimalist browser from the makers of Brave (binary release).
aur/brave-bin 1:1.91.172-1 (+1010 23.90) [3d5h]
Web browser that blocks ads and trackers by default (binary release)
extra/python-adblock 0.6.0-5 (1.3 MiB 6.8 MiB)
Brave's adblock library in Python
```
最后修改标签将显示在搜索、yogurt 和升级菜单中。
```
:: Synchronizing package databases...
core downloading...
extra downloading...
:: Searching AUR for updates...
:: Searching databases for updates...
:: 14 packages to upgrade/install.
5 core/procps-ng 4.0.6-1 -> 4.0.6-2
4 extra/git-delta 0.19.2-1 -> 0.19.2-2
3 extra/github-cli 2.93.0-1 -> 2.94.0-1
2 extra/python-tqdm 4.68.1-1 -> 4.68.2-1
1 aur/yay 12.5.7-1 -> 12.6.0-1 [8d4h]
==> Packages to exclude: (eg: "1 2 3", "1-3", "^4" or repo name)
-> Excluding packages may cause partial upgrades and break systems
==>
```
## Lua 配置支持
yay 现在可以从 `init.lua` 加载配置和钩子,这使得自动化检查和包流程决策变得容易得多。如果不存在 `init.lua` 文件,则不执行任何 Lua 代码。
`config.json` 仍会被加载,但 `init.lua` 可以覆盖任何选项。CLI 标志仍然优先于 `init.lua` 和 `config.json`。
`init.lua` 将从 `$XDG_CONFIG_HOME/yay/init.lua`(通常是 `~/.config/yay/init.lua`)加载。
选项可以通过 `yay.opt` 设置:
```
yay.opt.bottom_up = true -- 在混合结果中,在仓库包之前显示 AUR 包。
yay.opt.sort_by = "" -- AUR 搜索排序字段:"votes" | "popularity" | "name" | "base" | "submitted" | "modified" | ""。
```
## Lua 钩子支持
可以为 yay 流程中的不同事件注册 Lua 钩子。Lua API 文档将在 https://jguer.github.io/yay/lua.html 保持更新。
以下是一些可以注册的钩子示例:
### 升级选择钩子(`UpgradeSelect`)
这在 `yay -Syu` 期间运行,在计算升级之后、原生排除菜单之前。钩子可以返回要排除的包名。
例如,我们使用钩子来跳过近期修改过的 AUR PKGBUILD。
```
yay.create_autocmd("UpgradeSelect", {
desc = "skip recently modified AUR upgrades",
callback = function(event)
local exclude = {}
local recent_cutoff = os.time() - (3 * 24 * 60 * 60)
for _, pkg in ipairs(event.data.upgrades) do
if pkg.repository == "aur" and pkg.last_modified >= recent_cutoff then
table.insert(exclude, pkg.name)
end
end
return { exclude = exclude, skip_menu = false }
end,
})
```
更完整的带日志记录示例可在此处 (https://github.com/Jguer/yay/blob/next/doc/examples/recently_modified.lua) 查看。
可以为同一事件注册多个钩子。在这种情况下,`exclude` 列表会在各钩子间合并。如果任何钩子返回 `skip_menu = true`,yay 会跳过原生包选择菜单。
### AUR 预安装和后下载钩子
`AURPreInstall` 和 `AURPostDownload` 每个包基运行一次,但在 AUR 安装流程的不同时刻。
- `AURPreInstall`:在获取 PKGBUILD 仓库后、清理/diff/编辑菜单或任何构建工作之前立即运行。
- `AURPostDownload`:在 `makepkg --verifysource` 之后运行,因此可以访问 PKGBUILD 仓库和源文件。它仍在兼容性检查、PGP 导入提示和安装之前运行。
使用 `AURPreInstall` 根据 PKGBUILD 内容提前停止,当你的决策依赖于已验证/已下载的源文件时,使用 `AURPostDownload`。
```
yay.create_autocmd("AURPreInstall", {
desc = "block forbidden sources",
callback = function(event)
if event.data.pkgbuild:match("forbidden.example") then
yay.abort(event.match .. ": forbidden source URL")
end
end,
})
```
`AURPostDownload` 接收与 `AURPreInstall` 相同的数据结构,但 `event = "AURPostDownload"`。
## 总结
yay v13 引入了 PKGBUILD 最后更新时间的可见性(在搜索和升级菜单中),以及基于 Lua 的钩子,允许你更改 yay 过滤和展示包的方式。
新的 Lua API 信息可在 https://jguer.github.io/yay/lua.html 获取。一个可直接复制的模板位于 yay 仓库文档中的 doc/init.lua (https://github.com/Jguer/yay/blob/next/doc/init.lua)。
其他钩子示例可在 yay 仓库 (https://github.com/Jguer/yay/tree/next/doc/examples) 中找到,例如基础安装日志记录、跳过近期修改的 AUR 包、检查维护者变更、以及从搜索中隐藏新提交的 AUR 包。
请将你的反馈和想法分享到 GitHub (https://github.com/Jguer/yay/issues) 上,关于 API 以及你想构建但目前无法实现的集成。
现在,走出去,去构建、构建、构建吧。
相似文章
AURpocalypse 降临:近期 AUR 攻击事件一览
Arch 用户软件仓库(AUR)持续遭受攻击,攻击者通过创建新账户来接管被遗弃的软件包并推送恶意更新。该项目已暂时禁用新用户注册,但长期安全解决方案仍不明确。
AUR中流传的恶意软件包
安全警报:恶意软件包正在Arch用户软件仓库(AUR)中传播,对Arch Linux用户构成风险。
Arch Linux 禁用 AUR 软件包接管
Arch Linux 已在发生一波恶意软件包接管事件、向用户推送远程访问木马后,禁用了对无维护的 AUR 软件包的接管。此前,该平台还曾暂停账户注册,并经历过一次攻击活动。
AUR软件包遭信息窃取器和Rootkit入侵
Arch用户仓库(AUR)软件包遭信息窃取器和Rootkit恶意软件入侵,对已安装受影响软件包的用户构成严重威胁。
数百个AUR软件包遭信息窃取恶意软件攻击
数百个Arch用户仓库(AUR)软件包被信息窃取恶意软件入侵。软件包维护者正在移除恶意提交并封禁相关账户。