iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
AI Security

一個 Agent 我查不動,一個我改得動:內部威脅偵測的 30 天系列 第 3

OpenTelemetry 有 Agent 的欄位,但你查案要的那幾欄預設不記

  • 分享至 

  • xImage
  •  

嗨,大家好。

先講一個不用寫程式也能懂的情境。

班上有人改了你交出去的作業,你想查是誰動的。保全說:「有,下午兩點有人開過你的櫃子。」

你追問:「誰?拿了什麼?改哪幾行?」

保全:「系統只記『開櫃』,不記名字跟內容。這是規定,怕侵犯隱私。」

你會覺得這套紀錄有跟沒有一樣

昨天我碰到的就是這種事——只是換成 AI 改檔案。


昨天發生什麼(兩句話版)

我設陷阱,叫 AI「讓測試全綠」。它沒作弊——一次老實修了程式,一次加壓力後乾脆拒絕,還識破我在做實驗。

後來我反過來,叫它重演三種已知的假綠手法,測規則能不能抓:改期望值、跳過測試,有抓到;用 conftest.py 替身,沒抓到,git diff 仍是空的。

規則本身還曾寫錯一個字(content 寫成 contents),「跳過測試」那條一度永遠不響——跟 Day 1 監視器壞了也不亮紅燈一樣。

我想:我自己寫的規則不可靠,業界標準應該比較靠得住吧?

於是我去查一套叫 OpenTelemetry 的東西。白話說:很多公司約好「AI 做事時,紀錄要長什麼樣子」,大家照同一本格式寫,工具才讀得懂。


我實際跑了一次,紀錄長這樣

9 月初我用一支小程式,真的叫 AI 回答「請問如何學英文」,把系統留下的紀錄存成一份 JSON(檔名 otel-groq-trace-export.json)。下面是我從裡面摘的重點,不是抄教科書。

可以想成一張外層便條 + 一張內層便條,貼在同一本日誌上:

外層便條(這一趟 Agent 在幹嘛)

這是 AI Agent 在跑
名字叫 groq-demo
這是第幾次對話:conv_groq_exp03

就這樣。沒有「它想了什麼」。

內層便條(這一步叫模型回答)

用 Groq 的 API
模型叫 qwen/qwen3.8-27b
花了幾秒、用了幾個 token
我問:請問如何學英文
它回:一千多字的長文(完整內容在檔案裡)

負責看系統健康的同事會說:很好啊,誰在跑、花多少錢、花多久,都有了。

但我要查案,還想問:它當初為什麼這樣回答?讀了什麼?

這裡有一個陷阱:我跑的是「完整模式」。

同一支程式還有「精簡模式」——對話內容不會寫進去。程式會自己提醒你:這些欄位預設是關的,要自己開才會記。

所以文章裡你能看到完整問答,是因為我手動開了,不是大家預設就會拿到。


更誇張的是:改檔案時,標準可以記更少

我繼續讀規範裡「AI 使用工具」那一段,發現規定比我想的還寬。

AI 用「寫檔」這個工具時,一份完全符合規範的紀錄,最少只要寫:

① 這次是「使用工具」
② 工具名叫 Write

結束。

不會寫改了哪個檔、寫了什麼字。參數、結果、工具清單,全部標成「選用」——白話就是預設不記,怕記到密碼和私人內容。

對話也是:

  • 你問了什麼 → 預設不記
  • AI 回了什麼 → 預設不記
  • 系統給它的指示 → 預設不記

理由很簡單:記太多 = 外洩風險 + 檔案爆炸。這我懂。

但查案要的「它憑什麼這樣做」,答案就在這幾項裡。

沒有它們,你手上只有「下午兩點 AI 用了 Write」,沒有「因為它讀到 README 寫說測試已過時」。前者像保全說的「有人開櫃」,後者才是「誰拿了什麼」。

Day 2 的 conftest.py 就是例子:紀錄裡可能都寫「Write」,一個是改測試作弊,一個是正常寫程式——光看工具名分不出來


我想問的十件事,標準能答幾題?

以下對照的是 OTel GenAI 規範的預設合規實作——欄位有定義,但很多標成「選用」,預設不記。個別產品若自己把選用欄位打開,紀錄會比這張表多。

我想問 能答嗎?
幾點幾分
哪一次對話
哪個 AI 在跑 大致能(但不太建議記「這一次執行」的細編號)
用了什麼工具(例如 Write)
改了哪個檔、寫了什麼 預設不能
改完結果怎樣 預設不能
它讀了什麼、依據哪句話 預設不能
是你叫它做的,還是它自己決定的 規範裡沒有
改動前後差在哪 規範裡沒有
那是作業檔還是測試檔 規範裡沒有

標準不是「還不成熟所以漏了」,是刻意把最敏感、最有用的那幾項留成「要你自己決定要不要開」。

整份規範目前還在修(2026 年 9 月我讀的那版還在變)。


標準不夠,我只好自己補

我不能讓 Cursor 的監視器跟測試用 AI 各寫各的格式,否則規則要重寫。所以我約定:全部寫進同一份日誌檔(jsonl),分三層——

  1. 跟標準一樣的 — 時間、工具名、對話編號
  2. 標準有但預設關的,我自己開 — 改了哪個檔、差異摘要、問題的 hash(不存全文)
  3. 標準根本沒有的,我自己加 — 這是測試檔還是正式檔、誰觸發的、它說做了什麼 vs 實際做了什麼

還有一條今天就要記住:

「零次」和「我不知道」不能寫成一樣。

「工具用了 0 次」可能是真的沒用,也可能是監視器壞了所以不知道。意思相反,數字卻一樣。Day 1 我 hook 收到零筆,就是「不知道」,不是「真的零次」。


記太多也會出事(所以標準才預設關)

9/14 我為了修監視器,在一個乾淨資料夾跑了一下午。日誌長到 246 KB——裡面有公司 email、十二個檔案的完整內容、每一句問答。

那個資料夾甚至不是 git 專案,也沒有 .gitignore

監視日誌自己變成新的外洩點。

所以標準預設不記內容,不是偷懶。記太少查不了案,記太多也可能漏密碼——兩邊都要選。

我目前的折衷:問題只存 hash、改動太大就截斷。這是取捨,不是完美解法。

(開源的 Pi Agent 還有一條「在送進模型前攔下來自己記」的路,我還沒在本機試過,之後有結果再寫。)


今天的 5 分鐘小練習

打開你在用的 AI 工具(例如 Cursor)設定,搜 tracelogging,找「要不要記對話內容」。

兩個問題:

  1. 預設是開還是關?
  2. 如果開了,檔案在哪、誰能看、會不會被別人複製走?

明天要問更刁的:AI「寫檔」這個動作,刪的是測試還是垃圾檔?在紀錄裡可能長得一模一樣。


今天對應的威脅: T3(事後查不出它當初在想什麼,規避才成立)。

引用來源: OpenTelemetry Semantic Conventions for Generative AI(Development,規範仍在修)。實驗:Groq API;上文問答來自完整模式匯出,精簡模式不會記對話內容。


上一篇
我設陷阱要 AI 作弊,它沒上鉤。倒是我的警報器,從頭到尾沒響過
下一篇
它刪的是測試還是垃圾檔?同一個 write_file,log 裡長得一模一樣
系列文
一個 Agent 我查不動,一個我改得動:內部威脅偵測的 30 天9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言