[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[harden-mac:0239] vsftpd on Mac OS X
- To: harden-mac@xxxxxxxxxx
- Subject: [harden-mac:0239] vsftpd on Mac OS X
- From: SHIROYAMA Takayuki <puresnow@xxxxxxx>
- Date: Fri, 13 Dec 2002 14:55:16 +0900
しろやまです。
せっかくなので、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