mcpField
S
static-analysis

static-analysis

github.com/gmh5225安全89062 次安装4 周前更新
代码仓库

关于 static-analysis

面向安全研究人员和 LLVM 用户的静态程序分析 skill,涵盖数据流、指针分析、污点追踪与程序切片,并介绍用于漏洞检测和代码质量评估的分析工具。

主要功能

  1. 01数据流与控制流分析
  2. 02指针与别名分析
  3. 03污点及信息流追踪
  4. 04程序切片与依赖图
  5. 05LLVM 分析 API 与框架

适用场景

  1. 01追踪定义到使用的值流
  2. 02查找可能的指针别名
  3. 03检测污点数据流向不安全接收点
  4. 04检查代码中的安全漏洞

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/gmh5225/awesome-llvm-security --skill static-analysis

安装后在 Claude Code 中输入/static-analysis确认已加载。

详细介绍

静态分析技能

本技能介绍使用 LLVM 基础设施进行静态程序分析的技术,适用于安全研究、漏洞检测和代码质量评估。

分析类别

数据流分析
  • 正向分析:跟踪值从定义到使用的流向
  • 反向分析:从使用处追溯到定义处
  • 可能/必然分析:保守近似与精确近似
控制流分析
  • 支配树:识别代码支配关系
  • 后支配树:分析控制依赖关系
  • 循环分析:检测并描述循环
指针分析
  • 流不敏感:Andersen 和 Steensgaard 算法
  • 流敏感:跟踪程序各个位置的指针值
  • 上下文敏感:区分调用上下文

LLVM 分析基础设施

使用内置分析
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/DominatorTree.h"

void analyze(llvm::Function& F, llvm::FunctionAnalysisManager& FAM) {
    // Get dominator tree
    auto& DT = FAM.getResult<llvm::DominatorTreeAnalysis>(F);
    
    // Get loop info
    auto& LI = FAM.getResult<llvm::LoopAnalysis>(F);
    
    // Get alias analysis
    auto& AA = FAM.getResult<llvm::AAManager>(F);
    
    // Check if two pointers may alias
    llvm::AliasResult AR = AA.alias(Ptr1, Ptr2);
}
实现自定义分析
class TaintAnalysis {
    std::set<llvm::Value*> taintedValues;
    
public:
    void markTainted(llvm::Value* V) {
        taintedValues.insert(V);
    }
    
    bool isTainted(llvm::Value* V) {
        return taintedValues.count(V) > 0;
    }
    
    void propagate(llvm::Instruction* I) {
        // Propagate taint through operations
        for (auto& Op : I->operands()) {
            if (isTainted(Op)) {
                markTainted(I);
                break;
            }
        }
    }
};

污点分析

源-汇模型
// Define taint sources (user input, network, files)
bool isTaintSource(llvm::CallInst* CI) {
    llvm::Function* F = CI->getCalledFunction();
    if (!F) return false;
    
    static const std::set<std::string> sources = {
        "read", "recv", "fread", "getenv", "gets", "scanf"
    };
    return sources.count(F->getName().str()) > 0;
}

// Define sensitive sinks (SQL queries, system calls, format strings)
bool isSensitiveSink(llvm::CallInst* CI) {
    llvm::Function* F = CI->getCalledFunction();
    if (!F) return false;
    
    static const std::set<std::string> sinks = {
        "system", "exec", "printf", "strcpy", "memcpy", "sql_query"
    };
    return sinks.count(F->getName().str()) > 0;
}
跨过程分析
  • 跟踪跨函数边界的污点
  • 通过调用图分析处理间接调用
  • 通过上下文敏感性提高精度

指针分析框架

使用 Andersen 分析
#include "llvm/Analysis/CFLAndersAliasAnalysis.h"

// Check may-alias relationship
void checkAlias(llvm::AAResults& AA, llvm::Value* P1, llvm::Value* P2) {
    switch (AA.alias(P1, P2)) {
        case llvm::AliasResult::NoAlias:
            // Definitely don't alias
            break;
        case llvm::AliasResult::MayAlias:
            // Might alias
            break;
        case llvm::AliasResult::MustAlias:
            // Always alias
            break;
    }
}
指向集合
// Track what each pointer may point to
class PointsToAnalysis {
    std::map<llvm::Value*, std::set<llvm::Value*>> pointsTo;
    
public:
    void addPointsTo(llvm::Value* ptr, llvm::Value* target) {
        pointsTo[ptr].insert(target);
    }
    
    const std::set<llvm::Value*>& getPointsTo(llvm::Value* ptr) {
        return pointsTo[ptr];
    }
};

依赖分析

数据依赖图(DDG)
#include "llvm/Analysis/DDG.h"

void buildDDG(llvm::Function& F, llvm::FunctionAnalysisManager& FAM) {
    auto& LI = FAM.getResult<llvm::LoopAnalysis>(F);
    
    for (auto* L : LI) {
        llvm::DataDependenceGraph DDG(*L, FAM.getResult<llvm::AAManager>(F));
        
        for (auto& Node : DDG) {
            // Analyze data dependencies in loop
        }
    }
}
程序切片
  • 正向切片:查找受某个变量影响的所有语句
  • 反向切片:查找影响某个变量的所有语句
  • 用于调试、测试和安全分析

主要静态分析工具

综合框架
  • Phasar:适用于工业级场景的 LLVM 分析框架
  • SVF:可扩展的指针分析和值流分析框架
  • Joern:支持图查询的代码分析平台
  • CodeChecker:基于 Clang 的静态分析集成工具
专用工具
  • clam:抽象解释框架
  • dg:依赖图构建工具
  • Semgrep:基于模式的多语言分析工具

安全分析应用

漏洞检测
// Buffer overflow detection
void checkBufferAccess(llvm::GetElementPtrInst* GEP) {
    // Get array size if available
    llvm::Type* SourceType = GEP->getSourceElementType();
    if (auto* AT = llvm::dyn_cast<llvm::ArrayType>(SourceType)) {
        uint64_t arraySize = AT->getNumElements();
        
        // Check if index might exceed bounds
        llvm::Value* Index = GEP->getOperand(2);
        // Perform range analysis on index
    }
}
释放后使用检测
  • 跟踪分配和释放位置
  • 为指针构建到达定义
  • 标记释放调用后的使用
信息流
  • 跟踪敏感数据(密码、密钥、个人身份信息)
  • 检测数据是否泄漏到日志、网络或不可信汇
  • 实现去分类规则

最佳实践

  1. 健全性与完备性:了解其中的权衡
  2. 可扩展性:使用摘要处理大型代码库
  3. 路径敏感性:平衡精度与性能
  4. 误报管理:优先处理可采取行动的发现
  5. 增量分析:缓存结果以加快重新分析

与 IDE 集成

Clangd/LSP 集成
  • 提供实时分析反馈
  • 集成到编辑器诊断中
  • 支持快速修复建议
CI/CD 集成
  • 在拉取请求中运行分析
  • 对严重问题阻止合并
  • 跟踪分析趋势随时间的变化

资源

如需完整的工具列表和研究参考资料,请参阅 README.md 中的「静态分析」和「Clang 插件」部分。

获取详细信息

需要详细且最新的资源链接、工具列表或项目参考资料时,请从以下位置获取最新数据:

https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md

此 README 包含精心整理的完整列表:

  • 静态分析框架(「静态分析」部分)
  • 指针分析和污点跟踪工具
  • 程序验证和缺陷查找工具
  • 基于 Clang 的代码分析插件

评论

支持 Markdown