How to force setuid program to make a core dump


Author: pigfoot
9 Sep
前の子は出勤r、Samuelは走ります^:
「えっ?前のサーバーのr候、どうやって自分でa生Core dumpしたの?」
「setrlimit(2)を使ってるんだよ!
「じゃあ、柱の部分を見てみましょう.」
]思いついたら_クールに始まりました~私はMを使ってやっとlF
LinuxではAOはCore dumpではなく、プログラムaでCore dumpを生成する方法はbash built-inのulimit命令を利用することである.私は去年@編How to enlarge Coredump Size and File Descriptor Limitationsにも届いた.
いいえ^意外によくあるので、System administrator O ulimit-c unlimitedのほか、私自身も地下室e面を流してsetrlimit(2)@b system callを利用して、プログラムはプログラムcrashのr候ではCore dumpが重要ですね!CSI 1のようにCf.
しかしSamuelのプログラムrを見終わって、私と彼はXがとてもおかしくて、work才で、codeのプログラムを発表するためすでにproduction serverの上で1段rgを走って、いいえ、@r候、私はやっと突然思い出して、C器のadministratorがかつてf^r候Core dumpがあってF.“God!抜けないでしょう?”
サムエル人とY料の答えを探したら、@篇の文章のCです.私lF、もし1プログラムが上の方法ですべてo法a生Core dumpであれば、@プログラムがsetuid(2)@System callを使ったかどうかを見てみましょう.私のlF、1 setuid(2)あるいはseteuid(2)^後のプログラムは、k法a生Core dumpがあります.
あいにく、通常はServerRunning with Least Privilege(Windowsの命令はRun As)へ.つまりf,setuid(2)は省略できないに違いない.Qを解く方法にはブレーキがある.
第1 Nは@プログラムのみ有効である.使用する方法はprctl(2).@方法はsourceを変更することができて、それからrebuildのrの下でやっと使うことができます.Sample codeは次のとおりです.#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/resource.h>
#include <sys/prctl.h>

#define SU_USER "nobody"

int main(void)
{
     struct rlimit corelimit;
     struct passwd *pw = NULL;
     char           *cp = NULL;

     /* if switch to nobody failed */
     if (NULL == (pw = getpwnam(SU_USER)))
     {
         fprintf(stderr, "Cannot get uid from user(%s). Error: %s
",
                          SU_USER, strerror(errno));
         return -1;
     }

     /* try to switch to nobody */
     if ((setuid(pw->pw_uid) < 0) || (seteuid(pw->pw_uid) < 0))
     {
         fprintf(stderr, "Cannot switch to user(%s). Error: %s
",
                          SU_USER, strerror(errno));
         return -2;
     }

     /* force to make coredump */
     if (prctl(PR_SET_DUMPABLE, 1) < 0)
     {
         fprintf(stderr, "Cannot enable core dumping. Error: %s
",
                          strerror(errno));
         return -3;
     }

     /* set core size to unlimited */
     corelimit.rlim_cur = RLIM_INFINITY;
     corelimit.rlim_max = RLIM_INFINITY;
     if (setrlimit(RLIMIT_CORE, &corelimit) < 0)
     {
         fprintf(stderr, "Setrlimit failed! Error: %s
",
                          strerror(errno));
         return -4;
     }

     /* force to coredump */
     *cp = ‘1′;

     return 0;
}

@Nメソッドで注意したいことは、次のとおりです.
  • 必ずrootテープを使います.setuidそれから普通user去(e.g. sudo chown root a.out; sudo chgrp root a.out; sudo chmod 4755 a.out)
  • Core dump aの生の目と注意@case、rootをsuper-userにしないで、regular userにします.例えばf、(drwxrwxr-x,root root)と(drwxrwxrwx,nobody nogroup)は可能であるが、(drwxr-xr-x root root)と(drwxrwxr-x root nogroup)はいずれもだめである.とてもt!私も知らない
    第2のN方法はsystem-wideであり、つまりy方法は/proc/sys/fs/suid_dumpable. 因檫@和kernel的版本有P,man 5 proc比^保U.@是o法source code,而且原程式]有用prctl(2)情r下の6-6昼.
    注意すべきことは第1のN方法と1、/proc/sys/fs/suid_dumpable O成1または2の差eは、Q定core dumpfileのモレーン姓である.Oが1になると、リングNを盗む方法で潜潜switchのowner(本例はnobody)を郵送する.O 2ならrootに違いないけど@kernel 2.6.13以上でsupport?私はそうではありません.定
    希望@篇文章oみんな作⒖!
    PS:@編はなんともうすぐ二週末、ミズメイですね~