can't generate core file after change user fro

2019-04-16 00:01发布

问题:

after change user from root to nobody in c language, and I am sure the program core dump, but always can't generate core file. I'm sure nobody have the right to generate file in current dir. and ulimit -c is unlimited, and I use :

system("echo 'tesstestestestestetestestet!!!!!!' >  hahahahhaahahah");

after change user from root to nobody, the file hahahahhaahahah was created!

so, I'm very confuse!

here is my c file:

#include <pwd.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main()
{
#if 1
    struct passwd *pw;

    //char *username = "root";
    char *username = "nobody";
    if (getuid() == 0 || geteuid() == 0)
    {
        if (username == 0 || *username == '\0')
        {
            fprintf(stderr, "can't run as root without the -u switch\n");
            exit(-1);
        }
        if ((pw = getpwnam(username)) == NULL)
        {
            fprintf(stderr, "can't find the user %s to switch to\n", username);
            exit(-1);
        }
        if (setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0)
        {
            fprintf(stderr, "failed to assume identity of user %s\n", username);
            exit(-1);
        }
    }
#endif

    printf("now user change to group id %d, user id %d\n", getgid(), getuid());

    system("echo 'tesstestestestestetestestet!!!!!!' >  hahahahhaahahah");
    char *test_a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    char *test_b;
    strcpy(test_b, test_a);
    *(char *)1=1;
    printf("test_b:%s\n", test_b);
}

回答1:

Read carefully core(5) man page:

There are various circumstances in which a core dump file is not produced:

.... skipping some text from the man page ....

  • The process is executing a set-user-ID (set-group-ID) program that is owned by a user (group) other than the real user (group) ID of the process.

So basically, after a successful setuid(2) syscall, core is not dumped.(for security reasons)

See also the Linux specific prctl(2) syscall, with PR_SET_DUMPABLE.

Read also http://advancedlinuxprogramming.com/

NB. Have a nobody writable directory is probably a bad idea. The nobody user should usually not own any file or directory!



标签: c linux root core