概述
涵蓋 v0.9.70 ~ v0.9.73(2026-09-27 ~ 09-30,四天四個 patch)。主軸有三:
- 安全修復 ×3(全在 v0.9.70)——Fortran 檔案讀取、shell injection 收尾、Terraform secret 涵蓋擴大
- enum 成員擷取擴及四個語言(v0.9.73)
- 各語言解析正確性的持續累積
三個安全修復(v0.9.70)
1. Fortran cpp 的任意檔案讀取(GHSA-pcc4-rvhr-2pr8)
攻擊面:Graphify 預處理大寫 F 的 Fortran 檔(.F / .F90)時會跑 cpp。舊版雖用了 -nostdinc -I /dev/null,但這擋不住絕對路徑 include:
#include "/etc/passwd"
cpp 照樣解析並把檔案內容內聯進來——最終出現在 graph.json、報告與 LLM context(CWE-22/73/200)。
修復:預處理前剝除每一個 #include 指令,原始碼改由 stdin 餵給 cpp,宏展開保留。
2. Aider/Devin monolith --watch 的 shell injection 收尾
/graphify add … --watch 片段曾把 agent 代入的 INPUT_PATH 佔位符未加引號放進 shell 指令——scan root 含 $(…)、反引號或 ; 就會被執行。v0.9.68 修了 watch 片段;v0.9.70 收掉最後一個實例(Aider/Devin monolith --watch):watcher 改讀 Step 1 寫入的受信任 graphify-out/.graphify_root,路徑完全沒有被代入的機會。
3. Terraform secret redaction 擴大
秘密偵測過去看「key 名稱」,但這種寫法漏掉:
environment = [{ name = "DB_PASSWORD", value = "…" }]
敏感訊號在相鄰的 name 字面值而不是 key。現在 name/value pair 清單(含 ECS valueFrom)中,secret 命名 name 配對的 value 也會 redact。
Fortran 修復為什麼選擇「剝除 #include」而不是「檢查 include 路徑是否安全」?
💡 想先看個提示?
兩種修法都「能擋住 /etc/passwd」,但哪一種在面對未知的繞過手法時仍然安全?
../../../ 穿越、各種編碼),而「預處理階段根本不處理 include、宏展開另行保留」直接讓攻擊面消失。宏展開仍保留,但 include 不再被內聯;這是此安全修復的行為取捨。enum 成員擷取擴張(v0.9.73)
enum 成員擷取在本版擴及以下四個語言,成員成為節點,透過 case_of 邊與 enum 相連:
| 語言 | 擷取內容 |
|---|---|
| Rust | enum variants |
| Zig | enum members |
| C++ | enum / enum class enumerators(含巢狀 enum) |
| Scala 3 | enum cases 與其方法 |
這四個 patch 的其他語言結構新增:SQL CREATE TRIGGER(連到 ON 的表,含 OR REPLACE / INSTEAD OF / BEGIN…END 主體)與 Groovy enum(v0.9.71)、Blade @extends layout 連結(v0.9.72)、Solidity file-level free functions(v0.9.73)。
JSX 元件圖(v0.9.70):<MyButton/> 與 <_Row/> 產生 calls 邊連到元件;小寫 DOM 標籤與 <Nav.Item> 成員標籤保守跳過——React 元件圖現在捕捉 render 關係。
解析正確性精選
- Java:呼叫繼承方法與
super.method()解析到宣告祖先(走inherits鏈,最近者勝);未知或外部祖先 fail closed(v0.9.73) - VB.NET:
MyModule.DoThing()型別/模組限定呼叫解析到目標方法;value-receiver 與MyBase.fail closed(v0.9.73) - R:
R6::R6Class、methods::setRefClass建立的類別被辨識;self$method()/private$method()解析到同類方法(v0.9.71) - C#:具名 tuple
(int Count, string Name)的元素名不再誤記為型別引用(v0.9.70) - Kotlin:
@Volatile var x = 0(註記 + 推斷型別)不再 crash 丟整檔(v0.9.72) - Astro:只有 frontmatter 與
<script>餵給 AST,HTML template 不再產生 parse error,行號保留(v0.9.73) - PostgreSQL:
DO $$ ... $$區塊之前的 SQL DDL 也被萃取(v0.9.72)
Watch、輸出與安裝
- Windows watch 序列化(v0.9.70):
msvcrt位元組範圍鎖取代 no-op 鎖,WinError 32 並行重建競態關閉(POSIXfcntl不變) graph.htmlNode Info 面板(v0.9.72):顯示真實 Type / Source / Community,不再 “unknown”;聚合社群節點顯示成員數docxsidecar(v0.9.72):表格保留在文件原位;讀取所有文字含追蹤插入、content control、text box- Skills 自動刷新(v0.9.72):套件升級後自動更新過時的已安裝 skills;本地編輯備份為
SKILL.md.bak;不碰 marker-bounded 的CLAUDE.md/AGENTS.md/GEMINI.md;GRAPHIFY_NO_AUTO_REFRESH=1可停用 - Hook 版本檢查(v0.9.73):
graphify hook status將舊版寫的 hooks 回報為過時 - 效能(v0.9.73):Neo4j/FalkorDB
--push在 upsert 迴圈前建 per-label id index,修大圖吞吐崩塌
隨堂總結測驗
你的團隊用 v0.9.69 維護一個含 Fortran 與 Terraform 的混合 repo。升級到 v0.9.73 後,哪些既有圖需要重新建立才會受益?
💡 想先看個提示?
安全修復能擋住未來的洩漏,但已經寫進圖裡的東西呢?
graph.json 裡——安全事件後重建圖譜也是必要步驟。動手升級檢查清單
升級 v0.9.73:動手檢查清單
逐項勾選,確認你已完成升級必要的步驟(進度會保存在此瀏覽器)
延伸閱讀
-
前一課:
v0966-to-v0969-extractors-and-reliability——v0.9.66~69 的五個新語言與決定性 -
本主題 Changelog:完整的 v0.9.70~73 條目