当前位置: 首页 > news >正文

Taint Bug (污点漏洞):

什么是污点漏洞?

脏数据,没净化(污点源):

        用户输入、直接复制的链接、手机APP传入的参数(我觉得恶意广告跳转就是用了这个),这些数据没有经过检查,比如我要float类型的输入,但给的是int类型输入,没经过数据转换,会导致bug;再比如,我要一个四位数据,但输入是一个八位数据,那要是直接把多的四位丢掉,也会报错。总之,输入数据没经过检查,不一定符合要求,可能导致bug

敏感操作(污点汇):

        比如,用输入的数字当数组的索引,可能导致索引和数组元素个数不匹配,索引数字大于元素个数;再比如进行算数运算的时候发生溢出

举例:

1、根据用户输入的索引,打印数组里的内容

int arr[5] = {1,2,3,4,5};
int index;
scanf("%d", &index); // 用户输入index(污点源)
printf("%d", arr[index]); // 直接用index访问数组(污点汇)

输入的&index不是[0,4]之间的整数,就会报错。

用户的输入是没经过检查的脏数据

要经过净化,确保在合规范围内才可以

改正:

int arr[5] = {1,2,3,4,5};
int index;
scanf("%d", &index); // 接收用户输入(污点源)// 关键修复:检查index是否合法(给数据“洗澡”)
if (index < 0 || index >= 5) { printf("输入错误!索引必须在0~4之间"); return 1; // 直接退出,不执行后续危险操作
}printf("%d", arr[index]); // 确认安全后,再访问数组(污点汇)

更通用的“净化逻辑”:

实际开发中,还可以根据场景增加更严格的检查,比如:

限制输入类型:确保用户输入的是数字(而非字母或符号)。

动态获取数组长度:用sizeof(arr)/sizeof(arr[0])代替硬编码的5,避免数组大小变化时漏改检查条件。

// 更健壮的版本
int arr[5] = {1,2,3,4,5};
int index, arr_size = sizeof(arr)/sizeof(arr[0]); // 动态获取数组长度
if (scanf("%d", &index) != 1) { // 检查输入是否为有效数字printf("输入错误!请输入整数");return 1;
}
if (index < 0 || index >= arr_size) { // 用动态长度判断printf("输入错误!索引必须在0~%d之间", arr_size-1);return 1;
}
printf("%d", arr[index]);

2、给num设一个天花板

int clamp_num(int config, int num ){  // 函数:限制数字num的最大值if (config && num > ARR_SIZE)      // 如果“开关打开”且“num超过天花板”num = ARR_SIZE;                  // 就把num强行改成“天花板”的值return num ;                       // 返回限制后的num
}

config是开关,num必须满足num <= ARR_SIZE

3、用户输入直接复制到固定大小缓冲区,未检查长度

#include <stdio.h>
#include <string.h>void vulnerable_function() {char buffer[10];  // 固定大小缓冲区(10字节)char user_input[100];  // 污点变量:存储用户输入(不可信源)printf("请输入姓名:");scanf("%s", user_input);  // 1. 污点源:用户输入(未限制长度)// 2. 未净化:直接将污点变量复制到缓冲区,未检查长度strcpy(buffer, user_input);  // 危险操作:无长度限制的复制printf("欢迎:%s\n", buffer);
}int main() {vulnerable_function();return 0;
}

修复:

// 安全版本:限制输入长度,避免溢出
void safe_function() {char buffer[10];char user_input[100];printf("请输入姓名:");scanf("%9s", user_input);  // 限制输入长度为9字节(留1字节给字符串结束符'\0')strncpy(buffer, user_input, sizeof(buffer)-1);  // 用 strncpy 限制复制长度buffer[sizeof(buffer)-1] = '\0';  // 确保字符串结束符printf("欢迎:%s\n", buffer);
}

怎么判断是不是污点变量?

1、用户输入

// 例:用户输入的字符串(污点变量)
char user_input[100];
scanf("%s", user_input);  // 通过 scanf 接收用户输入 → user_input 为污点变量

2、外部系统输入

// 例:从网络读取的数据(污点变量)
char* network_data = recv_from_socket(sock);  // 网络接收的数据 → network_data 为污点变量

3、且没经过净化

char user_input[100];
scanf("%s", user_input);  // 污点源:用户输入
char* data = user_input;  // 直接赋值,未净化 → data 仍为污点变量

净化后——不是:(AI给的)

char user_input[100];
scanf("%s", user_input);  // 污点源:用户输入// 净化处理:验证输入是否为纯数字(仅保留安全字符)
if (is_all_digits(user_input)) {  // 假设 is_all_digits 检查字符串是否仅含 0-9int num = atoi(user_input);  // 转换为整数(净化后)→ num 不再是污点变量
}

http://www.dtcms.com/a/294330.html

相关文章:

  • 【bug】websocket协议不兼容导致的一个奇怪问题
  • 垃圾回收介绍
  • jenkins 入门指南:从安装到启动的完整教程
  • Selenium是解决了什么问题的技术?
  • web安全 | docker复杂环境下的内网打点
  • Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南
  • VRRP的概念及应用场景
  • 彩色转灰度的核心逻辑:三种经典方法及原理对比
  • 优雅!通过编程方式重启 Spring Boot 应用的 3 种方案
  • Apache PDFBox深入实践
  • python学智能算法(二十九)|SVM-拉格朗日函数求解中-KKT条件
  • PHP语法高级篇(五):回调函数与异常处理
  • Ansible 变量指南:声明、优先级、作用域与最佳实践(一)
  • Jquery、Vue 、Ajax、axios、Fetch区别
  • Ansible在配置管理中的应用
  • ffmpeg rtsp 丢包处理
  • SSH公钥认证连接过程
  • Linux 进程与服务管理~进程基础、进程查看、进程控制、服务管理、开机启动​​
  • 纯CPU场景下C++的分布式模型训练框架设计思路
  • 2025.7.20 文献阅读-基于深度神经网络的半变异函数在 高程数据普通克里格插值中的应用
  • go语言数据结构与排序算法
  • 【C++】C++ 的入门知识2
  • Android 持久化存储原理与使用解析
  • MATLAB | 绘图复刻(二十二)| 带树状图的三角热图合集
  • 个性化网页计数器
  • C 语言介绍
  • 【数据结构】二叉树的链式结构--用C语言实现
  • 嵌入式linux下的NES游戏显示效果优化方案:infoNES显示效果优化
  • 我用EV-21569-SOM评估来开发ADSP-21569(十三)-SigmaStudio Plus做开发(4)
  • Web前端开发:JavaScript遍历方法详解与对比