gpt4 book ai didi

linux - 在匿名 elf 文件上调用 execl 是否安全?

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:23 25 4
gpt4 key购买 nike

首先通过

创建一个匿名内存块
int fd = memfd_create("", MFD_CLOEXEC);

请注意,我传递了 MFD_CLOEXEcflags。然后我将 elf 文件内容复制到这个匿名内存中。 Sprite 是这样执行的:

char cmd[128];
sprintf(cmd, "/proc/self/fd/%i", fd);
execl(cmd, "dummy", NULL);

MFD_CLOEXEC 表示fd会在execl之后关闭,但是这里execl需要从fd中加载elf内容。我做了一个简单的测试,似乎没问题。但我不确定它是否安全。

更新:

#define _GNU_SOURCE 
#include <sys/mman.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <stdio.h>

extern uint8_t foo_data[] asm("_binary_htop_start");
extern uint8_t foo_data_size[] asm("_binary_htop_size");
extern uint8_t foo_data_end[] asm("_binary_htop_end");
int main(int argc, char **argv)
{
int exefd = memfd_create("", MFD_CLOEXEC);
printf("%p %d %ld\n", foo_data, exefd, write(exefd, foo_data, foo_data_end-foo_data));
char * const vv[] = {"htopp", NULL};
//execveat(exefd, NULL, vv, NULL, AT_EMPTY_PATH);
exefd = syscall(__NR_execveat, exefd, NULL, vv, NULL, AT_EMPTY_PATH);
perror("");
return 0;
}

我尝试使用 execveat 但失败了。系统调用将 errno 设置为“错误地址”,不知道原因。 elf内容由objcopy生成。

最佳答案

对于真正的二进制文件(如 ELF 文件),无论是静态链接还是动态链接,它都完全没问题。

MFD_CLOEXEC 不适用于可执行脚本(例如以 #!/bin/sh 开头的文件)。在这种情况下,您必须省略该标志并使 fd 保持打开状态。

您应该考虑使用 execveat(fd, "", argv, env, AT_EMPTY_PATH) 而不是您的 sprintf/execl 技巧(不幸的是,它与使用 O_CLOEXEC 打开的可执行脚本有同样的问题,但不依赖于安装的 /proc fs)。

当然,对于像 execl() 这样的可变函数,您应该始终使用 (void*)0 而不是 NULL ;-)

关于linux - 在匿名 elf 文件上调用 execl 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com