我的代码(如下)失败: 11:资源暂时不可用 代码以root身份运行(在abrt挂钩中)但是对于有问题的pid正在运行的用户而言是seteuid。 从流程中写入/ proc / self / coredump_filter可以正常工作。 如何从abrt hook写入coredump_filter?
void SetDumpFlags(pid_t pid, int dumpflags){
std::string c_filter_name = "/proc/" + std::to_string( pid ) + "/coredump_filter";
int f = open( c_filter_name.c_str(), O_WRONLY );
if (f < 0) {
fprintf( log, "Couldn't open %s\n", c_filter_name.c_str());
bail_out(1);
}
int wsz = write( f, &dumpflags, sizeof dumpflags);
if (wsz != sizeof dumpflags){
fprintf( log, "Couldn't write to %s, %d:%s\n", c_filter_name.c_str(),errno, strerror(errno));
close( f );
bail_out(1);
}
close( f );
fprintf( log, "Pid %d, dump filter set to 0x%x\n", pid, dumpflags);
}
答案 0 :(得分:1)
我尝试使用C示例复制您的问题 (我会使用C ++ 11但是我使用的是没有C ++ 11的古老上网本,并且很难在这里得到它并使用该语言来适应。)
我在EACCESS
上得到了open
(我的猜测你可能也会得到它,但错误可能会在其他地方被覆盖?)。
似乎coredump_filter
(至少在这个Linux 3.2上)开始归属于
root和seteuid
不会改变它。
我在chown
之前尝试setuid
无效。
当你还是root的时候,工作(正如预期的那样)是打开fd的 并在seteuid通话期间保持打开状态。 然后,即使我的euid改变了,我也可以成功地再次写入文件。
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define FLAGS "0x11"
#define FLAGSSZ (sizeof(FLAGS)-1)
int main()
{
pid_t pid = getpid();
char buf[sizeof("/proc/XXXXXXXXXXXXXX/coredump_filter")];
sprintf(buf,"/proc/%ld/coredump_filter",(long)pid);
int f;
if(0>(f=open(buf,O_WRONLY|O_TRUNC))) {perror("open");exit(1);}
if(FLAGSSZ != write(f,FLAGS,FLAGSSZ)){perror("write");exit(1);}
puts("ok");
char cat[sizeof("cat /proc/XXXXXXXXXXXXXX/coredump_filter")];
sprintf(cat,"cat /proc/%ld/coredump_filter", (long)pid);
system(cat);
char ls[sizeof("ls -l /proc/XXXXXXXXXXXXXX/coredump_filter")];
sprintf(ls,"ls -l /proc/%ld/coredump_filter", (long)pid);
system(ls); //owned by root, not writable by others
if(0>chown(buf,getuid(),getgid())){perror("chown"); exit(1); }
//chown returns success but ls -l doesn't agree
system(ls); //still owned by root
if(0>seteuid(getuid())){
perror("seteuid");
exit(1);
}
//can't reopen because of the perms but can still
//use the old fd if we kept it open
if(0>lseek(f,SEEK_SET,0)){perror("lseek"); exit(1);}
#define ALTFLAGS "0x22"
#define ALTFLAGSSZ (sizeof(ALTFLAGS)-1)
if(ALTFLAGSSZ != write(f,ALTFLAGS,ALTFLAGSSZ)){perror("write");exit(1);}
puts("ok");
system(cat);
}
我使用gcc c.c
编译并在运行之前使用sudo sh -c 'chown 0 $1 && chmod u+s $1' - a.out
创建了a.out setuid root。
答案 1 :(得分:0)
我试图将数据写入coredump_filter,而我应该写一个字符串!使用文字(例如#define FLAGS&#34; 0x11&#34;如PSkocik给出的答案)来解决问题。
/ proc / nnnnn / coredump_filter文件由进程nnnnn正在运行的用户拥有。在我的例子中,这是某些进程的root用户和其他用户的用户。在尝试编写coredump_filter之前,将用户(在abrt挂钩中)切换到适当的用户,工作正常。