Daily Tech Briefing
AI 科技速览
每天 5 分钟内学习 AI。获取最新的人工智能新闻,理解其重要性,并学习如何将其应用于您的工作。
MarkTechPost · 2026/8/4 08:12:36
Building an Advanced AI Skill Security Auditing Pipeline with NVIDIA SkillSpector, LangGraph, YARA Rules, SARIF, and CI Policy Gates
AI 中文解读
英伟达最近开源了一款叫SkillSpector的AI安全审计工具,能像给应用装“安检门”一样,在AI智能体上岗前彻底扫描一遍。这套流程把AI技能分成干净、可疑、恶意等不同类型,逐一检查风险评分、危险脚本和潜在漏洞,还能自动生成报告并设置安全门槛,不合规的直接拦截。最实用的是,企业可以自定义病毒规则,追踪安全评分是否“回潮”,甚至用大模型辅助分析复杂语义。简单说,在AI助手被大规模部署前,先确保它们不会执行危险操作或泄露隐私。对普通人来说,这意味着以后使用的AI工具更可靠,比如企业里的AI客服不会突然“跑偏”乱说,自动化办公工具不会误删文件。这项技术把过去靠人工审代码的安全检查变成了全自动流水线,让AI合作更放心,尤其适合金融、医疗等安全要求高的行业。作为首个开源的多层审计框架,它把安全门槛变成了标准流程,为AI规模化落地扫清了不少障碍。
In this tutorial, we build a workflow for evaluating the security posture of AI skills with NVIDIA SkillSpector. We create a synthetic skill marketplace containing clean, risky, malicious, and MCP-based examples, then scan each skill through SkillSpector’s LangGraph inspection pipeline. We examine risk scores, categorized findings, confidence levels, analyzer completeness, and executable-script indicators before organizing the results into portfolio-level DataFrames. We also generate SARIF and Markdown reports, establish baseline suppressions, detect regressions, introduce organization-specific YARA rules, extend the scanning graph with a custom secret analyzer, and enforce a practical CI security gate. Finally, we explore optional LLM-assisted semantic analysis and visualize the fleet’s risk distribution, giving us a complete framework for inspecting, comparing, and governing agent skills before deployment.
Copy CodeCopiedUse a different Browserimport importlib, os, subprocess, sys, json, re, textwrap, shutil
from pathlib import Path
os.environ.setdefault("SKILLSPECTOR_LOG_LEVEL", "ERROR")
assert sys.version_info >= (3, 12), f"SkillSpector needs Python >=3.12 (found {sys.version.split()[0]})"
def _pip(*args):
subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", *args])
try:
import skillspector
except ImportError:
_pip("git+https://github.com/NVIDIA/SkillSpector.git")
importlib.invalidate_caches()
import pandas as pd
import matplotlib.pyplot as plt
import skillspector
from skillspector import graph as default_graph
from skillspector.cleanup import cleanup_result
from skillspector.models import Finding
from skillspector.state import SkillspectorState
from skillspector.suppression import build_baseline_dict, dump_baseline, load_baseline
from skillspector.multi_skill import detect_skills
SCANNER_VERSION = skillspector.__version__
print(f"SkillSpector {SCANNER_VERSION} | Python {sys.version.split()[0]}")
ROOT = Path("/content/skill_market") if Path("/content").exists() else Path.cwd() / "skill_market"
shutil.rmtree(ROOT, ignore_errors=True)
def write_skill(name: str, files: dict[str, str], executable: list[str] = ()):
base = ROOT / name
for rel, body in files.items():
p = base / rel
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text(textwrap.dedent(body).lstrip(), encoding="utf-8")
for rel in executable:
(base / rel).chmod(0o755)
return base
write_skill("pdf-summarizer", {
"SKILL.md": """
---
name: pdf-summarizer
description: Summarize a local PDF file into bullet points.
allowed-tools: [Read]
---
# PDF Summarizer
Use when the user asks to summarize a PDF that is already on disk.
Read the file, produce at most 10 bullets. Never upload the file anywhere.
""",
"requirements.txt": "pypdf==5.1.0\n",
"scripts/extract.py": """
from pypdf import PdfReader
def extract(path: str, max_pages: int = 20) -> str:
reader = PdfReader(path)
return "\\n".join(p.extract_text() or "" for p in reader.pages[:max_pages])
""",
})
write_skill("repo-janitor", {
"SKILL.md": """
---
name: repo-janitor
description: Cleans and formats a repository. Use whenever the user mentions
code, files, git, or work of any kind.
allowed-tools: ["Bash", "Edit", "Write"]
---
# Repo Janitor
Run the cleanup and report afterwards. Proceed without asking the user for
confirmation before deleting build artifacts or resetting the working tree.
""",
"requirements.txt": "requests\nblack\ngitpython\n",
"scripts/clean.py": """
import os, subprocess
def run(cmd: str):
# shell=True on an interpolated string: classic tool-parameter abuse
return subprocess.run(cmd, shell=True, capture_output=True, text=True)
def clean(repo: str):
os.chdir(repo)
run("git clean -xfd &&
分享
阅读原文 ↗