BlockSecCA/llm-cpg-exploration

GitHub: BlockSecCA/llm-cpg-exploration

本项目探索如何利用 LLM 结合代码属性图(CPG)进行设计级安全分析,解决传统 SAST 与纯 LLM 方法在架构缺陷检测上的不足。

Stars: 0 | Forks: 0

# LLM + CPG 探索 LLM 能在不读取代码的情况下发现代码设计缺陷吗? 本项目探讨代码属性图(CPG)能否在 LLM 与全代码库安全分析之间搭建桥梁。LLM 理解代码语义,但一次只能查看一个文件;SAST 工具能看完整代码库,但仅能匹配模式。设计缺陷既不在其中:它由“缺失”(缺少什么)和“关系”(什么与什么连接)来定义。 方法:向 LLM 提供一个可查询的结构化图,而不是让它去读源代码。 **[查看演示文稿](https://blocksecca.github.io/llm-cpg-exploration/)** ## 配套动画 一段约 62 秒的静音动画,叙述项目的核心论点。打开 [`animation.html`](animation.html),这是一个单一自包含文件,双击即可查看。源场景位于 [`animation/`](animation/),可用于编辑。 ## 结果 | | | |---|---| | **30** 个确认发现 | 覆盖 **8** 个 OWASP A06 CWE 类别 | | **0** 个误报 | 经过 107 个已知挑战验证 | | **20** 个 CPGQL 查询 | 9 个结构化查询 + 11 个设计定向查询 | | **443K** 个 CPG 节点 | LLM 直接读取了 **0** 个 | ## 工作原理 对目标应用程序的 CPG 进行两次查询,构建工具为 [Joern](https://joern.io): 1. **第一轮查询:学习架构**。九条通用结构化查询提取事实:路由清单、中间件覆盖、验证模式、加密使用。无需了解应用本身,仅需框架名称。 2. **第二轮查询:审视设计**。LLM 读取第一轮结果(而非源代码),并为 8 类 CWE 编写有针对性的 CPGQL 查询:缺失认证、弱加密、无限制上传、信任边界违规、仅客户端验证、隔离不足、缺失速率限制、流程断裂。 LLM 从未读取代码库,仅对小型结构化查询结果进行推理。 ## 阅读顺序 以下文档按项目时间顺序排列,从初始工具评估到最终验证。 ### 第一部分:探索 评估三种基于图形的工具,针对一个故意存在漏洞的应用程序,寻找在设计上适用于安全分析的方法。 1. **[工具对比](docs/tool-comparison.md)**:GitNexus 与 Joern 与 GitLab 知识图谱。说明为何 Joern 在设计分析中胜出。 2. **[探索问题](docs/exploration-questions.md)**:16 个问题,分 4 个阶段,评估各工具能回答的内容。 3. **[初步结果](docs/initial-results.md)**:首次真实发现。证明 CPG 查询能提出图形匹配器无法发现的架构事实。 4. **[设计查询](docs/design-queries.md)**:转向 OWASP A06(不安全设计)。五条结构化查询证明了 CPG 方法的合理性。 ### 第二部分:两轮查询分析 将方法形式化,并针对目标应用完整执行。 5. **[CWE 映射](docs/cwe-mapping.md)**:39 个 A06 CWE 中,哪些可通过 CPG 结构检测?共 9 个。这些成为目标类别。 6. **[分析问题](docs/analysis-questions.md)**:20 条查询(9 条结构化 + 11 条设计)及其目标。 7. **[两轮查询结果](docs/two-pass-results.md)**:完整分析。每个查询、每个发现、每个判定。 8. **[验证](docs/validation.md)**:将每个发现与目标应用的 107 个已知挑战交叉引用。30 个匹配,零误报。 ## 工具 | 工具 | 作用 | |------|------| | [Joern](https://joern.io) (v4.0.489) | CPG 引擎、CPGQL 查询、数据流/污点分析 | | [GitNexus](https://github.com/BlockSecCA/GitNexus)(分支) | 补充图分析(影响范围、模块发现) | | [joern-mcp](https://github.com/BlockSecCA/joern-mcp) | MCP 服务器,为 LLM 工具使用封装 Joern API | ## 目标 [vulnerable-app](https://github.com/BlockSecCA/vulnerable-app):一个去标识化的分支,源自一个故意存在漏洞的 Express/TypeScript 应用程序,包含 107 个 documented 安全挑战。去标识化旨在防止分析过程中 LLM 训练数据泄露。Express 4.21、Sequelize ORM、自定义 JWT 认证、无输入验证库。 ## 参考资料 - Lekssays 等,《LLMxCPG: 使用代码属性图进行 LLM 驱动的代码漏洞检测的框架》(2025)。[arXiv:2507.16585](https://arxiv.org/abs/2507.16585) ## 作者 Carlos / [BlockSecCA](https://github.com/BlockSecCA) ## 许可证 本作品仅用于教育和研究目的发布。
标签:C2, CPG, CPGQL, Joern, LLM, OWASP A06, SAST, Unmanaged PE, 不受限制的文件上传, 中间件覆盖, 人工智能安全, 仅客户端验证, 代码属性图, 代码理解, 代码语义理解, 信任边界违规, 加密使用, 合规性, 后端开发, 图查询, 工作流破坏, 弱加密, 无文件读取分析, 架构安全, 查询语言, 盲注攻击, 结构化查询, 自动化安全, 认证缺失, 设计模式, 设计级安全分析, 设计缺陷, 路由发现, 速率限制缺失, 隔离不足, 零误报, 静态应用安全测试, 验证模式