From: Nobuyoshi N. <nob...@so...> - 2003-01-21 04:38:38
|
なかだです。 At Tue, 21 Jan 2003 12:46:45 +0900 (JST), hs...@mt... wrote: > > 坂本です。 > > > なかだです。 > > daemon modeで使用するソケットが/tmp/mlterm.unixと固定になってい > > ると、同時に一人しかdaemon modeにできないんではないでしょうか。 > > これってシンボリックリンク攻撃は大丈夫ですか。 > > あるユーザ A が > ln -s /tmp/xxx /tmp/mlterm.unix > しておくと、他のユーザ B が daemon mode で mlterm を立ち上げた時に > creat() は成功してしまいます。(/tmp/xxx が作成される) > その瞬間を狙って、A が > rm /tmp/mlterm.unix > ln -s /tmp/yyy /tmp/mlterm.unix > します。そうすると (600 でない) 誰でも読めるかも知れない > パーミッションを持った /tmp/yyy ができます。 でも/tmp/mlterm.unixはunlink()してbind()してしまうので、結局は 関係ないと思いますが。存在チェックとかせずに、単にbind()するだ けでいいような気がしてきました。 > ~/.mlterm/ 以下に作成するか、 ホームディレクトリがNFSだったりしてもうまく動きますか。 > open(path, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 600) > が良いのではないでしょうか。 一般にロックファイルを作ったりするときには、これがベストでしょ うけど。 Index: x_term_manager.c =================================================================== RCS file: /cvsroot/mlterm/mlterm/xwindow/x_term_manager.c,v retrieving revision 1.22 diff -u -2 -p -r1.22 x_term_manager.c --- x_term_manager.c 23 Nov 2002 08:10:41 -0000 1.22 +++ x_term_manager.c 21 Jan 2003 04:34:45 -0000 @@ -13,5 +13,5 @@ #include <signal.h> /* kill */ #include <stdlib.h> /* getenv */ -#include <fcntl.h> /* creat */ +#include <errno.h> #include <kiklib/kik_debug.h> #include <kiklib/kik_str.h> /* kik_str_sep/kik_str_to_int/kik_str_alloca_dup/strdup */ @@ -666,20 +666,28 @@ start_daemon(void) { int fd ; - char * path = "/tmp/mlterm.unix" ; pid_t pid ; int sock_fd ; struct sockaddr_un servaddr ; + char * path = servaddr.sun_path ; - if( ( fd = creat( path , 0600)) == -1) + memset( &servaddr , 0 , sizeof( servaddr)) ; + servaddr.sun_family = AF_LOCAL ; + sprintf( path , "/tmp/.mlterm-%d.unix" , getuid()) ; + + if( ( sock_fd = socket( AF_LOCAL , SOCK_STREAM , 0)) < 0) + { + return -1 ; + } + + if( bind( sock_fd , (struct sockaddr *) &servaddr , sizeof( servaddr)) < 0) { - /* already exists */ + close( sock_fd) ; - kik_msg_printf( "remove %s before starting daemon.\n" , path) ; + if( errno == EADDRINUSE) + kik_msg_printf( "remove %s before starting daemon.\n" , path) ; return -1 ; } - close( fd) ; - pid = fork() ; @@ -725,30 +733,13 @@ start_daemon(void) */ - if( ( sock_fd = socket( AF_LOCAL , SOCK_STREAM , 0)) < 0) - { - return -1 ; - } - - unlink( path) ; - - memset( &servaddr , 0 , sizeof( servaddr)) ; - servaddr.sun_family = AF_LOCAL ; - strcpy( servaddr.sun_path , path) ; - - if( bind( sock_fd , (struct sockaddr *) &servaddr , sizeof( servaddr)) < 0) - { - close( sock_fd) ; - - return -1 ; - } - if( listen( sock_fd , 1024) < 0) { close( sock_fd) ; + unlink( path) ; return -1 ; } - un_file = path ; + un_file = strdup( path) ; return sock_fd ; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦 |