部落格 發布於 AIA: 2026年7月6日

LangGraph 狀態檢查點漏洞:攻擊者竄改的記憶資料可直接觸發遠端程式碼執行

Check Point Research 展示 LangGraph(LangChain 生態中用來編排有狀態 agent 工作流程的框架)的狀態檢查點儲存層,如何從使用者可控的狀態歷史查詢,被攻擊者一步步操控成遠端程式碼執行。攻擊者可以先利用 SQL 注入攻擊(SQL injection)或 Redis 命令注入影響 checkpoint 儲存內容,再讓應用程式把惡意 checkpoint 當成可信的 agent 記憶資料載入。載入的過程需要反序列化(deserialization,把儲存的位元組資料還原成程式可以操作的物件,例如把 checkpoint 裡存的 msgpack 位元組,還原成 LangGraph 用來記錄對話進度的 graph state 物件);如果這個還原過程沒有先驗證資料型別、完整性與來源,攻擊者精心構造的位元組資料就可能讓還原過程建構出會執行任意程式碼的物件,而不只是還原出單純的資料。防禦重點是把 agent 記憶資料當成安全邊界,不是被動儲存。

SQL InjectionRemote Code ExecutionInput ValidationRuntime IsolationAgentic AI
9 項對應的 AIDEFEND 防禦手法
來源: From SQLi to RCE: Exploiting LangGraph's Checkpointer 
作者: Yarden Porat
原文發布: 2026年6月11日

威脅分析

  • 攻擊從狀態歷史查詢條件開始。 應用程式如果把 get_state_history() 的 filter、thread ID 或其他篩選欄位交給使用者、agent 或外部 API 控制,攻擊者就可能影響儲存層如何組合 SQL 或 Redis 查詢。
  • SQL 注入攻擊可以讓查詢回傳攻擊者準備的 checkpoint。 在 SQLite 路徑中,攻擊者不是只想讀資料,而是要讓應用程式取得一筆看似正常、實際上包含惡意內容的 checkpoint 資料列。下一步載入狀態時,這筆資料就可能被當成可信的 agent 記憶。
  • Redis 命令注入提供另一條竄改狀態資料的路徑。 使用 Redis checkpointer 時,如果命令或 key 組合沒有正確隔離使用者輸入,攻擊者可能寫入、覆蓋或污染已儲存的 checkpoint,讓後續 agent 工作流程讀到被竄改的狀態。
  • 危險點在於 checkpoint 會重新回到 agent 執行流程。 檢查點不是單純存檔;它會被反序列化、還原成 graph state,再交回 agent 或工作流程使用。只要這個信任提升過程沒有驗證簽章、雜湊、型別與來源,攻擊者控制的資料就可能被升級成可信狀態。
  • 不安全的 msgpack 反序列化,會讓「還原資料」變成「執行程式碼」。 msgpack 反序列化(把儲存的位元組資料還原成 Python 物件的過程)如果直接依照資料裡標示的型別去建構物件,卻不檢查這個型別是否在允許清單內,攻擊者就能在惡意 checkpoint 裡標記一個「建構時會執行任意指令」的物件類型;載入器以為自己只是在還原一筆普通資料,實際上卻執行了攻擊者指定的程式碼。這個道理很像 Word 文件裡的巨集(macro,文件中可以自動執行的小程式):文件表面上看起來只是資料,但只要裡面藏了巨集,一打開文件就可能自動執行程式;msgpack 反序列化如果允許還原出「會自動執行建構邏輯」的物件類型,效果就跟打開一份帶有惡意巨集的文件一樣,看似只是在「讀取資料」,實際上卻執行了程式碼。影響範圍取決於 LangGraph 伺服器的權限,可能包含檔案、環境變數、資料庫連線、Redis、secrets 和下游服務。
  • 防守要同時保護輸入、儲存資料和執行環境。 升級 LangGraph 只能關閉已知漏洞;長期還要驗證查詢條件、替 checkpoint 加簽、在反序列化前檢查完整性,把 agent 伺服器放進最小權限容器,並用公開 exploit 路徑做回歸測試。

適用的 9 項 AIDEFEND 防禦手法

AID-H-002.002
Inference-Time Prompt & Input Validation
極高
輸入驗證應放在狀態歷史查詢進入 checkpointer 前,檢查 filter、thread ID、namespace、key 和排序條件的結構、型別、長度與允許值,避免攻擊者把 SQL 或 Redis 命令片段塞進儲存層查詢。
AID-I-004.003
Cryptographic Memory Integrity (Signed Write/Verify Read)
極高
checkpoint 記錄回到 agent 或進行反序列化前,應先驗證簽章、雜湊值和來源,確認這筆記憶資料確實由可信流程寫入,沒有被 SQL 注入攻擊、Redis 命令注入或外部程序竄改。
AID-H-003.010
Deployed AI Software Vulnerability Remediation Lifecycle
極高
盤點實際部署的 LangGraph 與 checkpointer 套件版本,和 SQLi、反序列化漏洞公告逐一核對,重建修正版並分階段推出,最後驗證弱點套件已從整個部署群移除。這項控制負責交付修補;exploit replay 則是另一個獨立的 closure check。
AID-E-004
Incident Exploit-Path Closure Verification
極高
修正版 LangGraph/checkpointer 與狀態控制部署完成後,針對事件範圍內的系統獨立重播 SQLi、Redis filter 與 unsafe deserialization 變體,證明每一條原始路徑都已失敗。這項控制只驗證 closure,不負責升級軟體。
AID-I-004.004
Transactional Promotion Gates (Quarantine -> Trusted)
交易式信任提升檢查應卡在 checkpoint 從儲存資料升級成 agent 記憶資料的那一刻:未經驗證、來源不明或受外部影響的狀態資料,不能直接進入可信 graph state,也不能被重新交給 agent 使用。
AID-I-001.001
Container-Based Isolation
如果反序列化漏洞已在 LangGraph 伺服器內執行程式碼,容器隔離可以限制攻擊者能讀到的檔案、環境變數、網路目標和憑證,避免 RCE 直接擴大成整個應用或雲端環境接管。
AID-I-002.001
Internal AI Network Segmentation
內網分段會限制被 RCE 攻破的 agent 伺服器能連到哪些 Redis、資料庫、secrets 服務和下游 API,讓攻擊者即使拿到程式碼執行,也不能任意橫向移動。
AID-R-004
Fleet Remediation Propagation & Technical Recurrence Prevention
事件後應把 checkpoint 視為正式安全邊界來更新威脅模型,補上狀態完整性要求、反序列化測試、查詢輸入測試,並把同樣要求套用到所有 agent 記憶、重放和狀態持久化路徑。
AID-H-025.001
Pre-Execution Static Analysis & Dangerous Construct Blocking
執行前靜態掃描與相依套件掃描,可在部署前找出受影響的 LangGraph 版本、不安全 msgpack 反序列化用法,以及把使用者輸入直接交給狀態查詢的程式寫法。

身為資安防禦者,我們應該這麼做

  • 升級 LangGraph,並確認 SQLite 或 Redis 狀態檢查點元件是否把 get_state_history() 的查詢條件暴露給使用者、agent 或外部 API 呼叫者。
  • 用嚴格的結構定義、識別碼允許清單和參數化儲存層介面驗證狀態查詢條件;不要把外部輸入直接拼進 SQL、Redis 命令或 key pattern。
  • 替 checkpoint 和持久化記憶資料加簽;反序列化、重放或重新交給 agent 使用前,必須先驗證完整性、來源、資料型別和 schema。
  • 讓 agent 伺服器在最小權限的容器或沙箱中執行,限制檔案系統、網路、Redis、資料庫和 secrets 存取。
  • 修補後在隔離的測試環境複本中,重現公開的 SQL 注入、假 checkpoint、msgpack 反序列化和 Redis 命令注入測試案例,確認防線會在正確步驟擋下。

結論

LangGraph 案例提醒我們,agent 記憶不是被動儲存。checkpoint 會被查詢、寫入、反序列化、重放,最後重新回到 agent 執行流程;任何一段把不可信資料升級成可信狀態,都可能變成 RCE 路徑。AIDEFEND  在這裡的角色是把每個升級點拆開防守:輸入驗證守住查詢條件,簽章與雜湊守住記憶資料完整性,信任提升檢查決定資料能不能回到 agent,容器隔離與內網分段則限制最壞情況下的影響範圍。