[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[harden-mac:0239] vsftpd on Mac OS X




しろやまです。 せっかくなので、vsftpd を Mac OS X でコンパイルしてみました。 少々 Makefile を修正するだけで コンパイル自体は成功しました。 ただ、そのまま動作させ、クライアントからアクセスを行うと「setgroup」と いうエラーを残して切断されてしまいます。 どうも原因は sysutil.c にある以下のコードの部分みたいです。 -------------------------------------------------------------------- void vsf_sysutil_clear_supp_groups(void) { int retval = setgroups(0, NULL); if (retval != 0) { die("setgroups"); } } -------------------------------------------------------------------- で、Mac OS X のsetgroupsシステムコールですが、xnu/bsd/kern/kern_prot.c によると -------------------------------------------------------------------- struct setgroups_args{ u_int gidsetsize; gid_t *gidset; }; /* ARGSUSED */ setgroups(p, uap, retval) struct proc *p; struct setgroups_args *uap; register_t *retval; { register struct pcred *pc = p->p_cred; struct ucred *new, *old; register u_int ngrp; int error; if (error = suser(pc->pc_ucred, &p->p_acflag)) return (error); ngrp = uap->gidsetsize; if (ngrp < 1 || ngrp > NGROUPS) return (EINVAL); (以下略) -------------------------------------------------------------------- ってなっており、で第一引数が 0 の場合は EINVAL で帰ってしまいます。 これが問題になるわけです。 なお、念のために -------------------------------------------------------------------- #include <stdio.h> #include <errno.h> main() { int ret = setgroups( 0, NULL ); printf( "ret = %d, %s\n", ret, strerror( errno ) ); } -------------------------------------------------------------------- こんなプログラムをでっちあげて各OSで試したところ RedHatLinux7.3: ret = 0, Success Solaris8: ret = 0, Error 0 NetBSD1.6:ret = 0, Undefined error: 0 Mac OS X 10.2.2: ret = -1, Invalid argument っとなります。(古い NetBSD/FreeBSDなら Mac OS X と同じ結果になるので はないかと思われ ) とりあえず、ここで全てのGroup権限を外すのではなく、(妥協として)nogroup 権限だけを追加するように書き直したのが、以下に付属するパッチになり ます。 このパッチを適用してコンパイルして、できあがった vsftpd を適当な 場所(ここでは /usr/local/sbin )に自分でコピーします。(make installは 未定義の模様です) そして配布物に含まれる vsftpd.conf を /etc/にコピーした後に、エディタで 10行目にある「#local_enable=YES」の最初の#を外しユーザでのログイン を可能に、91行目にある「#chroot_list_enable=YES」の#も外して chroot_list を有効にします。 それから、/etc/vsftpd.chroot_list というファイルを作り、そこに chrootさ せたいユーザ名を列挙します。 最後に、/etc/xinetd.d/ftp を編集、 -------------------------------------------------------------------- server = /usr/libexec/ftpd server_args = -l -r groups = yes -------------------------------------------------------------------- とあるのを -------------------------------------------------------------------- # server = /usr/libexec/ftpd server = /usr/local/sbin/vsftpd # server_args = -l -r groups = yes -------------------------------------------------------------------- っと書き換えます。 これであとは 「システム環境設定」でFTPサービスを有効にする、ないしは一回 無効にして有効にし直すことで、 vsftpd を用いてローカルユーザのアクセスが 可能になり、さらには vsftpd.chroot_list にのせられたユーザはホームから上 にはアクセスができなくなります。 「全てのgroup権限を放棄する」のと、「nogroup権限を残して放棄する」のとで、 どれだけセキュリティ的に差違があるのか少々疑問ですが、誰かが Darwinカー ネルの中のsetgruopsをアップデートしてくれない限りはこの手ぐらいしかやり ようがないかと思います。(それとは別に、nogroups = -1 決め打ちはどうかと自 分でも思いますが...(^^;、気になる方は getgrent を使ってまじめに実装して ください ) 実は同じ問題が xinetd にもあります。 # http://www1.neweb.ne.jp/wa/yamdas/column/technique/xinetd_faqj.html # の「Q. setgroups(0, NULL) エラーって何?」を参照。 Mac OS X の xinetd ではgroups=yesで逃げてますが、私には、これは良い方法 だとは思えません。 vsftpd に関しては、気が向いたら週末にでもバイナリパッケージにしてみようか と思っております。( ふらっと秋葉にいって、ふらっと C700に手を出してはまって いる可能性の方が高そうだけど...(^^; ) --- SHIROYAMA Takayuki begin 644 vsftpd-1.1.3.macosx.patch.gz M'XL("/-N^3T"`W9S9G1P9"TQ+C$N,RYM86-O<W@N<&%T8V@`S5313MLP%'UN MO^+22A-T31NGM$`0#S`&8NO:B8)XF11"XK06B1W93J'BYW?MM$64I=)>QJHJ M<>X]]]@^Q]<Q2Q)P9#2"3G>N$IW'#NF03J\C))MV?X2/-&$IW4BNX_56J[6U ML'934!A'&CP/W$.?]'TR`,]UO;KC.%6LM0O)X)Q&0'I`]GURX/?=LJCU]F>G M[[6)!_8+X&HTN3D=#FLG-<:5#M/4Q"Z&IY<3@!-P6,QDF&@J(2ZR;,%XA/GF MEQ*`^6E]!\HO9'#&'CAWR(%/_*M9&(LG:#HYC4.N680Q*J60^(X$GU.IF.#( MA__AU9EAN+?["Q+&XY0]J(Z:W>,$PZO1=T-_E[8=5>+'9]\,/@L9[P@H-$N9 M7N`HES054QM$F:(L9L)$A=*K<"[97(GH$8>_D*A6TP4/'U*JRI(XU*&M431Z M*!(<I,I"C?I6.!PX_T0X<+APHCQW<%.1R')PSN^NQZ/+8/+UYO)Z?/MS`DW8 M+B[\I;K/'Z5NO+6IU$*9172BS?._3E2VU1I1FX2Z[*L!N)[?\_R^5]E7KU7O M&JMW4-U8Y,C=;Y,CXI;=98A7H?[JW,P%B\T+C5C.$D0I#66@BCP/IE(4N=HU MH#U$O=0_0Y,E,4U@PWI,`$Q9'&CSM$>.'$.W"UQ8#IMG7(.D>AZFF%=4+]F! MM.&3J=H[-OPT513GJH2[;1C=#H=+,$>K2G0"NTOTS@FX>S;X8I\`,:.[C35% M`VNW.[P^)N\L?LU4>OP*L799D_O@'OC[`]\CE29OE*U<]GQRZ+NDVN5!OWU` M5O=GP16;<AI;\9:,@;F2`Y%3'F0BIBBF.Q@,CJO06?@<Y%0&+#=(`\.NQ!Y6 M&J)9*%MK(#9-(6D0S:00.L`+!O&-;J%D%V\,2;LTR_6B80C^5(T[#PI%)0\S MLZ0&?E=BHYEXXF_09LI*^'-")=X`=M]V3?-0=C&PU+N#0ZPU%I3:+5OAX[4S .Z_S/5?L-Y3GUIV\(``!* ` end --[PR]------------------------------------------------------------------            ★★ 当選まであと少し! ★★      【VAIO】【エステ券付き高級ホテル宿泊券】をプレゼント!     12月末しめきり!⇒ http://ad.freeml.com/cgi-bin/ad.cgi?id=b330U ------------------------------------------------------------------[PR]-- <GMO GROUP> Global Media Online www.gmo.jp