技术速递|社区驱动的 AI 安全:一个面向安全研究的开源框架

发布时间:2026/7/9 23:08:06
技术速递|社区驱动的 AI 安全:一个面向安全研究的开源框架 目录Demo变体分析创建细粒度个人访问令牌添加 Codespaces 秘钥启动 Codespace用一行命令运行 Taskflow其他运行方式在 Docker 中运行TaskflowsHeaderTask 1Task 2Task 3Taskflows 总结协作模型导入系统项目愿景作者Kevin Backhouse排版Alan Wang宣布 GitHub Security Lab Taskflow Agent——一个面向安全研究的开源协作框架结合 AI 使用。自 2019 年成立以来GitHub Security Lab 的主要目标一直只有一个社区驱动的安全。我们相信提升软件安全性的最佳方式是分享知识和工具并使用开源软件使每个人都能审计代码并报告发现的漏洞。六年过去了现在出现了一个将社区驱动安全提升到新高度的新机会。借助 AI我们现在可以使用自然语言来编码、共享和扩展我们的安全知识这将使构建和分享新安全工具变得更加容易。而在底层我们可以使用 Model Context Protocol (MCP) 接口在现有安全工具如 CodeQL之上进行扩展。作为一个社区如果我们分享发现漏洞的方法就能更快地消除软件漏洞。基于这一目标我们团队一直在尝试一个名为 GitHub Security Lab Taskflow Agent 的智能体框架。我们已在内部使用一段时间并最近向 GitHub Secure Open Source Fund 的参与者分享了它。虽然它仍处于实验阶段但已经可以供其他人使用。2019 年成立https://github.blog/changelog/2019-11-14-security-lab/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorModel Context Protocol (MCP)https://modelcontextprotocol.io/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorCodeQLhttps://codeql.github.com/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorGitHub Security Lab Taskflow Agenthttps://github.com/GitHubSecurityLab/seclab-taskflow-agent?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorGitHub Secure Open Source Fundhttps://github.com/open-source/github-secure-open-source-fund?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorDemo变体分析使用seclab-taskflow-agent入门只需几个步骤创建个人访问令牌。添加 Codespace 秘钥。启动 Codespace。用一行命令运行 taskflow。请跟随演示并尝试操作注意运行演示会消耗一些令牌配额如果你使用的是免费 GitHub 账户可能会遇到速率限制。不过我已设计 Demo 使其在免费账户下也能运行。如果触发速率限制配额将在一天后刷新。创建细粒度个人访问令牌进入你的开发者设置页面创建个人访问令牌PAT。向下滚动添加 “models” 权限开发者设置页面https://github.com/settings/personal-access-tokens/new?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor添加 Codespaces 秘钥出于安全考虑不建议将刚创建的 PAT 保存到磁盘文件中。建议将其作为Codespace Secret保存这样在启动 Codespace 时它会作为环境变量提供。在 Codespaces 设置中创建一个名为GH_TOKEN的 Secret。在 “Repository access” 下添加 GitHubSecurityLab/seclab-taskflows 仓库这是我们将启动 Codespace 的仓库。返回 Codespaces 设置创建第二个 SecretAI_API_TOKEN可使用同一个 PAT。我们使用两个 Secret 的目的是GH_TOKEN用于访问 GitHub API例如读取代码等操作而AI_API_TOKEN用于访问 AI API。这个演示只需要一个 PAT因为它使用的是 GitHub Models API但该框架也支持使用其他非 GitHub的 API 来处理 AI 请求。Codespaces 设置https://github.com/settings/codespaces/secrets/new?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorGitHubSecurityLab/seclab-taskflowshttps://github.com/GitHubSecurityLab/seclab-taskflows?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorCodespaces 设置https://github.com/settings/codespaces/secrets/new?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor启动 Codespace进入 seclab-taskflows 仓库并启动 Codespace在 Codespace 启动后等待几分钟直到你看到类似这样的提示看到提示前带有 (.venv) 非常重要因为这表示 Python 虚拟环境已经创建完成。seclab-taskflows 仓库https://github.com/GitHubSecurityLab/seclab-taskflows?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorPython 虚拟环境https://docs.python.org/3/library/venv.html?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor用一行命令运行 Taskflow在 Codespace 终端中输入以下命令运行变体分析演示 taskflowpython -m seclab_taskflow_agent -t seclab_taskflows.taskflows.audit.ghsa_variant_analysis_demo -g repogithub/cmark-gfm -g ghsaGHSA-c944-cv5f-hpvr当系统询问是否允许运行memcache_clear_cache时请回答 “yes”这是第一次运行所以缓存已经是空的。该演示会从仓库中下载并分析一个安全公告在本例中是来自 cmark-gfm 的 GHSA-c944-cv5f-hpvr。它会尝试识别导致漏洞的源代码文件然后下载该源代码文件并审查是否存在其他类似的漏洞。这个演示并不复杂而且值得庆幸的是它在 cmark-gfm 中没有发现任何新漏洞 。不过它简短且易于理解我稍后会用它来说明什么是 taskflow。你也可以在其他仓库上尝试这个演示比如你自己的仓库只需在命令末尾更改仓库名称即可。安全公告https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorcmark-gfmhttps://github.com/github/cmark-gfm?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorGHSA-c944-cv5f-hpvrhttps://github.com/github/cmark-gfm/security/advisories/GHSA-c944-cv5f-hpvr?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor其他运行方式我建议使用 Codespace因为它是一个快速且可靠的入门方式。同时它也是一个沙箱环境对安全性有利。但如果你愿意也有其他方式可以运行这个框架。在 Linux 终端中运行以下是在 Linux 系统上本地安装并运行该演示的命令export AI_API_TOKENgithub_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX export GH_TOKEN$AI_API_TOKEN python3 -m venv .venv source .venv/bin/activate pip install seclab-taskflows python -m seclab_taskflow_agent -t seclab_taskflows.taskflows.audit.ghsa_variant_analysis_demo -g repogithub/cmark-gfm -g ghsaGHSA-c944-cv5f-hpvr这些命令会从 PyPI 下载我们的最新发布版本。请注意框架中包含的一些工具箱可能无法通过这种方式开箱即用因为它们依赖于其他软件的安装。例如CodeQL 工具箱依赖于已安装的 CodeQL。你可以从我们用于构建 Codespaces 环境的 devcontainer 配置中复制安装说明。PyPIhttps://pypi.org/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorCodeQL 工具箱https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/toolboxes/codeql.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorCodeQLhttps://codeql.github.com/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactordevcontainer 配置https://github.com/GitHubSecurityLab/seclab-taskflows/tree/v0.0.3/.devcontainer?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor在 Docker 中运行我们发布了一个预装了 CodeQL 等工具的 Docker 镜像。你可以使用这个脚本来运行它。请注意该 Docker 镜像仅包含 seclab-taskflow-agent。我们计划在未来发布第二个“全套工具”镜像其中也会包含 seclab-taskflows。注意我将在“协作模型”部分解释seclab-taskflow-agent与seclab-taskflows之间的关系。Docker 镜像https://github.com/GitHubSecurityLab/seclab-taskflow-agent/pkgs/container/seclab-taskflow-agent?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor这个脚本https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/docker/run.sh?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorseclab-taskflow-agenthttps://github.com/GitHubSecurityLab/seclab-taskflow-agent?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorseclab-taskflowshttps://github.com/GitHubSecurityLab/seclab-taskflows?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorTaskflowsTaskflow 是一个 YAML 文件包含一系列供框架执行的任务。让我们来看一下我演示用的 taskflow来源seclab-taskflow-agent: filetype: taskflow version: 1 globals: repo: ghsa: taskflow: - task: must_complete: true agents: - seclab_taskflow_agent.personalities.assistant toolboxes: - seclab_taskflow_agent.toolboxes.memcache user_prompt: | Clear the memory cache. - task: must_complete: true agents: - seclab_taskflow_agent.personalities.assistant toolboxes: - seclab_taskflows.toolboxes.ghsa - seclab_taskflows.toolboxes.gh_file_viewer - seclab_taskflow_agent.toolboxes.memcache user_prompt: | Fetch the details of the GHSA {{ GLOBALS_ghsa }} of the repo {{ GLOBALS_repo }}. ...你可以看到它的结构与 GitHub Actions 工作流非常相似。顶部是头部header下面是主体body其中包含一系列任务。任务由智能体框架逐一完成。让我们逐个部分进行讲解重点关注最关键的内容来源https://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/taskflows/audit/ghsa_variant_analysis_demo.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorHeaderHeader 的第一部分定义了文件类型。最常用的文件类型包括taskflow描述框架要执行的一系列任务。personality在执行任务时通常需要指定某种特定角色。例如我们有一个 action_expert 角色用于审核 Actions 工作流。toolbox包含运行 MCP 服务器的指令。例如本演示使用gh_file_viewer工具箱从 GitHub 下载源代码文件。globals部分定义了名为repo和ghsa的全局变量这些变量通过命令行参数-g repogithub/cmark-gfm和-g ghsaGHSA-c944-cv5f-hpvr初始化。这是一种粗略的任务流参数化方式。action_experthttps://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/personalities/action_expert.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorgh_file_viewerhttps://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/toolboxes/gh_file_viewer.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorTask 1任务总是指定一个要使用的 “personality”。对于非专业化任务我们通常只使用 assistant 角色。每个任务从一个全新的上下文开始因此从一个任务传递结果到下一个任务的唯一方式是通过工具箱作为中介。在本演示中我使用了 memcache 工具箱它是一个简单的键值存储。我们发现这种方法更适合调试因为它允许在测试时以一致的输入重新运行单个任务。此任务还演示了工具箱可以在执行潜在破坏性操作前请求确认这是防止提示注入攻击的重要保护措施。assistanthttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/personalities/assistant.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactormemcachehttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/toolboxes/memcache.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor请求确认https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/toolboxes/memcache.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk#L17-L18/?wt.mc_id3reg_webpage_reactor提示注入https://genai.owasp.org/llmrisk/llm01-prompt-injection/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorTask 2该任务使用 ghsa 工具箱从仓库下载安全公告并使用 gh_file_viewer 工具箱查找公告中提到的源文件。它创建摘要并使用 memcache 工具箱将结果传递给下一个任务。ghsahttps://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/toolboxes/ghsa.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorgh_file_viewerhttps://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/toolboxes/gh_file_viewer.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactormemcachehttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/toolboxes/memcache.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorTask 3该任务使用 memcache 工具箱获取上一个任务的结果并使用 gh_file_viewer 工具箱下载源代码并进行审核。通常提示词的措辞比看起来更微妙这个第三个任务就是一个例子。之前版本的任务尝试一次分析整个源文件消耗了过多的 token。因此第二段要求分析“文件的一小部分”对于任务的成功执行非常重要。memcachehttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/toolboxes/memcache.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorgh_file_viewerhttps://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/toolboxes/gh_file_viewer.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorTaskflows 总结希望这个演示能让你对任务流有一个初步了解。你可以在 README.md 和 GRAMMAR.md 中找到更详细的文档。你还可以在 seclab-taskflow-agent 和 seclab-taskflows 的子目录中找到更多示例。README.mdhttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/README.md?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorGRAMMAR.mdhttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/doc/GRAMMAR.md?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorseclab-taskflow-agenthttps://github.com/GitHubSecurityLab/seclab-taskflow-agent/tree/v0.0.9/examples/taskflows?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorseclab-taskflowshttps://github.com/GitHubSecurityLab/seclab-taskflows/tree/v0.0.3/src/seclab_taskflows/taskflows?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor协作模型我们希望社区成员能够发布自己的任务流套件。为了方便协作我们构建在 Python 的打包生态之上。我们自己的两个仓库已发布为PyPI包seclab-taskflow-agent任务流框架的实现。seclab-taskflows我们团队编写的一套任务流。我们之所以有两个仓库是希望将“引擎”与使用它的任务流套件分离。同时seclab-taskflows 旨在作为一个易于复制的模板供任何希望发布自己任务流套件的人使用。开始创建你的包时我们建议使用hatch new命令来创建初始项目结构。它会生成pyproject.toml等文件你在上传到 PyPI 时需要用到。接下来我们建议创建一个类似的目录结构为任务流、工具箱等创建子目录。你也可以复制seclab-taskflows的其他部分比如publish-to-pypi.yaml工作流它会在你推送类似 “v1.0.0” 的标签时自动上传你的包到 PyPI。协作模型的一个重要特点是共享 MCP 服务器也很方便。例如查看 seclab-taskflows 包中包含的 MCP 服务器。每个 MCP 服务器都有一个对应的工具箱 YAML 文件在 toolboxes 目录中其中包含运行该服务器的指令。PyPIhttps://pypi.org/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorseclab-taskflow-agenthttps://pypi.org/project/seclab-taskflow-agent/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorseclab-taskflowshttps://pypi.org/project/seclab-taskflows/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorhatch newhttps://hatch.pypa.io/latest/cli/reference/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk#hatch-new/?wt.mc_id3reg_webpage_reactor类似的目录结构https://github.com/GitHubSecurityLab/seclab-taskflows/tree/v0.0.3/src/seclab_taskflows?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactorpublish-to-pypi.yamlhttps://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/.github/workflows/publish-to-pypi.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor导入系统任务流经常需要引用其他文件比如 personalities 或工具箱。为了让协作模型良好运作我们希望你能够重用来自其他包的 personalities 和工具箱。我们利用 Python 的 importlib 来方便引用其他包的文件。举例来说seclab-taskflows使用seclab-taskflow-agent的工具箱toolboxes: - seclab_taskflow_agent.toolboxes.memcache实现方法是将名称seclab_taskflow_agent.toolboxes.memcache拆分为目录seclab_taskflow_agent.toolboxes和文件名memcache。然后使用 Python 的importlib.resources.files定位目录并加载该目录下名为memcache.yaml的文件。这个系统唯一的特别之处是名称必须至少有两部分这意味着你的文件必须至少存放在一个子目录中。但除此之外我们直接使用 Python 的导入系统这也意味着网上有大量文档和建议可供参考。importlibhttps://docs.python.org/3/library/importlib.html?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor举例https://github.com/GitHubSecurityLab/seclab-taskflows/blob/v0.0.3/src/seclab_taskflows/taskflows/audit/ghsa_variant_analysis_demo.yaml?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk#L22-L23/?wt.mc_id3reg_webpage_reactor实现方法https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/v0.0.9/src/seclab_taskflow_agent/available_tools.py?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk#L58-L69/?wt.mc_id3reg_webpage_reactorimportlib.resources.fileshttps://docs.python.org/3/library/importlib.resources.html?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk#importlib.resources.files/?wt.mc_id3reg_webpage_reactor项目愿景我们有两个主要目标。首先是鼓励社区驱动的安全。当前涌现的许多智能化安全工具是闭源的黑盒子这与我们团队的理念完全相反。我们希望人们能够“掀开引擎盖”查看任务流的工作原理也希望人们能够轻松创建和分享自己的任务流。作为社区如果共享发现漏洞的方法我们就能更快地消除软件漏洞。我们希望任务流能够成为实现这一目标的有效工具。第二是创建一个我们自己想使用的工具。作为研究团队我们希望工具适合快速实验。我们需要能够快速创建新的安全规则并进行测试。基于此我们并不追求打造世界上最精美或最高效的工具而是希望它易于修改。如果想深入了解我们如何使用该框架进行安全研究可以阅读我的同事 Peter Stöckli 和 Man Yue Mo 的博客文章他们分享了如何使用该框架对 CodeQL 警报进行分级处理。查看最新安全资讯博客文章https://github.blog/security/ai-supported-vulnerability-triage-with-the-github-security-lab-taskflow-agent/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor查看最新安全资讯https://github.blog/security/?utm_campaigncli-sdk-jan-2026utm_sourceblog-announcement-cli-sdk/?wt.mc_id3reg_webpage_reactor引入地址