每一個 Agent 套件在建立前都會被掃描,更新套用前會再掃一次。掃描器是 NVIDIA SkillSpector,由平台在送出匯入時在伺服器端執行——預先掃過而且通過,不會被當成通行證。
掃描器實際在做的事,是比對一個 Skill 宣稱會做什麼、以及它的程式碼實際做了什麼。
風險等級
| 掃描結果 | 平台行為 | 你要做的事 |
|---|
LOW | 繼續 | 確認基本權限與相依套件。 |
MEDIUM | 顯示警告,並要求 Administrator 確認「這一次的掃描結果」 | 讀懂該筆發現、原因與它指向的檔案,確認這個行為確實必要。 |
HIGH | 擋下匯入 | 修掉高風險行為,重新掃描。 |
CRITICAL | 擋下匯入 | 停下來,先人工檢視程式碼。 |
MEDIUM 的確認只涵蓋那一次的掃描結果。套件一改,先前的確認就不再適用。
掃描範圍
| 範圍 | 檢查什麼 | 在找什麼 |
|---|
| Skill 說明與 metadata | SKILL.md、description、triggers、參數 | Prompt injection、觸發條件濫用、宣稱與實際行為不一致 |
| 文字與 prompt | Markdown、指示文字、註解 | 要求忽略安全規則、隱藏指示、要求洩漏 system prompt |
| 程式碼 | Python、shell script、設定檔 | 存取憑證、對外網路連線、執行系統指令、修改檔案 |
| Python 結構 | 程式的 AST | exec、eval、subprocess、os.system、動態 import |
| 資料流 | 資料從哪來、往哪去 | 密碼 → 網路、檔案 → 網路、外部輸入 → 指令執行 |
| 相依套件 | requirements 與套件版本 | 未鎖版本、已知 CVE、typosquatting |
| 夾帶的檔案 | .pyc、隱藏的執行檔、夾在文件容器裡的可執行內容 | 藏在一般檔案裡的可執行內容 |
| YARA 特徵 | 檔案內容 | 惡意程式、webshell、挖礦程式、exploit |
| MCP 與 agent 設定 | MCP metadata、權限、agent 設定 | 權限過大、tool poisoning、伸手到其他 Agent 或 Skill |
等級判定
每一筆發現有自己的嚴重度,各自貢獻一個基礎分數。全部加總成一個分數,再由這個分數決定套件的等級。可執行的 script 另外可能有加權。
| 發現的嚴重度 | 基礎分數 |
|---|
LOW | +5 |
MEDIUM | +10 |
HIGH | +25 |
CRITICAL | +50 |
| 總分 | 等級 | 意義 |
|---|
| 0–20 | LOW | 低風險,但基本安全設定仍值得確認。 |
| 21–50 | MEDIUM | 有需要注意的行為,建議人工檢視。 |
| 51–80 | HIGH | 存在高風險行為。 |
| 81–100 | CRITICAL | 可能含有明確的惡意行為,或能直接造成嚴重危害的行為。 |
一筆 CRITICAL 就足以單獨擋下匯入。多筆 MEDIUM 即使單看每一筆都不嚴重,加總後也可能越過 HIGH 的門檻——這通常代表這個 Skill 做的事超過它需要做的。
LOW
| 規則 | 條件 | 例子 |
|---|
| SC1 | 相依套件沒有鎖版本 | requirements.txt 只寫 requests,沒有版本 |
| PE1 | 要求的權限超過功能所需 | 只是讀檔案的功能卻要求大範圍的系統權限 |
| LP4 | 宣告了權限但程式從來沒用到 | 通常是沒清乾淨的設定,不是真的需要 |
MEDIUM
| 規則 | 條件 |
|---|
| PE2 | 使用 sudo 或 root 權限 |
| E1 | 把資料送到外部 URL |
| E3 | 掃描檔案系統尋找敏感檔案 |
| EA3 | 實際能力超過 Skill 宣稱的用途 |
| EA4 | API、運算或儲存用量沒有明確上限 |
| TM3 | 使用不安全的預設值,例如關掉 TLS 驗證 |
| TR1 / TR3 | 觸發條件過於寬鬆,或使用過於泛用的關鍵字 |
| LP2 / LP3 | 使用萬用字元權限,或有沒宣告在權限裡的能力 |
| TP3 / TP4 | MCP 參數描述含有注入內容,或與實際行為不符 |
| AS3 | 列舉或讀取其他已安裝的 Skill |
HIGH
| 類別 | 規則 | 常見情境 |
|---|
| 操控 prompt 或 agent | P1, P2, P3, AR1–AR3 | 要求忽略既有指示、隱藏 prompt、禁止拒絕、解除安全限制 |
| 存取憑證或資料 | E2, E4, PE3 | 讀取環境變數、SSH key、token 或密碼;外洩對話內容 |
| 供應鏈 | SC2, SC3, SC4, SC6, SC8, SC9 | curl URL | bash、混淆過的程式碼、已知 CVE、typosquatting、隱藏的可執行內容 |
| Agent 權限與行為 | EA1, EA2, OH1, MP1, MP3 | 不受限的工具權限、高風險操作沒有人工確認、未驗證的模型輸出 |
| 系統指令與 Python | TM1, TM2, AST2–AST5, AST9 | shell=True、eval、subprocess、os.system、動態 import |
| 資料流 | TT1, TT4 | 把敏感資料或檔案內容原封不動送上網路 |
| 窺探 MCP 或 agent | LP1, TP1, TP2, AS1, AS2 | 讀取 agent 或 MCP 設定、隱藏工具指示、使用具欺騙性的 Unicode |
| YARA | YR3, YR4 | 挖礦程式、駭客工具或 exploit 特徵 |
CRITICAL
| 規則 | 條件 |
|---|
| P5 | 可能造成實體傷害的高風險指示 |
| RA1 | Skill 在執行過程中修改自己的程式碼或設定 |
| AST1 | 直接用 exec() 執行任意程式碼 |
| AST8 | 從網路或其他動態來源取得內容後交給 exec 或 eval |
| TT3 | 憑證或機密直接流向外部網路目的地 |
| TT5 | 外部或使用者輸入直接進入程式碼執行 |
| YR1 | 符合已知惡意程式特徵 |
| YR2 | 符合 webshell 特徵 |
怎麼看一筆發現
| 等級 | 例子 | 為什麼是這個分數 |
|---|
LOW | requirements.txt 沒有指定套件版本 | 是供應鏈做法不夠嚴謹,不是一個行為 |
MEDIUM | Skill 需要 sudo 才能執行 | 不一定有問題,但需要提高權限這件事要說得出理由 |
HIGH | Skill 讀取 ~/.ssh/id_rsa 或所有環境變數 | 它有辦法取得憑證或 API key |
HIGH | 程式使用 curl URL | bash | 下載後立刻執行遠端程式碼,實際行為無從審查 |
CRITICAL | requests.get(url) 取得的內容被交給 exec() | 外部內容直接當程式碼執行,典型的遠端程式碼執行風險 |
每一筆發現都會列出規則 ID、簡短說明與來源檔案位置。從檔案看起,不要從分數看起。
套件被擋下來
- 打開那筆發現指名的檔案。規則 ID 告訴你該查上面哪一張表。
- 先問這個 Skill 到底需不需要這個行為。真正的工業用 Skill 上出現的
HIGH,多半來自便宜行事——用 shell 外呼取代一次函式呼叫,或讀整份環境變數只為了拿其中一個。
- 如果真的需要,就把它縮小:指定單一檔案而不是掃整個目錄、鎖定版本而不是浮動版本、宣告具體權限而不是萬用字元。
- 重新打包 ZIP 再匯入一次。掃描會從頭跑過。
相關文件