Path: sran124!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 3 May 90 23:02:29 Organization: Software Research Associates, Inc.,Japan Newsgroups: sra.test, junk Subject: Today's junk article Distribution: sra GW特別企画 「本日のjunk記事」 この企画の趣旨: 特になし。やりたいからやってるだけ。目指す領域は日記。 ========= (セキュリティに関係する話があったのを後日削除。by katsu) ======== ...... fingerd, finger 等は(/etc/inetd.conf にそう書いてあれば)nobody (uid: -2) で実行されます。私の機械では /etc/sa -s をする時に、しばしば Preposterous user id, 65534: ignored なんて警告を受けるのですが、これは多くの場合誰か私の機械に finger をかけた のが原因となっています。-2(65534) に対応する password entry を見つけられない のでしょう。 しかし nobody に対応する entry を見つけられないのは何故でしょう。 同じように nobody に関する処理が少し怪しげなコマンドに lastcomm があります。 lastcomm では nobody の権限で実行されたプロセスの情報は大抵の機械で nobody と表示してくれず、vax だと空文字列、NEWS OS3.2 だとメチャクチャな 文字列になります。これは、uid をキーにしてユーザー名を捜してくる関数 (ちなみに getname() といいます)が、-2(65534) に対応する名前を 見つけられずに (char *)0 を返しているにもかかわらず、それを そのまま printf(" ... %s ...", ... getname(UID)... といった形で 出力しようとしているからのようです。 NEWS OS3.3a だとエントリが見つからなかった時には(つまりは nobody の 時にも)「(null)」という表示になるようになりました。しかしこれは、 エントリが見つからなかった時には (null) と表示するように lastcomm が 修正されたわけではなく、printf("%s", 0) をやると「(null)」が出るように なっただけの話のようです。(つまり 0 番地から ( n u l l ) ¥0 が入って いるようになった。) Sun OS 3.4(EXPORT) の場合は、エントリを見つけられない時には数字で 表示してくれるようです。すなわち nobody なら -2 と出ます。しかし nobody のエントリを見つけてくれない点は同じみたいです。 さて、nobody の entry を捜せない理由を探るために、試しに、 if ((p = getpwuid(UID)) == 0) CANT_FIND; GET_IT; なんていうことをやってみると、NEWS OS3.3a, VAX 4.3BSD, SunOs 3.4Export いずれでも、 UID == -2 に対しては GET_IT UID == 65534 に対しては CANT_FIND という結果になりました。 一方、私の機械(NEWS OS3.3a)の /usr/include では、(Sun OS では違ってます) sys/acct.h で ac_uid が uid_t 型(uid_t は、sys/types.h の中で unsigned short であるように宣言されている。)であるし、sys/proc.h でも uid_t p_uid; だし、sys/quota.h でも sys/user.h でも uid まわりは全部 uid_t なのに、 では int pw_uid; のようになっています。 多分、関数呼び出しや代入の際に unsigned short から int へ拡張される 時に (unsigned short)-2 が (int)65534 になってしまい、getpwuid(65534) を評価するのだけれども、これが失敗してしまうという流れだと想像されます。 このひずみのために /etc/sa は nobody のことを Preposterous と 思ってしまい、また lastcomm は fingerd の実行主を見つけられないので ありましょう。 やっぱり pwd.h でも uid_t pw_uid; となっていて、getpwuid(-2) は失敗して getpwuid(65534) は成功するべきのような気がします。 ps も uid から password entry を捜す作業をしていますが(やはり lastcomm と同じ getname() という関数だが、全く違う実現)ps では nobody で実行されたプロセスは正しく nobody と表示します。これは、 sys/*.h を無視して、uid の ps 内部での表現を unsigned short ではなく ただの short としているせいでしょう。 無茶を承知で、 nobody:*:-2:-2::/: nobody:*:65534:65534::/: なんて2行書くと、みな動くようになるみたいだけれども、 どうも気味が悪いのでやってません。 ========= (この部分、公開できない話があったのを後日削除。by katsu) ======== -- ----____----____ 渡邊克宏 環境開発部 今月の標語:「生意気も意気のうち」