mod_process_security
mod_process_security copied to clipboard
chroot機能の追加
スレッドで権限分離をする際に、chroot機能をオプションで使えるように実装したい。Capabilityにuid、gid、groups等の権限変更に特権に加えて、chrootの特権を追加する必要もある。
ref: http://blog.konbu.link/2017/01/18/chroot-in-thread/
動きとしては、子プロセスにCAP_CHROOTを持たせて、スレッド作ってchrootしてからCAP_CHROOTをdropし、コンテンツを実行したらスレッドを破棄した上で、子プロセスが再度元の場所にchrootするようにすれば良い。
POC
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
void run_php_dso_program(char *path) {
DIR *dir;
struct dirent *dp;
dir=opendir(path);
for(dp=readdir(dir); dp!=NULL; dp=readdir(dir)){
printf("%s\n", dp->d_name);
}
closedir(dir);
}
int main()
{
int x;
const char *dir = "/Users/matsumotory/DEV/haconiwa-image-php-tester";
// create mod_process_security thread
// chroot into vhost docmentroot
chdir(dir);
chroot(dir);
// drop cap_chroot from mod_process_security thread
// run php program on mod_process_security thread
run_php_dso_program("/");
// finish php program on mod_process_security thread
// dstroy mod_process_security thread
// child process go back to real host root
chroot("/tmp");
for (x = 0; x < 1024; x++) {
chdir("..");
}
chroot(".");
// real host root
run_php_dso_program("/");
return 0;
}