代码分析之污点分析 - 教程

news/2025/9/18 11:42:36/文章来源:https://www.cnblogs.com/lxjshuju/p/19098430

开篇

在之前的《webshell检测方式深度剖析》的系列文章中,在讲解语法语义分析的时候,曾经介绍过污点分析。只是那时更多的是从实践角度进行展开的,理论和系统性不够。因此用这篇文章来重新介绍下污点分析,更全面地认识下这项被广泛应用的漏洞挖掘科技。

否会影响某些关键的脚本运行,挖掘程序漏洞。就是容易来说,污点分析(taint analysis)是一种跟踪并分析污点信息在程序中流动的技巧。通过将不可信的外部输入数据标记为污点数据(tainted data),然后跟踪和污点数据相关的信息的流向,进而分析这些信息
在这里插入图片描述

污点分析根据其实现机制可分为静态污点分析和动态污点分析,这篇文章我们首要介绍静态污点分析。

基本概念

在深入讲解之前,我们先来熟悉几个污点分析中的概念。
在这里插入图片描述

污点

污点或者污点信息在字面上的意思是受到污染的信息或者“脏”的信息。

在代码分析中,常常将来自程序之外的、并且进入程序内部的信息当做污点信息。

根据分析的需要,程序内部使用的数据也可作为污点信息,比如在分析程序是否会将用户的隐私信息泄露到程序外时,可以将从数据库中读取的用户的隐私信息作为污点信息。

Source点

在污点分析中,Source(污点源)​​ 是指程序中那些引入不可信数据或敏感数据的代码位置。​

Source点的核心作用是为污点分析标记分析的起点。只有准确识别了Source,后续的跟踪和分析才有意义。Source点识别的准确性直接影响到分析的精度。

Source点的具体形式会根据编程语言和应用场景有所不同,以下是一些典型例子:

Sink点

作为污点分析的终点。就是Sink点是指软件中那些直接产生安全敏感操作或可能导致隐私内容泄露的代码位置,核心作用

容易来说,倘若被标记为“污点”的数据最终流入了Sink点,就很可能意味着存在安全漏洞。

例如,用户输入(Source)未经任何过滤直接拼接进 SQL 查询语句(Sink),就可能存在 SQL 注入漏洞。如果直接传递给执行系统命令的函数(Sink),则可能产生命令注入漏洞。

Sanitizer点

连接Source和Sink的关键环节,它代表了经过资料清洗、加密或验证等手段使污点数据不再对系统安全构成威胁的代码位置。就是Sanitizer(无害化处理点)​

Sanitizer的核心作用是对污点数据的无害化处理,比如:

污点信息传播规则

污点分析技术的核心,它定义了被标记的“污点”数据在程序执行过程中如何流动和扩散。就是污点信息的传播规则

在应用传播规则进行污点信息的传播时,传播数据流又分为两种,分别为:

  • 通过数据依赖传播的显式数据流,比如对于语句“z = x + y”,如果x是被污染的,那么结果z也是被污染的;
  • 通过控制依赖传播的隐式数据流,比如对于语句“if (x>0) {y=1}else{y=0}”,假如x是被污染的,那么y也应该是被污染的。

启用污点分析技能挖掘漏洞

采用静态污点分析技术挖掘程序漏洞的系统的工作原理如下图所示:
在这里插入图片描述

基于污点分析技巧的漏洞挖掘可以通过两种方法实现:

基于数据流的污点分析

在基于数据流的污点分析中,为追求分析精度,常常需要一些辅助分析技术的支持,比如别名分析、变量取值分析和指向分析等等。

通过可以有针对性的对程序代码执行辅助分析,而不用去考虑和污点分析不相关的代码。就是这些辅助分析通常都具有数据流分析的特点,因此能够和污点分析同时进行。这样做的好处

在基于数据流的污点分析的过程中,既可以沿着程序执行路径的方向分析污点信息的流向,检查Source点处程序接收的污点信息是否会影响到Sink处的敏感操作。也可以从检查Sink点开始逆向分析,检查敏感操作是否会受到污点信息的影响。

在实际的分析中,常常使用正向的污点分析,这主要是由于一方面正向的分析和信息流的方向是一致的,分析过程更自然,另一方面,辅助分析常常是和程序执行的方向一致的,正向污点分析可以和辅助分析同时进行。

基于数据流的污点分析核心包含下面几方面的内容。

过程内分析

在过程(函数或方法)内的分析中,需要按照一定的顺序分析过程内的每一条语句,进而分析污点信息的流向。
在考虑怎样分析程序语句之前,先要确定怎样记录污点信息。

(一)记录污点信息

在静态分析层面,变量的污染情况为主要关注对象。为记录污点信息,通常为变量添加一个污染标签。

通过最轻松的污染标签是一个布尔型的变量,它仅仅能表示变量是否是被污染的。例如,能够规定布尔值的取值为真时,变量是被污染的,取值为假时,变量未受污染。

也可以运用相对复杂的污染标签,这样不仅能够记录变量是否是被污染的,还行记录变量的污染信息来自哪些Source点,甚至Source点接收外部数据的哪个部分。比如使用一个整型变量记录污染信息。当变量的取值为0时,变量未受到污染,而变量取值为其他整数时,变量是污染的,并且不同的整数记录不同的Source点。

也可以不采用污染标签。在这种情况下,通过使用对变量进行跟踪的方式达到分析污点信息流向的目的。比如下面的代码:
在这里插入图片描述

变量str的内容来自于外部输入,我们认为它是被污染的,直接对str进行跟踪。然后变量sql的的取值受到str的影响,也被污染,此时选择先对sql变量进行跟踪,然后再对str进行跟踪。第三行str变量被赋值为空字符串,认为其被净化,取消对str的跟踪,继续跟踪上一个污染变量。
在这里插入图片描述

(二)软件语句的分析

在污点分析过程中,不同类型语句的污点传播规则是不同的,我们重点要求关注赋值语句、分支控制语句和过程调用语句。

1.赋值语句

不同类型的赋值语句也需要采用不同的传播规则:

赋值语句类型污点传播规则
a = b设置a的标签为b的标签
a = b + ca的标签取b和c标签的并集
a[i] = b在能确定i的取值或取值范围的情况下,将数组a中对应元素的标签设置为b的标签。否则将a中所有元素的标签设置为b的标签
a.f1 = b将对象a的f1属性的标签设置为b的污染标签
a = c(b, …)根据c函数的逻辑来判断是否将a的标签设置为b的标签

2.分支控制语句

在分析分支控制转移语句时,需要重点关注的是这类语句中的路径条件是否包含对污点材料的限制。

了使分析精确,如果得出路径条件的限制是足够的,那么可以将相应的变量标记为未污染的。

比如对于下面的if语句:
在这里插入图片描述

如果在检测的过程中,数组变量a被标记为污染的,那么经过这样的对数组变量取值的限制,在这个if语句块内,允许认为a[i]元素是安全的。

对于循环语句,通常规定循环变量的取值范围不能来自输入数据,或者说循环变量的取值范围不能受到输入的控制。

3.过程调用语句

对于过程调用语句的分析或处理,可以使用过程间的分析或者直接应用过程摘要进行分析。

过程摘要核心描述该过程怎样改变与该过程相关的变量的污染状态,以及对哪些变量的污染状态进行检查。这些变量可以是过程使用的参数、参数的字段、过程的返回值或过程内使用的全局变量等等。

比如对于代码a = c(b, …),倘若通过过程间分析,发现c函数对于参数b存在净化行为,那么c函数的返回值就是无污染的,则需要认为a变量也是无污染的。

在实际过程间分析中,可以对已经分析过的过程构建过程摘要。例如,在分析函数c之后,其过程摘要可描述为:函数c接受参数,但是内部会对参数进行净化,并且它的返回值是未受污染的。

若是再次得分析调用函数c的语句,那么就可以应用上述的摘要确定调用函数c对变量的污染情况的影响。

(三)流敏感分析、上下文敏感分析与域敏感分析

流敏感(flow sensitive)的分析在其分析过程中考虑程序的控制流。例如,给定一个程序片段“p=&a;q=p;p=&b”,流敏感的指向分析允许判断q不指向b。

相反地,在非流敏感的(flow insensitive)分析中,忽略了程序点之间的控制流信息,因此要比流敏感分析的精度低,但是具有更高的效率。以上述代码片段为例,流不敏感的分析包括“q可能指向a或b”,伴随着分析精度的降低,计算复杂性也随之降低。

上下文敏感(context sensitive)的分析是指程序的上下文影响程序的过程间分析。比如,当过程P在调用点c1被调用时,对过程P的分析结果将会仅仅返回给c1。相反地,一个非上下文敏感的分析,会将P的分析结果返回给所有P的调用点。

域敏感(field sensitive)的分析方法能够区分处理同一复杂数据结构的不同域(即能够区分形如“p.a”和“p.b”的不同域成员引用),非域敏感(field insensitive)的分析方法则将复杂数据结构作为统一整体进行近似处理。

过程间分析

过程间分析通常用于关注过程调用对当前上下文的影响,以及构建过程摘要,并利用已有的摘要进行过程内分析。

行在污点传播过程中遇到过程调用时构建过程摘要,也许可在分析之前通过过程调用图来构建所有过程的完整摘要。

基于依赖关系的污点分析

在基于依赖关系的污点分析中,将首先利用程序的中间表示、控制流图和调用图构造程序完整的或者局部的程序的依赖关系。

在分析程序依赖关系之后,再根据污点分析规则,检查Sink点处敏感管理是否依赖于Source点。
在这里插入图片描述

分析程序依赖关系过程可以看做是构建程序依赖图的过程。应用依赖图是一个有向图,节点是程序语句,边表示程序语句之间的依赖关系。

程序依赖图的有向边包括两种类型:

比如对于下面的代码:
在这里插入图片描述

对应的依赖图如下:
在这里插入图片描述

对于一定规模的代码,常常无法准确并且完整地计算软件的依赖关系。

一方面存储和计算大量的依赖关系需要较大的存储空间和计算时间,在空间和时间的消耗上不能满足实际的分析应该。

另一方面,对于很多情况,静态分析不能准确地分析出程序中的一些依赖关系,其本质原因是静态分析的不可判定性。因此,应该按需地构建程序依赖关系,并且优先考虑和污点信息相关的程序代码。

通过在污点分析检测程序漏洞的实际应用中,通常只关心程序上的信息依赖关系,因为虽然基于控制依赖的隐式信息流能够有效地用于传播污点信息,但是和隐式污点信息流相关的工具漏洞常常是相对麻烦的,并且很难被利用。

在构建程序依赖关系时,常常需要用到指向分析的结果,以分析程序语句和内存中数据的依赖关系。例如,对于语句"str=obj.field;",假如简便地认为该语句依赖于对变量obj的操控,那么分析精度将不能保证,因为很多和obj相关的管理,可能和对它的实例域field的操作无关,并且obj可能存在别名。

针对上述语句,可能无法通过分析少量的代码得到变量str的取值来自哪条赋值语句,这时,指向分析的结果能够给出变量str可能指向的内容,如果在内存中也对其中的变量进行污染标记,将利用这样的结果分析变量st是否是污染的,进而减少分析信息依赖关系的复杂过程。

总结

污点分析是非常有效的漏洞分析方法,其应用范围也非常广泛。

然而,几乎所有的污点分析技术都只关注数据依赖上的显式信息流数据传播形式,而未能覆盖控制依赖上的隐式信息流数据传播形式。

但利用隐式信息流传播数据已经在理论和实践中都被证明为是一种有效的信息传递方式,这值得我们加以特别关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式 7章

软件设计7大原则 开闭原则:是原则,在设计软件时保持扩展的开放性和修改的封闭性 里式替换原则:要求在继承时不要破坏父类的实现 单一职责原则:要求类的功能要单一 接口隔离原则:要求接口的设计要精简 依赖倒置原则…

磁盘存储简介-轮子

https://blog.csdn.net/user2025/article/details/142364353

前端mjs和js文件区别,mjs和cjs区别

前端mjs和js文件区别,mjs和cjs区别.js 文件和 .mjs 文件之间的主要区别在于模块系统的使用: 1. 模块类型.js 文件:默认使用 CommonJS 模块系统(尤其在 Node.js 环境中)。 可以使用 require() 导入模块和 module.e…

洛谷 P1967 [NOIP 2013 提高组] 货车运输 题解

洛谷 P1967 [NOIP 2013 提高组] 货车运输 题解原题链接:货车运输 kruskal重构树+LCA做法,树剖不想写 很容易发现原图跑最短路可以解,但是复杂度难以承受,所以考虑如何简化该图。 发现原图边权维护的应该是(u,v)…

详细介绍:【2026计算机毕业设计】基于Springboot的婚车租赁系统

详细介绍:【2026计算机毕业设计】基于Springboot的婚车租赁系统2025-09-18 11:33 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

【每日一问】示波器探头校准技巧和校准原理是什么?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

审美积累 | 这样的暗色系音频播放界面怎么做?

审美积累 | 这样的暗色系音频播放界面怎么做? 收集了一些播放页,有需要的伙伴后台私信si,发高清原图一起学习~ 1. 整体视觉风格深色模式优先:黑色或深灰背景,能凸显封面、模块卡片、图标的亮色部分,视觉上更聚焦…

cherry-pick 合并曾今某一次提交

确认当前分支 git checkout test 找到要合并提交的哈希值 git log --oneline 太长的话点击q 退出 切换到我们要合并的分支 git checkout dev 使用 cherry-pick 应用指定提交 git cherry-pick <提交哈希1> 推送到…

向量数据库 FAISS、LanceDB 和 Milvus

FAISS (Facebook AI Similarity Search)本质:一个库 (Library),而不是一个数据库。定位:由 Meta (Facebook) AI 研发的、专注于高效相似性搜索的 C++/Python 库。它的核心使命只有一件事:在海量向量中快速找到最相…

Fast IO 模板

放在 using namespace std; 后面即可。 namespace fast_IO { #define FASTIO #define IOSIZE 100000char ibuf[IOSIZE], obuf[IOSIZE];char *p1 = ibuf, *p2 = ibuf, *p3 = obuf; #ifdef ONLINE_JUDGE #define getchar…

kylin V11安装mysql8.4.5(glibc.2.28版本)

环境:OS:kylin V11mysql:8.4.5 glibc2.28(建议不要安装glibc.2.17版本) 查看系统glibc版本[root@localhost soft]# ldd --versionldd (GNU libc) 2.38Copyright (C) 2023 Free Software Foundation, Inc.This is free …

iOS 上架 App 流程全解析 苹果应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验

本文系统解析 iOS 上架 app 流程,涵盖苹果应用从开发者账号注册、证书准备、uni-app 打包、ipa 上传、TestFlight 测试,到 App Store 审核与发布的完整步骤,结合多工具协作,总结高效实用的上架经验。对开发者来说,…

P6801 花式围栏

题目传送门数学、计数类。题意 在 \(n\) 个同一底线上宽 \(w\),高 \(h\),给定的相邻矩形中,数出在方格上的任意形状的小矩形的个数。 \(1\leq n\leq 10^5,1\leq w,h \leq 10^9\) 题解 我们规定竖直方向上为高,水平…

ms sql dml 操作

ms sql dml 操作 --建表 select * into tablenew from tableold

黑白染色方法

主要有 \(3\) 种方法:DFS / BFS / DSUDFS直接遍历整张图染色,判断是否产生冲突 init(){for(int i=1;i<=n;i++) col[i]=-1; } bool dfs(int u,int c){col[u]=c;for(auto v:e[u]){if(col[v]==-1) return dfs(v,c^1)…

ipadװwindowsϵͳshell

如何在iPad上安装Windows系统Shell:详解与实践指南 随着科技的不断进步,用户对于设备功能的需求也在不断增加。iPad作为一款便携式的智能平板电脑,其强大的硬件性能和优秀的生态系统赢得了广大用户的喜爱。然而,对…

input 设置只输入数字或其他自定义字符 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

cpu的各种寄存器及其功能

cpu的功能 指令控制 完成取指令,分析指令,执行指令的操作 操作控制 产生完成一条指令所需要的操作信号,从而控制这些部件按指令的要求正确执行 时间控制 严格控制各种操作信号出现的时间,持续时间以及出现的时间顺…

学python的第6天

学python的第6天异常处理 在pycharm中输入error查看所有异常。 1.什么是异常 1.1语法错误 1.2逻辑错误 异常的种类 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一…

如何关闭电视的ACR功能及其对隐私保护的重大意义

本文详细解析智能电视自动内容识别(ACR)技术的工作原理与隐私风险,提供三星、LG、索尼、海信、TCL五大品牌电视的ACR关闭步骤,帮助用户有效保护个人观看数据免受商业监控。如何关闭电视的ACR功能(及其重大影响) 智…