Here's a little "do nothing" daemon server that demonstrates the problem.

---
#include <stdlib.h>

int
main()
{
        (void) daemon(1,1);
        (void) chdir("/tmp");

        printf("before uid=%d euid=%d\n", getuid(), geteuid());
        (void) setuid(1);
        printf("after uid=%d euid=%d\n", getuid(), geteuid());
        for (;;)
                sleep(1);
        /* NOTREACHED */
        return 0;
}

---

As root...

# gcc a.c                       build
# ulimit -S -c unlimited        set core dumps
# ulimit -a                     verify coredump unlimited

# sysctl kern.nosuidcoredump=0  or set to =2

# ./a.out                       start it, becomes user daemon (id 1)
                                and set work dir to /tmp

# pkill -ABRT a.out             kill it

# ls -a /tmp /var/crash         OOPS! No core file.

Without the call to setuid, then the daemon will create a core file in /tmp.

What I would like to know is how to get a core file when the daemon
program uses setuid/seteuid family of functions, which appears to make
it subject to kern.nosuidcoredump? I've tried all 3 possible values

        /* KERN_NOSUIDCOREDUMP interger values:
         *
         *   0  dump core,
         *   1  disable dump core (default)
         *   2  dump core to /var/crash.
         */

Nothing appears to work. Tested on 4.0 and 4.3 systems.

So what am I forgetting?

-- 
Anthony C Howe            Skype: SirWumpus                  SnertSoft
+33 6 11 89 73 78       Twitter: SirWumpus      BarricadeMX & Milters
http://snert.com/      http://nanozen.info/     http://snertsoft.com/

Reply via email to