seed-labs 竞态条件漏洞

2024-06-13 22:18
文章标签 条件 漏洞 labs seed 竞态

本文主要是介绍seed-labs 竞态条件漏洞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

软件安全-竞态条件漏洞

  • 竞态条件漏洞
    • 概述
    • 一个常见的漏洞
      • 实验
    • 防御手段
      • 原子化
      • 重复检查和使用
      • 粘滞符号链接保护
      • 最小权限原则
    • problems

竞态条件漏洞

概述

竞态条件是指一个系统或程序的输出结果取决于其他不可控制事件执行的时间顺序

一个常见的漏洞

当一个程序的两个并发线程同时访问共享资源时,如果执行时间和顺序不同,会产生影响,这时就称作发生了竞态条件
检查时间和使用时间。如果条件检查和实际资源使用之间存在一小段时间,如果这段时间内发生变化,则建立在检查结果上的 使用的授权就有安全问题,这就是检查于使用时间差漏洞。

实验

#include <unistd.h>
#include <stdio.h>
#include <string.h>int main()
{char *fn = "/tmp/XYZ";char buffer[60];FILE *fp;scanf("%50s", buffer);if (!access(fn, W_OK)){fp = fopen(fn, "a+");fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);}else printf("No permission \n");return 0;
}
ubuntu 14/16: sudo sysctl -w fs.protected_symlinks=0
./attack_process

防御手段

1)消除时间差
2)阻止其他人在这个时间内做事情
3)增大攻击者的难度
4)在攻击者胜利后,阻止他造成破坏

原子化

如果是系统本身可以通过上锁来实现原子化,对于文件,在检查和使用之间把目标文件锁上,这样其他进程就没发使用了

重复检查和使用

让竞争者胜利变动艰难,一个有趣的方案被提出,在代码中加入更多的竞态条件,攻击者只有全赢才能成功

粘滞符号链接保护

大多数TOCTTOU竞态条件漏洞与/tmp目录中的符号链接有关,因此自带了一个内置保护机制防止程序在特定情况下跟随符号链接

在linux文件系统中,文件目录有个比较特殊的比特位,叫粘滞位比特,当设置这个比特位时,只有文件所有者,目录所有者,或者root用户才能重新命名

最小权限原则

通常漏洞问题包含了程序的权限大于实际需求权限,所有违反了最小权限原则,

seteuid
设置当前进程的有效用户ID,如果当前进程的有效用户ID是root,那么参数uid参数可以是任意值setuid 
它设置当前进程的用户ID,如果当前进程有效用户Id不是root,这个函数行为与seteuid一致,

problems

1 Does the following program have a race condition vulnerability?if (!access("/etc/passwd", W_OK)) {
/ the real user has the write permission/
f = open("/tmp/X", O_WRITE);
write_to_file(f);
}
else {
/ the real user does not have the write permission /
fprintf(stderr, "Permission denied\n");
}
不,/etc/passwd是一个受保护的文件,普通用户没有对它的写访问权限。所以if块永远不会被执行。2 How many race conditions does attackers have to win in the following program?int main()
{
struct stat stat1, stat2;
int fd1, fd2;
if (access("tmp/XYZ", O_RDWR)) {
fprintf(stderr, "Permission denied\n");
return -1;
}
else fd1 = open("/tmp/XYZ", O_RDWR);if (access("tmp/XYZ", O_RDWR)) {
fprintf(stderr, "Permission denied\n");
return -1;
}
else fd2 = open("/tmp/XYZ", O_RDWR);// Check whether fd1 and fd2 have the same inode.
fstat(fd1, &stat1);
fstat(fd2, &stat2);if(stat1.st_ino == stat2.st_ino) {
write_to_file(fd1);
}
else {
fprintf(stderr, "Race condition detected\n");
return -1;
}
return 0;
}假设所有文件名都是/tmp/XYZ,而不是tmp/XYZ,这在某些地方是不正确的。第一个竞争是access和fd1open之间的竞争,我们必须创建一个从/tmp/XYZ到要更改的文件的符号链接。第二个是在fd1 open和第二次访问之间,我们必须更新符号链接并将其指向用户可以访问的文件。第三种是在第二次访问和fd2开放之间,类似于第一次比赛。In the open() system call, it first checks whether the user has the required permission to access the target file, then it actually opens the file. There seems to be a check-and-then use pattern. Is there a race condition problem caused by this pattern?
在open()系统调用中,检查用户权限和打开文件是一个原子操作,因此只有open()调用不可能有竞争条件。The least-privilege principle can be used to effectively defend against the race condition attacks discussed in this chapter. Can we use the same principle to defeat buffer-overflow attacks? Why or why not? Namely, before executing the vulnerable function, we disable the root privilege; after the vulnerable function returns, we enable the privilege back.
如果问题是指在strcpy()调用之前禁用根权限,然后再启用它,那么它将不起作用,因为实际的攻击发生在我们从bof()函数返回时。如果我们在bof()调用之前禁用root权限,在调用之后启用它,那么我们就可以防止攻击。If we can lock a file, we can solve the race condition problem by locking a file during the check-and-use window, because no other process can use the file during the time window. Why don't we use this approach to solve the race condition problems discussed in this chapter?A file is locked out to other processes only if it's already open. During the check-and-open process, it's impossible to lock a file. Any locks created can be ignored by the malicious process.
只有文件已经打开时,它才会被锁定到其他进程。在检查和打开过程中,不可能锁定文件。恶意进程可以忽略创建的任何锁。**加粗样式**

这篇关于seed-labs 竞态条件漏洞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058575

相关文章

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示$str = $_GET["name"]; //接受URL来的get形式的name传参echo "<h2 align=center>欢迎用户".$str."</h2>";//在网页输出,并不是echo执行的,而是echo把HTML代码发送到浏览器,浏览器对发送的H

notepad++ 正则表达式多条件查找替换

基础语法参考: https://www.cnblogs.com/winstonet/p/10635043.html https://www.linuxidc.com/Linux/2019-05/158701.htm   通常情况下我们查找的内容和要被替换掉的内容是一样的,我们只需要使用正则表达式精确框定查找内容,替换直接输入要替换的内容即可。 但有时会比较复杂,查找的内容,只需要替换其中

FPGA开发:条件语句 × 循环语句

条件语句 if_else语句 if_else语句,用来判断是否满足所给定的条件,根据判断的结果(真或假)决定执行给出的两种操作之一。 if(表达式)语句; 例如: if(a>b) out1=int1; if(表达式)         语句1; else         语句2; 例如: if(a>b)out1=int1;elseout1=int2; if(表达式1) 语句1; els

Kernel 中MakeFile 使用if条件编译

有时需要通过if  else来选择编译哪个驱动,单纯的obj-$(CONFIG_)就不是很方便,下面提供两种参考案例: 案例一: 来源:drivers/char/tpm/Makefileifdef CONFIG_ACPItpm-y += tpm_eventlog.o tpm_acpi.oelseifdef CONFIG_TCG_IBMVTPMtpm-y += tpm_eventlog.o