你上次裝新技能的時候,是把它的指令文件從頭讀了一遍,還是隻看了市場頁面上的介紹就直接裝了?我的做法一直是前面那一種。不管這個技能的介紹寫得多簡單,我都要先把指令文件打開讀完,然後才決定要不要繼續往下走。
我這麼做,是因爲技能裝上以後並不是待在一個跟我無關的地方運行。它接下來會按照指令文件裏的內容去讀我機器上的文件,並且還會調用我平常就在用的那些工具,所以一個陌生人寫進指令文件裏的要求,最後是用我的權限在我的環境裏執行。正是因爲這樣,我纔不肯只看介紹頁和下載量就把一個技能裝進來。
我真正擔心的場面是這樣的:我爲了省下讀文件的幾分鐘,把一個會收集環境變量(也就是機器上存着 API 密鑰這類登錄憑據的系統變量)的技能裝進每天都在用的工作環境裏,然後它趁我不在屏幕前把 API 密鑰發了出去。等我察覺的時候,往往已經是某個賬號出現異常調用了,而它到底讀過哪些文件又發出去多少,我事後很難查全。
我做全棧開發已經 24 年多了,過去曾經帶過一個 400 人的技術團隊,現在仍然是幾個大型開源項目的核心維護者。看了這麼多年別人寫的代碼,我對寫得含糊的指令反而更警惕。技能裝上以後,照着指令文件做事的是 agent,用的又是裝技能那個人的權限。正因爲這樣,指令一旦寫得含糊,agent 到底會按哪種理解去執行,就沒有人能提前替我確定。真按錯的理解執行了,後果還是要由裝它的人來承擔。
指令文件讀完以後,我會把這個技能帶的可執行腳本單獨打開,一個一個看過去。因爲指令文件主要是在告訴 agent 應該做哪些事,而可執行腳本是真的會在我的機器上運行的代碼,所以這兩樣東西的風險並不一樣。只要某個腳本里有一段代碼我看不明白它爲什麼要存在,我就會停在那裏先把這一段弄清楚,而不是先裝上再等出問題以後回頭找原因。
我把這套順序看得這麼緊,也跟一項大規模研究的結果有關。這項研究在 2025 年十二月先從 skills.rest 和 skillsmp.com 這兩個市場爬取了 42,447 個技能,然後研究者對這批技能做了去重,又過濾掉了一批質量不夠的,最後留下 31,132 個唯一的技能。後面我提到的每一個比率,分母用的都是這 31,132 個技能。
從 42,447 個減到 31,132 個,中間一共去掉了 11,315 個。但是這 11,315 個裏面,只有一步有精確數字。這一步過濾掉的,是那些已經被刪除、打開時只會返回 404 的倉庫,這一類倉庫一共被這一步移走了 7,353 個。至於剩下的大約 3,962 個分別是在哪一步被去掉的,論文沒有逐項給出數字,所以我引用這項研究的時候,也不會替它把剩下的部分拆出一個看起來很細的說法。
做這項研究的工具叫 SkillScan,它是一個研究框架。它先做靜態掃描,也就是隻讀技能的文件和代碼,並不運行被掃的這個技能,從讀到的內容裏找出問題模式,然後再用 LLM-Guard 做一層標記。LLM-Guard 是一套給大模型內容做安全掃描的現成工具。
被靜態掃描和 LLM-Guard 這兩步標記出來的技能,就是候選技能,隨後會交給一個大模型做分類確認,只有分類確認下來的才計入統計。大模型做分類確認時,用的是 SkillScan 的分類法,一共 14 種模式,歸在 4 個類別下面。SkillScan 是研究用的框架,SkillSpector 是 NVIDIA 後來發佈的產品,兩者不是同一個東西。
SkillScan 最後確認的結果是,在 31,132 個技能裏有 8,126 個至少命中了 14 種模式裏的任意一種,佔 26.1%。不過這個口徑放得很寬,因爲故意寫的惡意代碼被計入了,作者疏忽寫出的不安全代碼也被計入了。另外還有一些寫法,它們本身沒有傷人的意圖,但是模式很危險,這類寫法同樣被計入了。在這幾類裏面,數量佔多數的是作者疏忽寫出不安全代碼的那一類。
還有一個經常和 26.1% 一起被引用的數字是 5.2%,它對應 1,619 個技能。但是這個數字不能理解成研究者逐個判定了這 1,619 個技能的作者懷有惡意。研究者在分析開始之前就先按模式定死了嚴重程度,其中 14 種模式裏面有 8 種被預先定爲高等級。一個技能最後的等級,取的是它命中的模式裏最高的那一級。所以 5.2% 說的只是這 1,619 個技能含有至少一個高等級模式。
論文自己也對這個數字作了提醒。研究者把風險最高的 87 個技能拿出來人工複查了一遍,結果只有 23 個能看出明確的惡意跡象。剩下的那些技能同樣危險,但是光看它們的內容,分不清作者到底是故意這樣寫的,還是寫的時候疏忽了。正是因爲人工複查分不清剩下的技能是作者故意寫的,還是寫的時候疏忽了,所以我在引用 5.2% 的時候,只會把它說成一個按模式推算出來的代理指標,而不會把它說成已經證實了意圖的比例。
還有一個數字直接關係到我爲什麼要把可執行腳本單獨拿出來看。研究發現,帶可執行腳本的技能出現漏洞的可能性,是不帶腳本的純指令型技能的 2.12 倍。我對這個差距的理解是這樣的。指令寫得再有問題,它也要先經過 agent 的理解,然後纔會變成動作。腳本不一樣,它只要一運行,讀哪些內容和往哪裏發送就都由代碼直接決定,中間沒有人能再替我攔一道。
NVIDIA 的 SkillSpector 在倉庫的說明文件 README 裏放了一份示例報告,這份報告能說明腳本這一關爲什麼不能省。報告裏的技能叫 suspicious-skill,它帶了一個放在 scripts/sync.py 的腳本。這份示例報告給這個技能打了 78 分,等級是 HIGH,給出的結論就是不要裝。這份報告是 README 裏放出來的示例,不是我自己遇到的真實技能。
這份示例報告在這個腳本里列出了兩條高等級的發現。第一條發現是,這個腳本會遍歷 os.environ,把機器上的環境變量收集起來,而環境變量裏面放着 API 密鑰這類機密。
第二條發現是,這個腳本會用 requests.post 把它收集到的內容發到一個外部服務器上去。這兩條發現要放在一起看,因爲單獨的收集動作還可以有別的解釋,但是收集完了又往外部服務器發送,合起來就是把憑據從我的機器上往外送。
我自己在安裝之前用的工具就是 SkillSpector,它是 NVIDIA 發佈的產品,倉庫地址是 https://github.com/NVIDIA/SkillSpector 。
那 31,132 個技能是研究框架 SkillScan 掃出來的,而 SkillSpector 只是在它的 README 裏引用了這項研究的比率。所以「SkillSpector 掃了 31,132 個技能」這個說法是錯的,對的說法是掃這些技能的是 SkillScan,SkillSpector 沒有掃過它們,只是在 README 裏引用了這項研究的比率。
SkillSpector 的分析分成兩段來做。第一段是靜態分析,做法和前面 SkillScan 的靜態掃描相同,也是讀技能裏的代碼和文字,去匹配已知的問題模式。第二段是可以選擇開啓的大模型語義評估,也就是讓一個大模型來讀這些文件的內容,判斷某段寫法放在它所在的上下文裏到底是什麼意思。因爲掃描這個動作本身不會執行可疑代碼,所以我纔敢在安裝之前先拿它掃一遍陌生技能。
我是去看了 SkillSpector 的計分代碼,才弄清楚 SkillSpector 是怎麼計分的。每一條發現先按嚴重程度拿到一個基礎分。CRITICAL 的基礎分是 50 分,HIGH 的基礎分是 25 分。MEDIUM 的基礎分是 10 分,LOW 的基礎分是 5 分。拿到基礎分以後,還要再乘上這條發現的可信度。
可信度是掃描器爲每一條發現單獨給出的數值,取值在 0 到 1 之間,如果一條發現的可信度小於或等於 0,那麼這條發現就不計分。如果同一條規則在一個技能裏第二次出現,那麼第二次只按一半計算,第三次出現只按四分之一計算,再往後出現就不計分了。
計分裏有一處細節容易被講錯:1.3 倍這個乘數不是乘在總分上的。發現位於可執行腳本文件裏時,乘 1.3 倍的只有這一條發現的得分,出現在指令文件裏的發現不乘這個倍數。另外有少數發現本身就帶有 51 分的下限,就是說只要命中這類發現,分數至少從 51 分起算。所有發現加完以後,SkillSpector 把總分封頂在 100 分。只要總分到了 51 分,SkillSpector 給出的結論就是不要裝。
分數落在 21 分到 50 分之間的時候,結論是謹慎處理。我遇到這種結果,會回到報告裏把每一條發現對應的文件重新看一遍,然後再判斷這些問題到底是作者疏忽,還是我不能接受的行爲。如果我看完還是判斷不了的話,那麼我就按不要裝來處理。不裝一個技能,我損失的只是一個方便。但是如果我裝錯了一個技能,那麼我後面要處理的就是它可能已經讀過和發出去的那些東西,這個麻煩要大得多。
就算掃完一個問題都沒有報,我也不會直接認定這個技能就沒有問題。因爲 SkillSpector 只做靜態分析,所以那些要等到運行時纔會出現的行爲,它是看不到的。用非英文寫的內容,它可能會漏掉。藏在圖片裏的文字它分析不了,加密過或者編譯過的內容它也分析不了。它在自己的說明裏也寫了,它不會把我執意要裝的技能隔離開來單獨運行,所以它本身不是沙箱,裝完以後的隔離還得我自己另外去做。
我現在的順序一直沒有變過。我拿到一個新技能,會先把它的指令文件從頭讀到尾,因爲我要先弄清楚這個技能打算讓 agent 做哪些事情,又打算讓它讀哪些文件。讀的時候,如果指令文件要求讀取的文件跟這個技能宣稱的功能沒有關係,我就會在這一步停下來。如果指令文件要求把內容發到我不認識的外部地址去,我同樣會停下來,不再往下看。
指令文件這一關過了以後,我再逐個打開這個新技能帶的可執行腳本看,因爲前面研究裏 2.12 倍的那個差距已經說明,腳本是最容易出問題的地方,而且示例報告裏那兩條高等級發現也都是出在腳本文件裏。腳本都看完以後,我最後才用 SkillSpector 掃一遍,而只要它給出的分數到了 51 分以上的不要裝區間,我就直接停手,不會因爲這個技能用起來很方便就給它破一次例。
這類裝之前先把風險看清楚再決定裝不裝的文章,我還會接着寫。覺得有用的話,歡迎訂閱這個博客,或者先收藏起來。我會持續分享 AI、安全與開源這幾塊裏我自己實際查過和用過的東西,後面再有新的技能工具出現,我也會先自己動手跑一遍,然後再把結果寫出來告訴你。
來源:數字出自 Liu et al. 2026 論文《Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale》,由 NVIDIA SkillSpector 倉庫在 README 研究背景部分引用,倉庫鏈接見正文。