Skip to content

fix(desktop): migrate GTK dependency chain to resolve glib advisory - #29

Merged
Hao0321 merged 1 commit into
Hao0321:mainfrom
YueyuHoshizora:fix/issue-19-linux-gtk-glib-migration
Sep 30, 2026
Merged

Hao0321 merged 1 commit into
Hao0321:mainfrom
YueyuHoshizora:fix/issue-19-linux-gtk-glib-migration

Conversation

@YueyuHoshizora

Copy link
Copy Markdown
Contributor

What changed

Refs #19

將桌面端完整 GTK Rust 相依鏈遷移至 GTK 0.19 / GLib 0.22,移除鎖檔中的受影響 GLib 0.18.5,並補上可從公開原始碼建置、實際操作 Linux 原生視窗的驗證路徑。這不是關閉 advisory、手改 lockfile,或將瀏覽器測試當成原生桌面驗證;也不代表正式安裝程式已可發佈。

問題與根因

RUSTSEC-2024-0429 指出 glib::VariantStrIter 迭代器的 unsoundness,受影響範圍為 >=0.15, <0.20,已修正範圍為 >=0.20。原始桌面鎖檔包含以下傳遞相依路徑:

Editkin → Tauri 2.11.5 → GTK 0.18.2 → GLib 0.18.5
             ├─ runtime/runtime-wry → Tao(原生視窗/事件迴圈)
             ├─ runtime-wry → Wry → WebKitGTK(嵌入式 WebView)
             └─ Muda(原生選單)

問題不在於專案是否直接呼叫 VariantStrIter:沒有直接呼叫不能證明傳遞相依中的 advisory 不可到達。Linux 原生視窗、事件迴圈、WebKit 和選單均共用這組 GTK-family Rust 相依,不能只換最底層的一個 crate。

為何採完整遷移,而不是較小的覆寫

  • GLib 0.18.5 不在已修正範圍;保留它並忽略 advisory 不構成修復。
  • 強制把 GLib 換成 0.20+,卻留下 GTK 0.18 的型別/版本約束,不是相容的升級。直接改 Cargo.lock 也不能取代 Cargo 的解析結果。
  • 本次採上游已進行的整套 GTK 0.19 遷移,讓 Tauri、Tao、Wry、WebKitGTK、Muda 及相關 sys crates 使用一致的 GTK/GLib 型別鏈。
  • 相容版本尚未全部以 registry release 提供,因此暫時使用完整 Git SHA 固定上游 PR 修訂。這是明確的供應鏈取捨,不把未發佈 PR 稱作正式 crates.io release;日後切回 registry 仍須重新檢查完整相依鏈、audit、原生編譯和 smoke。

實作範圍

元件/檔案 變更與目的
src-tauri/Cargo.toml 固定整套上游 GTK 遷移修訂,加入明確的 community-desktop feature;建置身份重用既有 SHA-256 相依,不以相容性 shim 保留舊 GTK 鏈。
src-tauri/Cargo.lock 由 Cargo 解析產生完整鎖檔;GTK-family 各保留一個版本,移除 GTK 0.18 / GLib 0.18 鏈。
src-tauri/build.rs 社群 feature 產生獨立、可追溯的 schema 1 原始碼建置身份;未啟用 feature 時保留正式 schema 2 manifest 檢查。
scripts/build-desktop.mjs --community 只打包原本的真實 resident Node service,避開與這次原生 smoke 無關的 owner-only 正式發行/色彩產品建置;預設正式路徑維持原有流程。
src-tauri/remote-relay.json 提供公開、無 endpoint/credential 的安全 LAN/BYO policy,滿足既有原生輸入要求;不授權私有服務。
scripts/linux-native-editor-smoke.mjs 透過 tauri-driver/WebKitWebDriver 操作真正 GTK/WebKit 視窗,驗證字幕修改、時間編輯、undo/redo、真實 autosave/recovery、IPC 和事件迴圈,保存截圖與機器證據並清理所擁有的程序。
.github/workflows/source-ci.yml 增加 Ubuntu 24.04 Linux 原生建置、GLib tree、audit 和 Xvfb/D-Bus smoke;保留唯讀權限、完整 SHA 固定 Actions 與無發行密鑰的 PR 邊界。
docs/BUILDING.md、docs/RELEASE.md、docs/SECURITY_MODEL.md 記錄系統需求、上游來源、已觀測證據與限制,明確區分社群原生驗證和正式成品發行。

新鎖定的 Linux 路徑為:

Editkin → Tauri 2.12.0 → GTK 0.19.0 → GLib 0.22.10
             ├─ runtime/runtime-wry 2.12.0 → Tao 0.37.0
             ├─ runtime-wry → Wry 0.57.0 → WebKitGTK Rust 2.0.2
             │                              ├─ JavaScriptCore Rust 2.0.0
             │                              └─ Soup Rust 0.9.0
             └─ Muda 0.20.0

這裡的 GTK Rust crate 0.19 仍使用系統 GTK 3,不是 GTK 4 遷移。Optional tray/libappindicator 相依也一起鎖定至相容鏈,但應用程式未啟用 tray,原生 smoke 也未驗證 tray 功能;不能把鎖檔中存在等同於實際使用。

上游 PR 與固定修訂

以下均由 Cargo.toml 的 [patch.crates-io] 固定,Tauri 家族包含 build/codegen/macros/runtime/runtime-wry/utils,WebKitGTK 與 libappindicator 包含對應 sys crate:

上游來源 固定 Git SHA
Tauri #16170 899ca2105ffd06293013b6d2bff4416987d99010
Tao #1332 08660027c723e09a45b10badf60a73a661c94a95
Wry #1843 327242ae73301c5e34dcc158e31ae453e8afe837
WebKitGTK #167,含 #166 遷移 f5c3825c3f21c44ce346a5aa42e8c33a762f9f72
Muda #403 e4b5c4cf58935cd7a387a6843f099e535bdf3c4a
tray-icon #369 79b656b7a61b6b551f90ed1b137bf17a920f6d0b
libappindicator #53 f2617d92288e2f0a2f998d3cd46c003e3a5c6d93

User journey and platform

為何需要社群建置路徑

原本 native build 要求 owner-only .release-input-manifest.json 與正式產品輸入;公開 checkout 無法因此完成這次 GTK 遷移的真實原生驗證。解法不是偽造 formal manifest,也不是把正式驗證改成 optional:

  • 只有編譯時明確啟用 community-desktop 才產生 schema 1 identity,scope 為 editkin.community-desktop-build/v1,且 officialRelease: false。
  • identity 對 package lock、真實 service bundle、Rust manifest/lock/build/config、原生與共用原始碼、capabilities、嵌入式 dist 等輸入逐檔計算 SHA-256;排序路徑鍵讓同一組輸入有確定的身份,使用固定大小 buffer 串流雜湊,避免把大檔一次載入記憶體。拒絕 symlink/非一般檔案,並以 Cargo rerun 指示追蹤輸入。
  • cfg!(feature = "community-desktop") 是編譯時邊界,不採信 ambient CARGO_FEATURE_COMMUNITY_DESKTOP 值。未啟用 feature 的建置仍要求 schema 2、formal scope、native-only product mode、research exclusion 和既有 pinned policy SHA。
  • 真實 Node service 透過既有 debug EDITKIN_NODE_PATH 路徑設定啟動;smoke 解析 PATH 上 Node 的 canonical executable,不放寬可執行檔驗證、不用 mock bridge、不加入應用程式測試後門。

因此附帶的 build 變更是「讓公開原始碼能驗證真實原生遷移」所必需,不是把正式產品 gate 繞開。

Validation

以下為已觀測結果;不將新加入的 CI job 視為已通過。

項目 實際結果
修復前 audit:cargo-audit 0.22.2 --deny unsound 原始鎖檔失敗:GLib 0.18.5 的 RUSTSEC-2024-0429,另有 6 個 unmaintained warnings。
修復後相同 audit 完整鎖檔 493 個相依通過,無 warnings。RustSec database f23b768236fe2880e4cfa167da662cad8ca79240,共 1,277 advisories。
Linux native 編譯及執行 Ubuntu 26.04 aarch64;Rust 1.98.1、Node 22.22.1、GTK 3.24.52、WebKitGTK 2.52.6、system GLib 2.88.0;真正 GTK/WebKit 程式在 Xvfb/D-Bus 下執行。
真實使用者輸入 在公開合成 demo 上,以 WebDriver 原生按鍵輸入 Linux native caption edit;字幕 duration 3 → 5,undo 回到 3,redo 回到 5。
保存/恢復與持續回應 正常 application autosave → native load_recovery IPC → 真實 Node recovery service 保存相同字幕 ID、文字、時間,原有 12 秒影片 clip/asset 維持原值;編輯後 IPC 正常且兩次 animation frame 時間前進。不是手動 save/reopen 驗證。
程序清理 以 Linux /proc PID/start-time、程序祖先和獨立 profile 判定所有權;包含與 driver 不同 process group 的 Node 子程序。完成後所擁有程序為零。
npm test 1,995 passed、4 skipped;263 個 test files passed、1 skipped。不是完整 Rust suite 或全部外部整合 suite。
npm run build 成功。
source scan/verifier self-test 掃描 1,280 個檔案為 GREEN;self-test 的 15 個 negative controls 通過。
正式 feature 邊界負向驗證 未啟用社群 feature 的建置因缺少 .release-input-manifest.json 以 101 失敗;即使設定 CARGO_FEATURE_COMMUNITY_DESKTOP=1 仍不能繞過。這是預期 fail-closed。

已 audit 的 Cargo.lock SHA-256:

c9846f69fb3c7d1fe5d5f751d1e8521b1f8e9d5ebd8c9b6c3f835c765216f9bf

實際 smoke 原生 binary SHA-256:

b4e713aea4d13e93e6dfba5c9b72ccc68ecba4b6eb026388e83e381950b3cd74

本機機器證據與前後截圖保留於忽略目錄 .rd/tmp/linux-native-editor-0wGr6t/,report.json 為 GREEN;這些是本機收據,不是已提交的公開附件或正式成品 attestation。audit 也是指定資料庫時間點的結果,不代表所有 runtime 安全性均已被證明。

CI 的預期平台與目前證據不可混用

新增 job 使用 Ubuntu 24.04 x86_64,執行 locked native build、反向 GLib tree、完整 lockfile audit、Xvfb/D-Bus 原生 editor smoke。系統最低需求為 GTK 3.24+、GLib/GIO 2.70+、WebKitGTK 4.1 API 2.40+、JavaScriptCoreGTK 4.1 API 2.38+、libsoup 3.0+;Ubuntu 24.04 的套件版本符合這些 manifest/system-deps 條件。

這個套件相容性檢查不等於已執行 Ubuntu 24.04/x86_64 CI。目前實際 native 證據僅限 Ubuntu 26.04/aarch64。可重現命令與兩個 Ubuntu 版本的 WebDriver 套件命名差異記錄在 docs/BUILDING.md。

已觀測限制與未驗證範圍

最後的原生截圖確認 timeline 顯示修改後字幕,inspector duration 為 5;但 preview 被 native ffprobe 錯誤卡遮住,錯誤為找不到相對路徑 editkin-demo-preview.mp4。公開 fixture 確實存在於 public/build,然而該相對 URI 沒有經 native media 路徑成功解析。因此不能宣稱字幕已在預覽畫面渲染或影片已能播放。另觀測到 CJK 字形顯示 tofu,缺少的 private Creator Pack 仍不可用/loading。

本次不宣稱已驗證:完整 media preview/rendering/playback、import、codecs/GPU 像素一致性、export、native dialogs、手動 save/reopen、Windows/macOS/Wayland、installer/signature、private speech models、private creative assets,或 exact delivered official artifact。沒有完整 Rust test suite/尚未執行的 x86_64 CI 通過宣稱。

Security and provenance

  • 相依來源: 重用既有 build-time sha2,並遷移上述 Rust 桌面相依鏈;上游來源與完整 SHA 已列於表格。不是新增任意來源二進位套件,也不是宣稱上游 PR 已完成正式 release。
  • 網路: 建置會向既有 npm registry、crates.io、固定 GitHub upstream 取得相依;CI 安裝系統套件與 Rust 驗證工具,audit 取得 RustSec database。smoke 使用 loopback WebDriver HTTP;沒有新增外部產品服務 endpoint 或私有服務授權。
  • 程序與寫入: CI/smoke 執行 Rust/Node 建置工具、tauri-driver、WebKitWebDriver、原生 Editkin 與真實 Node resident service;產生 dist、desktop-dist/service.mjs、Cargo build output/identity,並在忽略的 .rd/tmp 獨立 HOME/XDG profile 寫入 recovery、JSON、logs 和截圖。清理僅針對辨識出的所擁有程序,不以任意使用者程序為目標。
  • 權限: CI apt 安裝使用 runner 的 sudo;PR job repository permission 保持 contents: read,checkout 不保留 credentials,無 signing/publication secrets。未放寬 runtime executable validation、formal release identity 或 Windows Authenticode。
  • 素材與授權: 無新增 media、fonts、models 或第三方 runtime binaries;使用已公開的合成 demo fixture,因此沒有新增素材需要附 redistribution license。既有素材來源與授權仍見 docs/FIXTURES.md、docs/BUILDING.md 及對應 license 檔。
  • 私密資料: 此變更不包含 secrets、credentials、private footage、owner creative packs 或 private model weights。

正式發行邊界

此次發佈的是 Git 分支與供審查的 PR,不是正式 binary release。社群 schema 1 身份不能滿足正式 schema 2 產品身份。正式 binary publication 仍被 gate 阻擋:須對精確交付成品完成各平台 install/edit/preview/save-reopen/export、第三方授權與對應原始碼、SBOM、最終 hashes、簽署 metadata 和 provenance;Windows packaged updater 的 Authenticode 要求不變。

PR 可以在完成審查與 CI 後合併,但不能以此次 audit、web build 或有限 native smoke 取代 docs/RELEASE.md 的正式發行條件。

DCO

此 PR 的單一提交 6010f2b76dbb1c49f77d5fdfddafed5f61744c86 已確認包含 Signed-off-by: trailer:

Signed-off-by: Yueyu Hoshizora <yueyuhoshizora@gmail.com>

Pin the complete Tauri/GTK migration to immutable upstream revisions, add an explicitly non-official community build identity and safe relay policy, and exercise the native Linux editor with a reproducible WebDriver smoke and CI job.

Document measured native verification, dependency provenance, and the remaining exact-artifact official release gate.

Refs Hao0321#19

Signed-off-by: Yueyu Hoshizora <yueyuhoshizora@gmail.com>
Comment thread scripts/linux-native-editor-smoke.mjs
Comment thread scripts/linux-native-editor-smoke.mjs
@Hao0321
Hao0321 merged commit 2cca2d6 into Hao0321:main Sep 30, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants