{"id":93243,"date":"2026-01-14T10:45:09","date_gmt":"2026-01-14T18:45:09","guid":{"rendered":"https:\/\/github.blog\/?p=93243"},"modified":"2026-01-20T11:55:23","modified_gmt":"2026-01-20T19:55:23","slug":"community-powered-security-with-ai-an-open-source-framework-for-security-research","status":"publish","type":"post","link":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/","title":{"rendered":"Community-powered security with AI: an open source framework for security research"},"content":{"rendered":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><p>Since its <a href=\"https:\/\/github.blog\/changelog\/2019-11-14-security-lab\/\">founding in 2019<\/a>, GitHub Security Lab has had one primary goal: <em>community-powered security<\/em>. We believe that the best way to improve software security is by sharing knowledge and tools, and by using open source software so that everybody is empowered to audit the code and report any vulnerabilities that they find.<\/p>\n\n\n\n<p>Six years later, a new opportunity has emerged to take community-powered security to the next level. Thanks to AI, we can now use natural language to encode, share, and scale our security knowledge, which will make it even easier to build and share new security tools. And under the hood, we can use <a href=\"https:\/\/modelcontextprotocol.io\/\">Model Context Protocol (MCP) interfaces<\/a> to build on existing security tools like <a href=\"https:\/\/codeql.github.com\/\">CodeQL<\/a>.<\/p>\n\n\n\n<p>As a community, we can eliminate software vulnerabilities far more quickly if we share our knowledge of how to find them. With that goal in mind, our team has been experimenting with an agentic framework called the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\">GitHub Security Lab Taskflow Agent<\/a>. We&rsquo;ve been using it internally for a while, and we also recently shared it with the participants of the <a href=\"https:\/\/github.com\/open-source\/github-secure-open-source-fund\">GitHub Secure Open Source Fund<\/a>. Although it&rsquo;s still experimental, it&rsquo;s ready for others to use.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"h-demo-variant-analysis\">Demo: Variant analysis<\/h1>\n\n\n\n<p>It takes only a few steps to get started with seclab-taskflow-agent:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a personal access token.<\/li>\n\n\n\n<li>Add codespace secrets.<\/li>\n\n\n\n<li>Start a codespace.<\/li>\n\n\n\n<li>Run a taskflow with a one-line command.<\/li>\n<\/ol>\n\n\n\n<p>Please follow along and give it a try!&nbsp;<\/p>\n\n\n\n<p><em>Note: This demo will use some of your token quota, and it&rsquo;s possible that you&rsquo;ll hit <\/em><a href=\"https:\/\/docs.github.com\/en\/github-models\/use-github-models\/prototyping-with-ai-models#rate-limits\"><em>rate limits<\/em><\/a><em>, particularly if you&rsquo;re using a free GitHub account. But I&rsquo;ve tried to design the demo so that it will work on a free account. The quotas will refresh after one day if you do hit the rate limits.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-create-a-fine-grained-personal-access-token\">Create a fine-grained personal access token<\/h2>\n\n\n\n<p>Go to your <a href=\"https:\/\/github.com\/settings\/personal-access-tokens\/new\">developer settings page<\/a> and create a personal access token (PAT).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" height=\"496\" width=\"1024\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/fine-grained-pat.png?resize=1024%2C496\" alt=\"Screenshot of the developer settings page where I am creating a new PAT.\" class=\"wp-image-93245\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/fine-grained-pat.png?w=1578 1578w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/fine-grained-pat.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/fine-grained-pat.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/fine-grained-pat.png?w=1024 1024w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/fine-grained-pat.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Scroll down and add the &ldquo;models&rdquo; permission:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" height=\"954\" width=\"1024\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/public-repos.png?resize=1024%2C954\" alt='Screenshot of the developer settings page where I am adding the \"Models\" permission to my new PAT.' class=\"wp-image-93246\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/public-repos.png?w=1589 1589w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/public-repos.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/public-repos.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/public-repos.png?w=1024 1024w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/public-repos.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"add-codespaces-secrets\">Add codespaces secrets<\/h2>\n\n\n\n<p>For security reasons, it&rsquo;s not a good idea to save the PAT that you just created in a file on disk. Instead, I recommend saving it as a &ldquo;codespace secret,&rdquo; which means it&rsquo;ll be available as an environment variable when you start a codespace in the next step.<\/p>\n\n\n\n<p>Go to <a href=\"https:\/\/github.com\/settings\/codespaces\/secrets\/new\">your codespaces settings<\/a> and create a secret named <code>GH_TOKEN<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" height=\"879\" width=\"1024\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/new-secret.png?resize=1024%2C879\" alt=\"Screenshot of the codespaces settings page, where I am adding a new secret.\" class=\"wp-image-93247\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/new-secret.png?w=1523 1523w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/new-secret.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/new-secret.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/new-secret.png?w=1024 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Under &ldquo;Repository access,&rdquo; add <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\"><code>GitHubSecurityLab\/seclab-taskflows<\/code><\/a>, which is the repo that we&rsquo;ll start the codespace from.<\/p>\n\n\n\n<p>Now go back to <a href=\"https:\/\/github.com\/settings\/codespaces\/secrets\/new\">your codespaces settings<\/a> and create a second secret named <code>AI_API_TOKEN<\/code>. You can use the same PAT for both secrets.<\/p>\n\n\n\n<p>We want to use two secrets so that <code>GH_TOKEN<\/code> is used to access GitHub&rsquo;s API and do things like read the code, whereas <code>AI_API_TOKEN<\/code> can access the AI API. Only one PAT is needed for this demo because it uses the GitHub Models API, but the framework also supports using other (not GitHub) APIs for the AI requests.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"start-a-codespace\">Start a codespace<\/h2>\n\n\n\n<p>Now go to the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\">seclab-taskflows repo<\/a> and start a codespace:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" height=\"820\" width=\"1024\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/codespaces.png?resize=1024%2C820\" alt=\"Screenshot of starting a new codespace from the seclab-taskflows repo.\" class=\"wp-image-93248\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/codespaces.png?w=1427 1427w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/codespaces.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/codespaces.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/codespaces.png?w=1024 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>After the codespace starts, wait a few minutes until you see a prompt like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" height=\"163\" width=\"1024\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/terminal.png?resize=1024%2C163\" alt=\"Screenshot of the terminal window in the newly started codespace, showing the (.venv) prompt.\" class=\"wp-image-93249\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/terminal.png?w=1600 1600w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/terminal.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/terminal.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/terminal.png?w=1024 1024w, https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/terminal.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>It&rsquo;s important to wait until you see (<code>.venv<\/code>) before the prompt, as it indicates that the <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\">Python virtual environment<\/a> has been created.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"run-a-taskflow-with-a-one-line-command\">Run a taskflow with a one-line command<\/h2>\n\n\n\n<p>In the codespace terminal, enter this command to run the variant analysis demo taskflow:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>python -m seclab_taskflow_agent -t seclab_taskflows.taskflows.audit.ghsa_variant_analysis_demo -g repo=github\/cmark-gfm -g ghsa=GHSA-c944-cv5f-hpvr<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"python -m seclab_taskflow_agent -t seclab_taskflows.taskflows.audit.ghsa_variant_analysis_demo -g repo=github\/cmark-gfm -g ghsa=GHSA-c944-cv5f-hpvr\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>Answer &ldquo;yes&rdquo; when it asks for permission to run <code>memcache_clear_cache<\/code>; this is the first run so the cache is already empty. The demo downloads and analyzes a <a href=\"https:\/\/docs.github.com\/en\/code-security\/security-advisories\/working-with-repository-security-advisories\/about-repository-security-advisories\">security advisory<\/a> from the repository (in this example, <a href=\"https:\/\/github.com\/github\/cmark-gfm\/security\/advisories\/GHSA-c944-cv5f-hpvr\"><code>GHSA-c944-cv5f-hpvr<\/code><\/a> from <a href=\"https:\/\/github.com\/github\/cmark-gfm\">cmark-gfm<\/a>). It tries to identify the source code file that caused the vulnerability, then it downloads that source code file and audits it for other similar bugs. It&rsquo;s not a sophisticated demo, and (thankfully) it has not found any new bugs in cmark-gfm &#129763;. But it&rsquo;s short and simple, and I&rsquo;ll use it later to explain what a taskflow is. You can also try it out on a different repository, maybe one of your own, by changing the repo name at the end of the command.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"other-ways-to-run\">Other ways to run<\/h1>\n\n\n\n<p>I recommend using a codespace because it&rsquo;s a quick, reliable way to get started. It&rsquo;s also a sandboxed environment, which is good for security. But there are other ways to run the framework if you prefer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"running-in-a-linux-terminal\">Running in a Linux terminal<\/h2>\n\n\n\n<p>These are the commands to install and run the demo locally on a Linux system:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>export AI_API_TOKEN=github_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nexport GH_TOKEN=$AI_API_TOKEN\npython3 -m venv .venv\nsource .venv\/bin\/activate\npip install seclab-taskflows\npython -m seclab_taskflow_agent -t seclab_taskflows.taskflows.audit.ghsa_variant_analysis_demo -g repo=github\/cmark-gfm -g ghsa=GHSA-c944-cv5f-hpvr<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"export AI_API_TOKEN=github_pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nexport GH_TOKEN=$AI_API_TOKEN\npython3 -m venv .venv\nsource .venv\/bin\/activate\npip install seclab-taskflows\npython -m seclab_taskflow_agent -t seclab_taskflows.taskflows.audit.ghsa_variant_analysis_demo -g repo=github\/cmark-gfm -g ghsa=GHSA-c944-cv5f-hpvr\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>These commands download our latest release from <a href=\"https:\/\/pypi.org\/\">PyPI<\/a>. Note that some of the toolboxes included with the framework may not work out-of-the-box with this approach because they depend on other software being installed. For example, the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/toolboxes\/codeql.yaml\">CodeQL toolbox<\/a> depends on <a href=\"https:\/\/codeql.github.com\/\">CodeQL<\/a> being installed. You can copy the installation instructions from the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/tree\/v0.0.3\/.devcontainer\">devcontainer configuration<\/a> that we use to build our codespaces environment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"running-in-docker\">Running in docker<\/h2>\n\n\n\n<p>We publish a <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/pkgs\/container\/seclab-taskflow-agent\">docker image<\/a> with tools like CodeQL pre-installed. You can run it with <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/docker\/run.sh\">this script<\/a>. Be aware that this docker image only includes <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\">seclab-taskflow-agent<\/a>. We are planning to publish a second &ldquo;batteries included&rdquo; image that also includes <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\">seclab-taskflows<\/a> in the future. Note: I&rsquo;ll explain the relationship between seclab-taskflow-agent and seclab-taskflows in the section about the collaboration model.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"taskflows\">Taskflows<\/h1>\n\n\n\n<p>A taskflow is a YAML file containing a list of tasks for the framework to execute. Let&rsquo;s look at the taskflow for my demo (<a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/taskflows\/audit\/ghsa_variant_analysis_demo.yaml\">source<\/a>):<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>seclab-taskflow-agent:\n  filetype: taskflow\n  version: 1\n\nglobals:\n  repo:\n  ghsa:\n\ntaskflow:\n  - task:\n      must_complete: true\n      agents:\n        - seclab_taskflow_agent.personalities.assistant\n      toolboxes:\n        - seclab_taskflow_agent.toolboxes.memcache\n      user_prompt: |\n        Clear the memory cache.\n\n  - task:\n      must_complete: true\n      agents:\n        - seclab_taskflow_agent.personalities.assistant\n      toolboxes:\n        - seclab_taskflows.toolboxes.ghsa\n        - seclab_taskflows.toolboxes.gh_file_viewer\n        - seclab_taskflow_agent.toolboxes.memcache\n      user_prompt: |\n        Fetch the details of the GHSA {{ GLOBALS_ghsa }} of the repo {{ GLOBALS_repo }}.\n\n        Analyze the description to understand what type of bug caused\n        the vulnerability. DO NOT perform a code audit at this stage, just \n        look at the GHSA details.\n\n        Check if any source file is mentioned as the cause of the GHSA.\n        If so, identify the precise file path and line number.\n\n        If no file path is mentioned, then report back to the user that \n        you cannot find any file path and end the task here.\n\n        The GHSA may not specify the full path name of the source\n        file, or it may mention the name of a function or method\n        instead, so if you have difficulty finding the file, try\n        searching for the most likely match.\n\n        Only identify the file path for now, do not look at the code or\n        fetch the file contents yet.\n\n        Store a summary of your findings in the memcache with the GHSA\n        ID as the key. That should include the file path and the function that \n        the file is in.\n\n  - task:\n      must_complete: true\n      agents:\n        - seclab_taskflow_agent.personalities.assistant\n      toolboxes:\n        - seclab_taskflows.toolboxes.gh_file_viewer\n        - seclab_taskflow_agent.toolboxes.memcache\n      user_prompt: |\n        Fetch the GHSA ID and summary that were stored in the memcache\n        by the previous task.\n\n        Look at the file path and function that were identified. Use the \n        get_file_lines_from_gh tool to fetch a small portion of the file instead of\n        fetching the entire file.\n\n        Fetch the source file that was identified as the cause of the\n        GHSA in repo {{ GLOBALS_repo }}. \n\n        Do a security audit of the code in the source file, focusing\n        particularly on the type of bug that was identified as the\n        cause of the GHSA.<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"seclab-taskflow-agent:\n  filetype: taskflow\n  version: 1\n\nglobals:\n  repo:\n  ghsa:\n\ntaskflow:\n  - task:\n      must_complete: true\n      agents:\n        - seclab_taskflow_agent.personalities.assistant\n      toolboxes:\n        - seclab_taskflow_agent.toolboxes.memcache\n      user_prompt: |\n        Clear the memory cache.\n\n  - task:\n      must_complete: true\n      agents:\n        - seclab_taskflow_agent.personalities.assistant\n      toolboxes:\n        - seclab_taskflows.toolboxes.ghsa\n        - seclab_taskflows.toolboxes.gh_file_viewer\n        - seclab_taskflow_agent.toolboxes.memcache\n      user_prompt: |\n        Fetch the details of the GHSA {{ GLOBALS_ghsa }} of the repo {{ GLOBALS_repo }}.\n\n        Analyze the description to understand what type of bug caused\n        the vulnerability. DO NOT perform a code audit at this stage, just \n        look at the GHSA details.\n\n        Check if any source file is mentioned as the cause of the GHSA.\n        If so, identify the precise file path and line number.\n\n        If no file path is mentioned, then report back to the user that \n        you cannot find any file path and end the task here.\n\n        The GHSA may not specify the full path name of the source\n        file, or it may mention the name of a function or method\n        instead, so if you have difficulty finding the file, try\n        searching for the most likely match.\n\n        Only identify the file path for now, do not look at the code or\n        fetch the file contents yet.\n\n        Store a summary of your findings in the memcache with the GHSA\n        ID as the key. That should include the file path and the function that \n        the file is in.\n\n  - task:\n      must_complete: true\n      agents:\n        - seclab_taskflow_agent.personalities.assistant\n      toolboxes:\n        - seclab_taskflows.toolboxes.gh_file_viewer\n        - seclab_taskflow_agent.toolboxes.memcache\n      user_prompt: |\n        Fetch the GHSA ID and summary that were stored in the memcache\n        by the previous task.\n\n        Look at the file path and function that were identified. Use the \n        get_file_lines_from_gh tool to fetch a small portion of the file instead of\n        fetching the entire file.\n\n        Fetch the source file that was identified as the cause of the\n        GHSA in repo {{ GLOBALS_repo }}. \n\n        Do a security audit of the code in the source file, focusing\n        particularly on the type of bug that was identified as the\n        cause of the GHSA.\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>You can see that it&rsquo;s quite similar in structure to a GitHub Actions workflow. There&rsquo;s a header at the top, followed by the body, which contains a series of tasks. The tasks are completed one by one by the agent framework. Let&rsquo;s go through the sections one by one, focusing on the most important bits:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"header\">Header<\/h2>\n\n\n\n<p>The first part of the header defines the file type. The most frequently used file types are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>taskflow<\/code>: Describes a sequence of tasks for the framework to execute.<\/li>\n\n\n\n<li><code>personality<\/code>: It&rsquo;s often useful to ask to assume a particular personality while executing a task. For example, we have an <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/personalities\/action_expert.yaml\"><code>action_expert<\/code><\/a> personality that is useful for auditing actions workflows.<\/li>\n\n\n\n<li>toolbox: Contains instructions for running an MCP server. For example, the demo uses the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/toolboxes\/gh_file_viewer.yaml\"><code>gh_file_viewer<\/code><\/a> toolbox for downloading source code files from GitHub.<\/li>\n<\/ul>\n\n\n\n<p>The globals section defines global variables named &ldquo;repo&rdquo; and &ldquo;ghsa,&rdquo; which we initialized with the command-line arguments <code>-g repo=github\/cmark-gfm<\/code> and <code>-g ghsa=GHSA-c944-cv5f-hpvr<\/code>. It&rsquo;s a crude way to parameterize a taskflow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"task-1\">Task 1<\/h2>\n\n\n\n<p>Tasks always specify a &ldquo;personality&rdquo; to use. For non-specialized tasks, we often just use the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/personalities\/assistant.yaml\"><code>assistant<\/code><\/a> personality.<\/p>\n\n\n\n<p>Each task starts with a fresh context, so the only way to communicate a result from one task to the next is by using a toolbox as an intermediary. In this demo, I&rsquo;ve used the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/toolboxes\/memcache.yaml\"><code>memcache<\/code><\/a> toolbox, which is a simple key-value store. We find that this approach is better for debugging, because it means that you can rerun an individual task with consistent inputs when you&rsquo;re testing it.<\/p>\n\n\n\n<p>This task also demonstrates that toolboxes can <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/toolboxes\/memcache.yaml#L17-L18\">ask for confirmation<\/a> before doing something potentially destructive, which is an important protection against <a href=\"https:\/\/genai.owasp.org\/llmrisk\/llm01-prompt-injection\/\">prompt injection<\/a> attacks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"task-2\">Task 2<\/h2>\n\n\n\n<p>This task uses the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/toolboxes\/ghsa.yaml\"><code>ghsa<\/code><\/a> toolbox to download the security advisory from the repository and the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/toolboxes\/gh_file_viewer.yaml\"><code>gh_file_viewer<\/code><\/a> toolbox to find the source file that&rsquo;s mentioned in the advisory. It creates a summary and uses the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/toolboxes\/memcache.yaml\"><code>memcache<\/code><\/a> toolbox to pass it to the next task.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"task-3\">Task 3<\/h2>\n\n\n\n<p>This task uses the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/toolboxes\/memcache.yaml\"><code>memcache<\/code><\/a> toolbox to fetch the results from the previous task and the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/toolboxes\/gh_file_viewer.yaml\"><code>gh_file_viewer<\/code><\/a> toolbox to download the source code and audit it.<\/p>\n\n\n\n<p>Often, the wording of a prompt is more subtle than it looks, and this third task is an example of that. Previous versions of this task tried to analyze the entire source file in one go, which used too many tokens. So the second paragraph, which asks to analyze a &ldquo;small portion of the file,&rdquo; is very important to make this task work successfully.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"taskflows-summary\">Taskflows summary<\/h2>\n\n\n\n<p>I hope this demo has given you a sense of what a taskflow is. You can find more detailed documentation in <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/README.md\"><code>README.md<\/code><\/a> and <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/doc\/GRAMMAR.md\"><code>GRAMMAR.md<\/code><\/a>. You can also find more examples in <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/tree\/v0.0.9\/examples\/taskflows\">this subdirectory<\/a> of seclab-taskflow-agent and <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/tree\/v0.0.3\/src\/seclab_taskflows\/taskflows\">this subdirectory<\/a> of seclab-taskflows.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"collaboration-model\">Collaboration model<\/h1>\n\n\n\n<p>We would love for members of the community to publish their own suites of taskflows. To make collaboration easy, we have built on top of Python&rsquo;s packaging ecosystem. Our own two repositories are published as packages on <a href=\"https:\/\/pypi.org\/\">PyPI<\/a>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/pypi.org\/project\/seclab-taskflow-agent\/\">seclab-taskflow-agent<\/a>: the implementation of the taskflow framework.<\/li>\n\n\n\n<li><a href=\"https:\/\/pypi.org\/project\/seclab-taskflows\/\">seclab-taskflows<\/a>: a suite of taskflows written by our team.<\/li>\n<\/ol>\n\n\n\n<p>The reason why we have two repositories is that we want to separate the &ldquo;engine&rdquo; from the suites of taskflows that use it. Also, <a href=\"https:\/\/pypi.org\/project\/seclab-taskflows\/\">seclab-taskflows<\/a> is intended to be an easy-to-copy template for anybody who would like to publish their own suite of taskflows. To get started on your package, we recommend using the <a href=\"https:\/\/hatch.pypa.io\/latest\/cli\/reference\/#hatch-new\">hatch new<\/a> command to create the initial project structure. It will generate things like the pyproject.toml file, which you&rsquo;ll need for uploading to PyPI. Next we recommend creating a <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/tree\/v0.0.3\/src\/seclab_taskflows\">directory structure like ours<\/a>, with sub-directories for taskflows, toolboxes, etc. Feel free to also copy other parts of seclab-taskflows, such as our <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/.github\/workflows\/publish-to-pypi.yaml\">publish-to-pypi.yaml<\/a> workflow, which automatically uploads your package to PyPI when you push a tag with a name like &ldquo;v1.0.0.&rdquo;<\/p>\n\n\n\n<p>An important feature of the collaboration model is that it is also easy to share MCP servers. For example, check out <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/tree\/v0.0.3\/src\/seclab_taskflows\/mcp_servers\">the MCP servers that are included with the seclab-taskflows package<\/a>. Each MCP server has a corresponding toolbox YAML file (in the <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/tree\/v0.0.3\/src\/seclab_taskflows\/toolboxes\">toolboxes<\/a> directory) which contains the instructions for running it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-import-system\">The import system<\/h2>\n\n\n\n<p>Taskflows often need to refer to other files, like personalities or toolboxes. And for the collaboration model to work well, we want you to be able to reuse personalities and toolboxes from other packages. We are leveraging Python&rsquo;s <a href=\"https:\/\/docs.python.org\/3\/library\/importlib.html\">importlib<\/a> to make it easy to reference a file from a different package. To illustrate how it works, here&rsquo;s an <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflows\/blob\/v0.0.3\/src\/seclab_taskflows\/taskflows\/audit\/ghsa_variant_analysis_demo.yaml#L22-L23\">example<\/a> in which seclab-taskflows is using a toolbox from seclab-taskflow-agent:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>toolboxes:\n  - seclab_taskflow_agent.toolboxes.memcache<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"toolboxes:\n  - seclab_taskflow_agent.toolboxes.memcache\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>The <a href=\"https:\/\/github.com\/GitHubSecurityLab\/seclab-taskflow-agent\/blob\/v0.0.9\/src\/seclab_taskflow_agent\/available_tools.py#L58-L69\">implementation<\/a> splits the name <code>seclab_taskflow_agent.toolboxes.memcache<\/code> into a directory (<code>seclab_taskflow_agent.toolboxes<\/code>) and a filename (<code>memcache<\/code>). Then it uses Python&rsquo;s <a href=\"https:\/\/docs.python.org\/3\/library\/importlib.resources.html#importlib.resources.files\"><code>importlib.resources.files<\/code><\/a> to locate the directory and loads the file named <code>memcache.yaml<\/code> from that directory. The only quirk of this system is that names always need to have at least two parts, which means that your files always need to be stored at least one directory deep. But apart from that, we&rsquo;re using Python&rsquo;s import system as is, which means that there&rsquo;s plenty of documentation and advice available online.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"project-vision\">Project vision<\/h1>\n\n\n\n<p>We have two main goals with this project. First is to <strong>encourage community-powered security<\/strong>. Many of the agentic security tools that are currently popping up are closed-source black boxes, which is the antithesis of what we stand for as a team. We want people to be able to look under the hood and see how the taskflows work. And we want people to be able to easily create and share their own taskflows. As a community, we can eliminate software vulnerabilities far more quickly if we share our knowledge of how to find them. We&rsquo;re hoping that taskflows can be an effective tool for that.<\/p>\n\n\n\n<p>Second is to <strong>create a tool that we want to use ourselves<\/strong>. As a research team, we want a tool that&rsquo;s good for rapid experimentation. We need to be able to quickly create a new security rule and try it out. With that in mind, we&rsquo;re not trying to create the world&rsquo;s most polished or efficient tool, but rather something that&rsquo;s easy to modify.<\/p>\n\n\n\n<p>For a deeper technical dive into how we&rsquo;re using the framework for security research, <a href=\"https:\/\/github.blog\/security\/ai-supported-vulnerability-triage-with-the-github-security-lab-taskflow-agent\/\">explore a blog post<\/a> by my colleagues Peter St&ouml;ckli and Man Yue Mo, where they share how they&rsquo;re using the framework for triaging CodeQL alerts.<\/p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><a href=\"https:\/\/github.blog\/security\/\">Check out the latest security news &gt;<\/a><\/p>\n<\/div>\n<\/body><\/html>\n","protected":false},"excerpt":{"rendered":"<p>Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.<\/p>\n","protected":false},"author":1905,"featured_media":93180,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gh_post_show_toc":"yes","_gh_post_is_no_robots":"","_gh_post_is_featured":"yes","_gh_post_is_excluded":"","_gh_post_is_unlisted":"","_gh_post_related_link_1":"","_gh_post_related_link_2":"","_gh_post_related_link_3":"","_gh_post_sq_img":"","_gh_post_sq_img_id":"","_gh_post_cta_title":"","_gh_post_cta_text":"","_gh_post_cta_link":"","_gh_post_cta_button":"","_gh_post_recirc_hide":"","_gh_post_recirc_col_1":"","_gh_post_recirc_col_2":"","_gh_post_recirc_col_3":"","_gh_post_recirc_col_4":"","_featured_video":"","_gh_post_additional_query_params":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"_links_to":"","_links_to_target":""},"categories":[3293,67,91],"tags":[3515,1915,3661,2739],"coauthors":[2148],"class_list":["post-93243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-and-ml","category-open-source","category-security","tag-agentic-ai","tag-github-security-lab","tag-mcp","tag-open-source"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Community-powered security with AI: an open source framework for security research - The GitHub Blog<\/title>\n<meta name=\"description\" content=\"Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Community-powered security with AI: an open source framework for security research\" \/>\n<meta property=\"og:description\" content=\"Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/\" \/>\n<meta property=\"og:site_name\" content=\"The GitHub Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-14T18:45:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-20T19:55:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kevin Backhouse\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kevin Backhouse\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/\"},\"author\":{\"name\":\"Kevin Backhouse\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/92f78909ac8106949ccaf6878d3d33d8\"},\"headline\":\"Community-powered security with AI: an open source framework for security research\",\"datePublished\":\"2026-01-14T18:45:09+00:00\",\"dateModified\":\"2026-01-20T19:55:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/\"},\"wordCount\":1963,\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/generic-security-logo-github-blocks.png?fit=1920%2C1080\",\"keywords\":[\"agentic AI\",\"GitHub Security Lab\",\"MCP\",\"open source\"],\"articleSection\":[\"AI &amp; ML\",\"Open Source\",\"Security\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/\",\"url\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/\",\"name\":\"Community-powered security with AI: an open source framework for security research - The GitHub Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/generic-security-logo-github-blocks.png?fit=1920%2C1080\",\"datePublished\":\"2026-01-14T18:45:09+00:00\",\"dateModified\":\"2026-01-20T19:55:23+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/92f78909ac8106949ccaf6878d3d33d8\"},\"description\":\"Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#primaryimage\",\"url\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/generic-security-logo-github-blocks.png?fit=1920%2C1080\",\"contentUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/generic-security-logo-github-blocks.png?fit=1920%2C1080\",\"width\":1920,\"height\":1080,\"caption\":\"Decorative image featuring geometric blocks with a shield icon displaying a check mark to represent security.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.blog\\\/security\\\/community-powered-security-with-ai-an-open-source-framework-for-security-research\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/github.blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Security\",\"item\":\"https:\\\/\\\/github.blog\\\/security\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Community-powered security with AI: an open source framework for security research\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/github.blog\\\/#website\",\"url\":\"https:\\\/\\\/github.blog\\\/\",\"name\":\"The GitHub Blog\",\"description\":\"Updates, ideas, and inspiration from GitHub to help developers build and design software.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/github.blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/92f78909ac8106949ccaf6878d3d33d8\",\"name\":\"Kevin Backhouse\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/37eef09dcba369292c199dca0f43db83ef312cd5956f7f5e1932893acabe55f6?s=96&d=mm&r=g3867af48b7150cd8900167c0a2e02002\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/37eef09dcba369292c199dca0f43db83ef312cd5956f7f5e1932893acabe55f6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/37eef09dcba369292c199dca0f43db83ef312cd5956f7f5e1932893acabe55f6?s=96&d=mm&r=g\",\"caption\":\"Kevin Backhouse\"},\"description\":\"I'm a security researcher on the GitHub Security Lab team. I try to help make open source software more secure by searching for vulnerabilities and working with maintainers to get them fixed.\",\"url\":\"https:\\\/\\\/github.blog\\\/author\\\/kevinbackhouse\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Community-powered security with AI: an open source framework for security research - The GitHub Blog","description":"Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/","og_locale":"en_US","og_type":"article","og_title":"Community-powered security with AI: an open source framework for security research","og_description":"Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.","og_url":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/","og_site_name":"The GitHub Blog","article_published_time":"2026-01-14T18:45:09+00:00","article_modified_time":"2026-01-20T19:55:23+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png","type":"image\/png"}],"author":"Kevin Backhouse","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kevin Backhouse","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#article","isPartOf":{"@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/"},"author":{"name":"Kevin Backhouse","@id":"https:\/\/github.blog\/#\/schema\/person\/92f78909ac8106949ccaf6878d3d33d8"},"headline":"Community-powered security with AI: an open source framework for security research","datePublished":"2026-01-14T18:45:09+00:00","dateModified":"2026-01-20T19:55:23+00:00","mainEntityOfPage":{"@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/"},"wordCount":1963,"image":{"@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png?fit=1920%2C1080","keywords":["agentic AI","GitHub Security Lab","MCP","open source"],"articleSection":["AI &amp; ML","Open Source","Security"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/","url":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/","name":"Community-powered security with AI: an open source framework for security research - The GitHub Blog","isPartOf":{"@id":"https:\/\/github.blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#primaryimage"},"image":{"@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png?fit=1920%2C1080","datePublished":"2026-01-14T18:45:09+00:00","dateModified":"2026-01-20T19:55:23+00:00","author":{"@id":"https:\/\/github.blog\/#\/schema\/person\/92f78909ac8106949ccaf6878d3d33d8"},"description":"Announcing GitHub Security Lab Taskflow Agent, an open source and collaborative framework for security research with AI.","breadcrumb":{"@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#primaryimage","url":"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png?fit=1920%2C1080","contentUrl":"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png?fit=1920%2C1080","width":1920,"height":1080,"caption":"Decorative image featuring geometric blocks with a shield icon displaying a check mark to represent security."},{"@type":"BreadcrumbList","@id":"https:\/\/github.blog\/security\/community-powered-security-with-ai-an-open-source-framework-for-security-research\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/github.blog\/"},{"@type":"ListItem","position":2,"name":"Security","item":"https:\/\/github.blog\/security\/"},{"@type":"ListItem","position":3,"name":"Community-powered security with AI: an open source framework for security research"}]},{"@type":"WebSite","@id":"https:\/\/github.blog\/#website","url":"https:\/\/github.blog\/","name":"The GitHub Blog","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/github.blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/github.blog\/#\/schema\/person\/92f78909ac8106949ccaf6878d3d33d8","name":"Kevin Backhouse","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/37eef09dcba369292c199dca0f43db83ef312cd5956f7f5e1932893acabe55f6?s=96&d=mm&r=g3867af48b7150cd8900167c0a2e02002","url":"https:\/\/secure.gravatar.com\/avatar\/37eef09dcba369292c199dca0f43db83ef312cd5956f7f5e1932893acabe55f6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/37eef09dcba369292c199dca0f43db83ef312cd5956f7f5e1932893acabe55f6?s=96&d=mm&r=g","caption":"Kevin Backhouse"},"description":"I'm a security researcher on the GitHub Security Lab team. I try to help make open source software more secure by searching for vulnerabilities and working with maintainers to get them fixed.","url":"https:\/\/github.blog\/author\/kevinbackhouse\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/github.blog\/wp-content\/uploads\/2026\/01\/generic-security-logo-github-blocks.png?fit=1920%2C1080","jetpack_shortlink":"https:\/\/wp.me\/pamS32-ofV","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/93243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/users\/1905"}],"replies":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/comments?post=93243"}],"version-history":[{"count":2,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/93243\/revisions"}],"predecessor-version":[{"id":93368,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/93243\/revisions\/93368"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media\/93180"}],"wp:attachment":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media?parent=93243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/categories?post=93243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/tags?post=93243"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/coauthors?post=93243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}