diff --git a/src/aise_code_check.md b/src/aise_code_check.md index fd66749..0d0a043 100644 --- a/src/aise_code_check.md +++ b/src/aise_code_check.md @@ -4,7 +4,96 @@ 以及在使用聊天接口时如何制定恰当的提示指令。警惕AI生成代码可能带来的代码质量下滑([GitClear研究](https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality)) ,监控代码质量变化并做好保障措施。 -## 示例:Aroma +## 基础:理解 SAST + +主要用途: + +- 自动化源代码扫描,以预防漏洞并在开发管道早期捕获它们。 +- 扩展漏洞检测。通过变体分析技术,SAST工具可以在代码库的不同部分检测到已知漏洞的变体,从而发现新的漏洞。 +- 协助手动代码审查。在CodeQL中,GitHub的SAST工具,你的代码被视为数据进行分析。 + +![SAST Tool](images/sast-tool-diagram.png) + +阅读:[The architecture of SAST tools: An explainer for developers](https://github.blog/2024-02-12-the-architecture-of-sast-tools-an-explainer-for-developers/) + +### 步骤示例 + +基于提供的详细描述,以下是高级 SAST(静态应用安全测试)工具(如 CodeQL)在扫描 SQL 应用程序中查找漏洞(特别是 SQL 注入攻击)时采取的五个主要步骤: + +1. **对源代码进行词法分析:**。SAST 工具首先执行词法分析,将源代码分解为标记(tokens)。标记代表编程语言语法的标准化元素,这有助于后续分析。这一步骤使工具能够专注于有意义的代码组成部分,而忽略无关的字符。 +2. **将源代码抽象为AST(抽象语法树):** + 。在完成词法分析后,工具从源代码构建抽象语法树(AST)。AST 将代码组织成层次结构,展示代码各部分之间的关系,比如哪些语句属于哪些函数。这种抽象有助于理解代码的结构和含义。 +3. **进行语义分析:**。借助 AST,进行语义分析以解释代码的预期行为和逻辑。语义分析使得SAST工具能够专注于代码的语义,而不是注释或格式。这一步骤对于识别由于不正确或不安全的编码实践导致的漏洞至关重要。 +4. **进行污点分析:** + 。污点分析用于跟踪用户控制的输入数据在整个代码库中的流动路径。它识别输入数据的来源(数据进入系统的位置)、净化器(确保输入安全的函数)和污点(如果用未经净化的输入数据调用可能会存在漏洞的函数)。通过追踪输入数据从源头到污点的流动,工具评估是否应用了适当的验证和净化。如果未经净化的输入达到污点,工具会发出潜在的安全漏洞警报。 +5. **生成安全警报:** + 。基于语义分析和污点分析的结果,SAST 工具为在代码中检测到的潜在漏洞生成安全警报。这些警报优先考虑未经净化的输入数据可能导致安全问题的路径,例如SQL注入漏洞。警报为开发团队提供可操作的信息,使他们能够有效地优先处理和解决安全问题。 + +这些步骤说明了 SAST 工具(如 CodeQL)如何利用先进的分析技术,在开发生命周期早期检测到漏洞,从而增强代码安全性。 + +## 业内案例:基于查询语言 + +### GitHub CodeQL + +文档:https://codeql.github.com/ + +```codeql +import TaintTracking::Global + +from PathNode source, PathNode sink + +where flowPath(source, sink) + +select sink.getNode().(UnsafeDeserializationSink).getMethodAccess(), source, sink, + "Unsafe deserialization of $@.", source.getNode(), "user input" +``` + +[CodeQL 查询过程](https://www.microsoft.com/en-us/security/blog/2021/02/25/microsoft-open-sources-codeql-queries-used-to-hunt-for-solorigate-activity/) + +![](images/codeql-pipeline.png) + +CodeQL 是一种强大的语义代码分析引擎,现在已经成为 GitHub 的一部分。它的处理流程主要分为两个阶段,特别适用于大规模源代码的分析: + +1. **数据库构建阶段:** + - CodeQL 在源代码编译成二进制文件时,构建一个数据库来捕获编译代码的语义模型。 + - 对于解释性语言,由于没有编译器,CodeQL 会解析源代码并构建自己的抽象语法树模型。 +2. **查询数据库:** + - 构建好的数据库可以反复查询,使用 CodeQL 语言进行分析。这种语言专门设计用于从数据库中选择复杂的代码条件,能够详细分析代码模式和结构。 +3. **语义分析:** + - CodeQL 允许在集中的基础设施中进行语义分析,跨多个代码库进行查询。这种集中分析能力使得 Microsoft 能够同时在数千个代码库中进行查询。 + - 语义分析涉及查找可能跨越不同代码部分(如程序集、库或模块)的模式,这些部分是基于构建的具体代码的。 + +相关文章: + +- [CodeQL zero to hero part 1: The fundamentals of static analysis for vulnerability research](https://github.blog/2023-03-31-codeql-zero-to-hero-part-1-the-fundamentals-of-static-analysis-for-vulnerability-research/) +- [CodeQL zero to hero part 2: Getting started with CodeQL](https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/) +- [CodeQL zero to hero part 3: Security research with CodeQL](https://github.blog/2024-04-29-codeql-zero-to-hero-part-3-security-research-with-codeql/) + +### Synk QL + +https://docs.snyk.io/scan-using-snyk/snyk-code/snyk-code-custom-rules/create-query + +AST + +```bnf + ::= | ' ' + ::= | | |