← 所有文章

Codex淘汰untrusted核准政策:該改什麼

出自指南: Codex CLI Comprehensive Guide

Codex CLI v0.149.0(穩定版,2026年8月20日)透過PR #39630「Retire the untrusted approval policy」(淘汰untrusted核准政策)淘汰了untrusted核准政策。1 該PR將untrusted從「the CLI, configuration schema, and MCP tool interface」(CLI、設定schema與MCP工具介面)中移除,明確寫出的approval_policy = "untrusted"現在會失敗,並給出「an actionable error」(可據以採取行動的錯誤)。4 2026年8月25日在0.149.1上重現:不論這個值位於config.toml、profile檔案還是-c覆寫中,工作階段一啟動就會停在Error: approval_policy = "untrusted" is no longer supported; remove this setting,而codex執行檔在引數解析階段就拒絕-a untrusted5 把值改成on-request,沙箱模式保持不動;若要最謹慎的組合,請將--sandbox read-onlyon-request搭配使用。3 目前的政策集合是on-requestnever,以及granular(細粒度)表格形式。2 內容以v0.149.1(2026年8月24日,UTC)為準,也就是目前npm的latest1 {.answer-block}

TL;DR

  • 這次變更:v0.149.0的完整變更日誌列出PR #39630「Retire the untrusted approval policy」。版本說明除了這個標題之外沒有任何遷移說明;1 PR描述則有:untrusted已從CLI、設定schema與MCP工具介面中移除,明確寫出的設定「now fail with an actionable error」(現在會失敗並給出可據以採取行動的錯誤)。4
  • 誰必須動手:任何在~/.codex/config.toml或profile中寫有approval_policy = "untrusted"的人,以及任何在指令碼、別名或CI中傳入--ask-for-approval untrusted(或-a untrusted)的人。
  • 替代值:on-request,沙箱模式不變。read-onlyon-request就是文件中的「Safe read-only browsing」(安全的唯讀瀏覽)組合。2 舊的workspace-writeuntrusted組合沒有直接的後繼者;逐指令詢問現在由exec policy規則(執行政策規則)負責。48
  • 目前的集合:on-requestnever,或用於逐類別控制的approval_policy = { granular = { ... } }。沙箱模式仍是read-onlyworkspace-writedanger-full-access2
  • 快速失敗,而非靜默:殘留的approval_policy = "untrusted"會讓工作階段停在Error: approval_policy = "untrusted" is no longer supported; remove this setting,不論它位於config.toml、profile檔案還是-c覆寫中。codex doctor只回報設定無法載入,不會指出是哪個鍵。5

Codex 0.149改了什麼?

主要項目是幾個新介面,其中包括codex agents儀表板、codex queue,以及範圍更廣的codex doctor;核准政策的變更排在較後面,位於完整變更日誌中。1 PR #39630的描述補上了版本說明遺漏的細節。它的三點裡有兩點與本文相關:「Remove untrusted from the CLI, configuration schema, and MCP tool interface. Explicit approval_policy = "untrusted" settings now fail with an actionable error.」(從CLI、設定schema與MCP工具介面中移除untrusted。明確的approval_policy = "untrusted"設定現在會失敗並給出可據以採取行動的錯誤。)以及「Remove the known-safe command allowlist. Projects marked untrusted now request approval for every command unless an explicit exec policy rule allows it.」(移除已知安全指令的允許清單。標記為untrusted的專案現在會對每一道指令請求核准,除非有明確的exec policy規則允許。)4 同一版本中有一項錯誤修正對同一群讀者也很重要:「Resumed and forked threads now restore their active permission profile instead of silently falling back to current defaults.」(恢復與分支出來的對話串現在會還原其作用中的權限profile,而不是靜默退回目前的預設值。)1

版本項目 逐字來源文字 為何與本文相關
PR #39630 “Retire the untrusted approval policy” 您需要移除的值
對話串還原修正(PR #39153) “Resumed and forked threads now restore their active permission profile instead of silently falling back to current defaults.” 舊工作階段帶著舊政策;檢查恢復後的對話串回報了什麼
codex doctor擴充 “diagnoses endpoint protection, network/proxy failures, desktop app state, and update connectivity” 編輯設定後第一個該執行的工具,不過它不會指出已淘汰的鍵

每一列都引自v0.149.0版本說明。1

誰需要修改?

有四個地方會帶著這個值。先把它們全部找出來,因為在您修好主設定檔之後,profile或shell別名會再次套回舊政策。

位置 搜尋目標 通常的負責人
~/.codex/config.toml approval_policy = "untrusted" 個人開發者
Profile檔案(~/.codex/<name>.config.toml approval_policy = "untrusted" 任何擁有多組預設組合的人
config.toml中的舊式[profiles.<name>]表格 表格底下的approval_policy = "untrusted"。未加--profile時Codex會忽略該表格(除非您傳入--strict-config,它會拒絕無法辨識的欄位),而只要該表格存在,--profile就會拒絕啟動;請把這些鍵移到~/.codex/<name>.config.toml,並在那裡修正值5 在「每個profile一個檔案」的格式出現之前就設定好預設組合的人
指令碼、別名、Makefile、CI --ask-for-approval untrusted--ask-for-approval=untrusted-a untrusted-c approval_policy=untrusted 自動化與團隊工具

舊式表格的失敗很明顯。在0.149.1上,當config.toml中仍有[profiles.safe]表格時,codex exec --profile safe "hi"會停在Error loading config.toml: --profile `safe` cannot be used while .../config.toml contains legacy `profile = "safe"` or `[profiles.safe]` config; move those settings into .../safe.config.toml ...,因此同事的--profile safe在Codex讀到核准值之前就已經失敗。5

每一側各一道grep:

# Config and profiles: match the key, not the bare word
grep -rnE 'approval_policy\s*=\s*"untrusted"' ~/.codex/*.toml .codex/config.toml 2>/dev/null

# Scripts, aliases, CI
grep -rn --exclude-dir=node_modules \
  -e "ask-for-approval untrusted" -e "ask-for-approval=untrusted" \
  -e "-a untrusted" -e "approval_policy=untrusted" \
  ~/.zshrc ~/.bashrc . 2>/dev/null

# CI directories: read every bare hit, because YAML can split a flag from its value
grep -rn --exclude-dir=node_modules "untrusted" .github .gitlab-ci.yml .circleci 2>/dev/null

第一道grep比對的是鍵而不是單獨的字,這是有原因的。trust_level = "untrusted"是另一個設定;請保留它。設定參考將projects.<path>.trust_level定義為標記「a project or worktree as trusted or untrusted」(專案或工作樹是否受信任)的鍵,而不受信任的專案會「skip project-scoped .codex/ layers, including project-local config, hooks, and rules」(略過專案範圍的.codex/層,包括專案本機設定、hooks與rules)。7 PR #39630改變的是不受信任的專案如何處理指令,而不是這個鍵:「Projects marked untrusted now request approval for every command unless an explicit exec policy rule allows it.」4 盲目地對untrusted做尋找並取代,會弄壞這個鍵。

Profile檔案是文件記載的預設組合機制(~/.codex/<name>.config.toml,以codex --profile <name>選用),所以不論主設定檔怎麼寫,同事的profile都可能重新引入已淘汰的值。2

目前的核准政策集合是什麼?

Codex的安全性來自兩層:沙箱模式決定Codex在技術上能做什麼,核准政策決定Codex何時必須停下來詢問。2 這次淘汰只觸及第二層。

目前的值 備註
核准政策 on-requestnever{ granular = { ... } } on-requestAuto預設組合中的互動式預設值;never停用詢問;granular讓選定的類別維持互動,其餘自動拒絕2
沙箱模式 read-onlyworkspace-writedanger-full-access 除非設定[sandbox_workspace_write] network_access = true,否則workspace-write會關閉網路2
Auto預設組合 --sandbox workspace-write --ask-for-approval on-request 在工作區內讀取、編輯並執行指令;在工作區外編輯或使用網路前會先詢問2
安全的唯讀瀏覽 --sandbox read-only --ask-for-approval on-request 讀取檔案並回答問題;編輯、執行指令或使用網路前會先詢問2
非互動式(CI) --sandbox read-only --ask-for-approval never 只讀取,從不詢問2

granular形式涵蓋五種詢問類別:sandbox_approvalrules(execpolicy詢問)、mcp_elicitationsrequest_permissionsskill_approval2 沒有任何一種能重現untrusted,因為它是一條指令分類規則(自動執行已知安全的讀取,對任何可能變更狀態的操作詢問),而不是詢問類別的篩選器。2

workspace-writeuntrusted,也就是文件中「Automatically edit but ask for approval to run untrusted commands」(自動編輯,但執行不受信任的指令前請求核准)那一列,沒有直接的後繼者。2 workspace-writeon-request不再對沙箱內執行的指令詢問;read-onlyon-request則對編輯與指令都會詢問。2 PR #39630移除了「the known-safe command allowlist」(已知安全指令的允許清單),並點名了逐指令詢問僅存的機制:「Projects marked untrusted now request approval for every command unless an explicit exec policy rule allows it.」4 exec policy規則正是granular表格rules類別背後的同一套機制,也就是核准頁面所列的「execpolicy-rule prompts」。2 先前依賴untrusted來保護可寫入工作區的資安負責人,應該建立這些規則。rules文件將其範圍限定在沙箱之外執行的指令;decision = "prompt"prefix_rule會「before each matching invocation」(在每一次相符的呼叫之前)詢問:8

# ~/.codex/rules/default.rules
prefix_rule(pattern = ["git", "push"], decision = "prompt")

唯讀沙箱仍是最直截了當的替代方案,直接封鎖任何變更。3

確切要改哪些地方?

對應關係只有一行:untrusted改為on-request,沙箱模式維持原狀。3

之前(已淘汰) 之後 位置
approval_policy = "untrusted" approval_policy = "on-request" config.toml與每一個profile檔案
--ask-for-approval untrusted --ask-for-approval on-request 啟動codex TUI執行檔的指令碼與別名
-a untrusted -a on-request 簡寫旗標,僅限codex執行檔
-c approval_policy=untrusted -c approval_policy=on-request 行內覆寫;codex exec接受的形式
sandbox_mode = "read-only" + untrusted sandbox_mode = "read-only" + on-request 文件中的config.toml範例,標示為「Always ask for approval mode」2

主設定檔(profile檔案的修改完全相同):

# ~/.codex/config.toml (before)
approval_policy = "untrusted"
sandbox_mode    = "read-only"

# ~/.codex/config.toml (after)
approval_policy = "on-request"
sandbox_mode    = "read-only"

一段指令碼:

# before
codex --sandbox workspace-write --ask-for-approval untrusted "$@"

# after
codex --sandbox workspace-write --ask-for-approval on-request "$@"

-a/--ask-for-approval這對旗標屬於codex TUI執行檔。codex exec沒有這個旗標:在0.149.1上,codex exec --ask-for-approval untrusted "hi"會以error: unexpected argument '--ask-for-approval' found失敗。5codex exec,請在設定中指定政策,或以行內方式傳入:

# non-interactive run, policy set inline
codex exec --sandbox workspace-write -c approval_policy=never "$@"

接下來是兩個需要判斷的問題。第一,在沒有人能回應詢問的環境中,互動式的codex執行檔在on-request下會卡在第一次核准;文件記載的非互動式組合是--sandbox read-only --ask-for-approval never,而codex exec --sandbox workspace-write是文件記載的非互動式進入點。2 第二,如果您先前把untrusteddanger-full-access搭配,用來達成「完整權限,但每次都問」,這個特性在換值之後不會保留。文件中on-request詢問的兩個例子是離開沙箱與使用網路,而danger-full-access會移除這兩個觸發條件。2 granular表格其餘四個類別的詢問在完整權限下仍會觸發:decision = "prompt"的exec policy規則、MCP elicitation、skill核准,以及request_permissions詢問。28 選用的approvals_reviewer = "auto_review"設定會把符合條件的詢問交由審閱代理處理;它只適用於互動式政策,因此在遷移之後仍然可用。2

如何確認變更已生效?

  1. 執行codex doctor。若已淘汰的值仍在設定中,它的config那一行會以✗ config config could not be loaded開頭,細節行則寫著· failed to load Codex config;doctor不會指出是哪個鍵出問題。帶有名稱的錯誤來自啟動codexcodex exec。doctor那一行乾淨,表示該值已經不在;若失敗,您仍得啟動一次工作階段才能看到是哪個鍵。5 不論該值位於config.toml、以--profile選用的profile檔案,還是-c approval_policy=untrusted覆寫中,啟動錯誤都完全相同。5 旗標形式在更早的引數解析階段就失敗:codex -a untrusted --version會印出error: invalid value 'untrusted' for '--ask-for-approval <APPROVAL_POLICY>',後面接著[possible values: on-request, never]5
  2. 在暫用目錄中啟動一個用完即丟的工作階段並執行/status。它的Permissions那一行會顯示作用中的政策,on-request在那裡顯示為「Ask for approval」。5 /permissions開啟的是預設組合選單,而不是回報目前的模式,因此請改看/status5 /status也會列出工作區目錄。2
  3. 恢復一個較舊的對話串。PR #39153「Restore permission profiles when resuming threads」(恢復對話串時還原權限profile)現在會還原「the latest persisted approval policy, approvals reviewer, and active permission-profile ID when resuming or forking a thread」(恢復或分支對話串時,最後一次持久化的核准政策、核准審閱者與作用中的權限profile ID)。6 持久化政策為untrusted的已恢復對話串尚未測試;在您實際開啟一個之前,請把這種情況視為未知。

關於文件本身有一點要注意。官方的「Agent approvals & security」頁面,在2026年8月24日擷取並於8月25日重新核對時,其組合表格仍然顯示--ask-for-approval untrusted,仍然保留以「With --ask-for-approval untrusted, Codex runs only known-safe read operations automatically」(使用--ask-for-approval untrusted時,Codex只會自動執行已知安全的讀取操作)開頭的那段文字,而且其config.toml範例仍然使用approval_policy = "untrusted"2 設定參考的approval_policy條目在型別聯集中把untrusted列在第一位,其描述卻把另一個值標記為已淘汰:「on-failure is deprecated; use on-request for interactive runs or never for non-interactive runs.」(on-failure已棄用;互動式執行請用on-request,非互動式執行請用never。)7 PR與執行檔才是權威記錄;文件落後於它們。請不要把文件的範例區塊原樣複製到全新的0.149安裝中而不換掉那個值。

常見問題

在Codex中,什麼取代了approval_policy = "untrusted"

approval_policy = "on-request",現有的sandbox_mode保持不變。若要最謹慎的組合,請同時設定sandbox_mode = "read-only"3

哪個Codex版本淘汰了untrusted政策?

v0.149.0,於2026年8月20日成為穩定版,透過完整變更日誌中的PR #39630。v0.149.1(2026年8月24日,UTC)是目前npm的latest1

如果我把untrusted留在config.toml裡會怎樣?

Codex會拒絕啟動工作階段。在0.149.1上,codex exec會停在Error: approval_policy = "untrusted" is no longer supported; remove this setting,profile檔案與-c approval_policy=untrusted會出現同樣的錯誤,而codex doctor只會回報設定無法載入。5 PR #39630將這個行為描述為失敗並給出「an actionable error」。4

on-request比原本的untrusted更不安全嗎?

workspace-write之內,是的:untrusted會在任何可能變更狀態的指令之前詢問,而on-request執行沙箱內的指令時不會詢問。2 沙箱層能補回一部分餘裕:read-only不論政策為何都會封鎖寫入,而on-request在任何權限提升之前仍會詢問。3 若要在可寫入的工作區上逐指令詢問,請撰寫exec policy規則,也就是PR #39630點名的機制。48

我也需要更改沙箱模式嗎?

不需要。這次淘汰只影響核准政策;read-onlyworkspace-writedanger-full-access維持您原本的設定即可。3

重點整理

給個人開發者: - 在~/.codex/*.toml中grep approval_policy = "untrusted"(而不是單獨的字),把每一處改成on-request,並保留sandbox_mode與任何trust_level = "untrusted"不動。 - 執行codex doctor,接著在暫用工作階段中執行/status,再恢復一個舊對話串,看看0.149還原了什麼。

給維護共用profile與指令碼的團隊: - 在同一個commit中一併修正profile檔案、行內覆寫與config.toml;舊式的[profiles.<name>]表格會完全封鎖--profile,直到您把它移到~/.codex/<name>.config.toml為止。5 - 把無人值守的工作改成在codex執行檔上使用--sandbox read-only --ask-for-approval never,或改用codex exec --sandbox workspace-write -c approval_policy=never;互動式的codex執行檔在on-request下會卡在一個沒有人會回應的詢問上,而codex exec沒有--ask-for-approval旗標。5

給資安負責人: - untrusted分類規則(自動執行安全的讀取,變更時詢問)沒有granular的對應項;PR #39630為逐指令詢問指向exec policy規則(「unless an explicit exec policy rule allows it」),4 寫法是在~/.codex/rules/default.rules中放一條decision = "prompt"prefix_rule8 而唯讀沙箱則直接封鎖任何變更。 - 在審閱代理能代替人類處理符合條件的詢問之處,可以考慮approvals_reviewer = "auto_review"

參考資料


  1. OpenAI,Codex CLI v0.149.0版本說明,2026年8月20日發布(穩定版)。新功能逐字引用;PR #39630「Retire the untrusted approval policy」出現在該版本的完整變更日誌中;對話串還原的錯誤修正逐字引用。v0.149.1(2026年8月24日發布,UTC)是npm的latest。2026年8月24日核實。 

  2. OpenAI,“Agent approvals & security”。沙箱與核准兩層、Auto預設組合、常見組合表格(包括「Safe read-only browsing」與「Automatically edit but ask for approval to run untrusted commands」兩列)、--ask-for-approval never、granular的approval_policy表格及其「execpolicy-rule prompts」類別、approvals_reviewer、profile檔案、用於查看工作區目錄的/status,以及用於非互動式執行的codex exec。於2026年8月24日擷取並於2026年8月25日重新核對,該頁面的組合表格、以「With --ask-for-approval untrusted,」開頭的段落,以及config.toml範例中仍然顯示untrusted。 

  3. Blake Crosley,Codex CLI指南,指南v2.59(2026-08-25)。編輯性的遷移對應:approval_policy = "untrusted"改為approval_policy = "on-request",沙箱模式不變;read-onlyon-request在指南的沙箱模式表格中標示為「Maximum safety」。 

  4. OpenAI,PR #39630「Retire the untrusted approval policy」,2026年8月20日合併(UTC)。描述逐字引用:「Remove untrusted from the CLI, configuration schema, and MCP tool interface. Explicit approval_policy = "untrusted" settings now fail with an actionable error.」以及「Remove the known-safe command allowlist. Projects marked untrusted now request approval for every command unless an explicit exec policy rule allows it.」2026年8月25日核實。 

  5. 作者於2026年8月25日在Codex CLI 0.149.1上的重現(npx -y @openai/[email protected]搭配暫用的CODEX_HOME)。涵蓋-a untrusted的引數錯誤;值位於config.toml、位於--profile safe下的~/.codex/safe.config.toml,以及作為-c approval_policy=untrusted時,codex exec --skip-git-repo-checkapproval_policy = "untrusted"設定錯誤;該設定下的codex doctor輸出;codex exec --ask-for-approval的拒絕;--profile safe下的舊式[profiles.safe]錯誤;以及/status的Permissions標籤。 

  6. OpenAI,PR #39153「Restore permission profiles when resuming threads」,2026年8月18日合併(UTC)。描述逐字引用:「Restore the latest persisted approval policy, approvals reviewer, and active permission-profile ID when resuming or forking a thread.」2026年8月25日核實。 

  7. OpenAI,Codex設定參考,2026年8月25日以Markdown形式擷取。approval_policy條目的型別聯集為untrusted | on-request | never | { granular = { ... } }(granular的鍵已省略),其描述包含「on-failure is deprecated; use on-request for interactive runs or never for non-interactive runs.」;projects.<path>.trust_level條目定義了上文引用的受信任或不受信任專案標記。 

  8. OpenAI,Rules,2026年8月25日擷取。該頁面開頭寫道「Rules are experimental and may change.」decision欄位的三個值,逐字引用:「allow: Run the command outside the sandbox without prompting.」「prompt: Prompt before each matching invocation.」「forbidden: Block the request without prompting.」使用者層的檔案是~/.codex/rules/default.rules,也就是Codex「when you add a command to the allow list in the TUI」(當您在TUI中把指令加入允許清單時)寫入的路徑;該頁面自己的範例在gh pr view之前詢問。Codex「applies the most restrictive decision when more than one rule matches (forbidden > prompt > allow)」(當多條規則相符時套用最嚴格的決定)。 

相關文章

Install and Update Claude Code CLI: Mac, Linux, Windows

Every way to install, update, pin, and uninstall the Claude Code CLI -- native installer, Homebrew, winget, or npm -- on…

7 分鐘閱讀

Codex掛鉤讓代理框架真正成形

Codex掛鉤、Remote SSH與行動控制讓代理工作進入實務運作。證據、核准、Git保管、發布關口與品味,如今共同決定品質。

1 分鐘閱讀

從 Python 使用 Foundation Models:fm CLI

macOS 27 隨附 fm 命令列工具,以及供 Python 使用的 Foundation Models SDK,讓您能以指令稿驅動 Apple 的裝置端模型,並建立評估流程。

3 分鐘閱讀