关于 static-analysis
面向安全研究人员和 LLVM 用户的静态程序分析 skill,涵盖数据流、指针分析、污点追踪与程序切片,并介绍用于漏洞检测和代码质量评估的分析工具。
主要功能
- 01数据流与控制流分析
- 02指针与别名分析
- 03污点及信息流追踪
- 04程序切片与依赖图
- 05LLVM 分析 API 与框架
适用场景
- 01追踪定义到使用的值流
- 02查找可能的指针别名
- 03检测污点数据流向不安全接收点
- 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
}
}
释放后使用检测
- 跟踪分配和释放位置
- 为指针构建到达定义
- 标记释放调用后的使用
信息流
- 跟踪敏感数据(密码、密钥、个人身份信息)
- 检测数据是否泄漏到日志、网络或不可信汇
- 实现去分类规则
最佳实践
- 健全性与完备性:了解其中的权衡
- 可扩展性:使用摘要处理大型代码库
- 路径敏感性:平衡精度与性能
- 误报管理:优先处理可采取行动的发现
- 增量分析:缓存结果以加快重新分析
与 IDE 集成
Clangd/LSP 集成
- 提供实时分析反馈
- 集成到编辑器诊断中
- 支持快速修复建议
CI/CD 集成
- 在拉取请求中运行分析
- 对严重问题阻止合并
- 跟踪分析趋势随时间的变化
资源
如需完整的工具列表和研究参考资料,请参阅 README.md 中的「静态分析」和「Clang 插件」部分。
获取详细信息
需要详细且最新的资源链接、工具列表或项目参考资料时,请从以下位置获取最新数据:
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
此 README 包含精心整理的完整列表:
- 静态分析框架(「静态分析」部分)
- 指针分析和污点跟踪工具
- 程序验证和缺陷查找工具
- 基于 Clang 的代码分析插件
评论
支持 Markdown