初めまして。初心者なので質問自体が意味不明かもしれませんが、 システムコールでCPU使用量や、ディスク使用量などを取得する方法を教えてください。dfコマンドなどで取得すると、Linux、Solarisで取得できる情報が違ってくるので、、、ちなみに使用言語はC、OSはLinuxでお願いします。 |
>>2961 1202 > ディスク使用量 statfs(2), fstatfs(2) > CPU使用量 プロセス単位の情報かシステムの情報を取るのかわかりませんが、 Linux ならどちらにせよ /proc 直読みなのかな? あるいは /proc を 読むような API が用意されているかもしれませんが、わかりません。 後は man -k stat、man -k cpu、man -k disk などを活用してください。 |
>>2962 68user ありがとうございます。 早速試してみます。 |
kikiと申します. 68user様,先日はお世話になりました. お聞きしたいことがあります. 私は今,シェルでpsコマンドを打ち込んだら 標準出力で"psコマンドがうちこまれました." と出力させるプログラムを作ろうとしています. この時に,シェルからpsコマンドが打ち込まれたかどうかを 判定するプログラムに,シェルで打ち込まれたコマンドを渡して 判定させたいのですが,このような事は,プロセス間通信や デーモンを使うのでしょうか? 皆様のアドバイスをよろしくお願い致します. また,簡単なデーモンのソースがあるページや, デーモンを作るにあたってやくだつページを ご存知でしたら教えてください. よろしくお願いします. |
>>2964 kiki 前にも書きましたが目的は何ですか? kiki さんの質問は いつも情報量が足りないと思います。 目的を書かないから前提条件がわからない。前提条件が わからないから、例えば 「利用者にばれてもいいのか」 「シェルのソースをいじるというのはアリなのか」 などもわからない (当然その答えによって解は異なります)。 > また,簡単なデーモンのソースがあるページ http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC16 など。 >>2961 1202 > dfコマンドなどで取得すると、Linux、Solarisで取得できる情報が > 違ってくるので、、、 ちなみに僕ならば面倒なので GNU df を Solaris に 入れます (仕事であれば特に)。 |
2965>>68user様 毎回すみません. 目的は前回の質問でふれたsuトロイの痕跡の検出なんです. suトロイも本物のsuも.bash_historyのなかにコマンドが残りますが, /var/log/messageでは,本物のsuの痕跡しか残らない事を利用して, suトロイをリアルタイムに近い形で検出できないか?と考えたのです. そこで,シェルからsuコマンドが打ち込まれたかどうかを 判定するプログラムに,シェルで打ち込まれたコマンドを渡して 判定させ,suとコマンドが 実行されているようならば, /var/log/messageをみて,suの痕跡があるかどうかを調べれば 検出できるだろうと考えたのです. とりあえずsuコマンドが打ち込まれたかどうかを判定する 部分をまず作ろうと思いましたが,この時にプロセス間で データのやりとりが必要になったり,デーモンも使うのかな と思い,質問させていただきました. 「利用者にばれてもいいのか」 >はい,ばらせる事ができるならば是非そうしたいです. 「シェルのソースをいじるというのはアリなのか」 >はい,ありです. 毎回わかりづらい書き込みをして申し訳ありません. ご教授をお願い致します. |
>>2966 kiki 今度は検出なわけですね? > /var/log/messageでは,本物のsuの痕跡しか残らない事を利用して, syslog(3) や logger(1) を使えば誰でも su と同様にログに記録する ことはできますので、これだけでは正確に判断できません。 では他に判断する方法はあるかというと、決定的なものはないです。 結局は「何をもって本物と判断するか」「何を持って悪意のあるプロ グラムと判断するか」に帰着するわけで。興味があればアンチウィルス ソフトがウィルスを検出する手段を調べてみるとよいでしょう。 で、それとは別に「どうやって su がタイプされたことを検出するか」という 話ですが、ウィルスやトロイの木馬にやられるときというのは、つまるところ 「プログラムを実行したとき」なわけで、exec(2) の実行直前に su を実行 しようとしているかどうか、というチェックをすればよいでしょう。 プロセス間通信やデーモンは「なぜそれを使う必要があるか」を説明でき ないなら、使う必要はないということです。 別の解としては、システムコールの発行を hook して安全性をチェック、 というのもありますが、UNIX でこういうのってできるのかなーと思って 調べてみたら、なんかできるようですね。 http://www.caj.co.jp/support/etrustac_faq.htm Q6: eTrust Access ControlのSoft Hook技術とは何ですか? カーネルを置き換えているのか、あるいは libc のシステムコール発行部分を 置き換えているのか…(できるのかな?) # Windows なら SetWindowsHookEx で簡単なんですけど。 |
>>2967 68user様 お返事ありがとうございます. >syslog(3)やlogger(1) を使えば誰でも su と同様にログに記録することはできます これはsuトロイを実行した時にも/var/log/messageに本物のsuの認証失敗のメッセージ を残せる,という事なんですよね.これは,suトロイ内でsyslog()関数などを使って, syslogdにメッセージを渡すという事なのでしょうか? P.S. システムコールで見分ける,ですね. 確かに,suトロイと本物のsuだとやっている事はちがうから 見分けられるかも知れませんね.アドバイスありがとうございます. |
>>2967 68user様 何回も申し訳ありません.kikiです. >exec(2)の実行直前にsuを実行しようとしているかどうか、というチェックをすればよいでしょう。 これは,システムコールのチェックを自動化させて行なえばよい, という事なのでしょうか? 基本的な事で申し訳ありません. |
いつもすいません、質問です。 以下のようなプログラムを Perl 5.8/FreeBSD 2.2.8 release で書きたいです。 カンタンにいうと、入れ子になったタグで囲まれた部分だけを 別ファイルに抜き出し、元ファイルからは削除する、です。 順序を保存して抜く方法と、 保存しないで抜く方法とあると思いますが、 どちらでもかまいません。 (前者の方がいいかなぁ、、) 入力ファイル: out1 <tag a> in1 <tag b> in2 <tag c> in3 </tag> in4 </tag> in5 </tag> out2 <tag d> in6 <tag e> in7 </tag> in8 </tag> out3 <tag f> in9 </tag> out4 出力ファイル例1:(順序を保存して抜く) ファイルA:(タグで囲まれた部分のみを抜いたもの) <tag a> in1 <tag b> in2 <tag c> in3 </tag> in4 </tag> in5 </tag> <tag d> in6 <tag e> in7 </tag> in8 </tag> <tag f> in9 </tag> ファイルB:(ファイルAで抜いた残り) out1 out2 out3 out4 出力ファイル例2:(順序を保存しないで抜く) ファイルA:(タグで囲まれた部分のみを抜いたもの) <tag c> in3 </tag> <tag b> in2 in4 </tag> <tag a> in1 in5 </tag> <tag e> in7 </tag> <tag d> in6 in8 </tag> <tag f> in9 </tag> ファイルB:(ファイルAで抜いた残り) out1 out2 out3 out4 よろしくお願いします。 |
補足です。 この tag というのは全部同じタグです。 ただオープンタグにかかれている a, b, ... という アトリビュートが全部違います。 |
さらに補足。(俺って説明下手だな、、;;; ファイルには <tag> 以外のタグも存在します。 <aaa ???>〜</aaa>、<bbb ???>〜</bbb> などです。 その中で下の処理の対象になるのが <tag> だけということです。 <tag ???>〜</tag> の中に <xxx ???>〜</xxx> がある場合は、 それも抜いて書き出します。 問題の定義もなかなか奥が深い。 |
>>2969 kiki シェルって何をしているか知っていますか? 簡単に言うと、ユーザが 入力した文字列を解析し、execve(2) を実行することです。 シェルのソースをいじっていいのならば、execve(2) を発行している 部分を探して、そこで su を実行しようとしているかどうかのチェックを 行えばよいのでは、という話です。 >>2970 ふくし 入力が XML なら、 http://member.nifty.ne.jp/hippo2000/perltips/xml/dom.htm#XML_DOM_NODE の removeChild で一発なような気がします。 XML でないなら構文解析してスタックに積んで…といきたいところですが、 僕は軟弱なので - s|<tag .*?>.*?</tag>|| - 削除したのが足りなかった (例えば <tag a>in1<tag b>in2<tag c>in3</tag> しか取れなかった) なら、追加であと 2個の </tag> をするため s|.*?</tag>.*?</tag>|| とする。 とします。 |
>>2967 68user > 別の解としては、システムコールの発行を hook して安全性をチェック、 > というのもありますが、UNIX でこういうのってできるのかなーと思って > 調べてみたら、なんかできるようですね。 > http://www.caj.co.jp/support/etrustac_faq.htm > Q6: eTrust Access ControlのSoft Hook技術とは何ですか? > カーネルを置き換えているのか、あるいは libc のシステムコール発行部分を > 置き換えているのか…(できるのかな?) 最近これに激しく惹かれているのですが、libc 置き換えで可能なんでしょうか。 詳しい人がいらっしゃったら教えてください。 全てのシステムコールは http://home.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/i386/sys/syscall.S?rev=1.8 を経由するんじゃないかと思っているのですが、もしそれが正しいなら ここにチェック機能を入れた libc を用意して置き換えるか、あるいは LD_PRELOAD で既存 libc に置き換えることは可能なのかなぁ。 どちらにせよアセンブラができないので、 http://www.ascii.co.jp/books/detail/4-7561/4-7561-0213-1.html を買って勉強かな…。 |
>>2973 68user さん、ありがとうございます。 まさに xml で、そのパッケージすごく便利そうなんですが 使い方がよくわかりません ;;; でもべっかいの方でなんとなくできたのでもう少しまとめてから公開します。 |
>>2975 ふくし 別解でがんばるよりは、早めに XML::DOM の使い方を覚えた方が 幸せ度が高いかと。 # 僕は使ったことないですけど。 |
通りすがりのものですが・・・ システムコールをhookして安全性を云々というのは、 たとえば Systrace - Interactive Policy Generation for System Calls http://www.citi.umich.edu/u/provos/systrace/ こういったもののことでしょうか? (OpenBSD, NetBSD にはマージされています) |
X68000の、内臓フォントを利用するインターフェースを調べています。 フリーで有用な文書がありましたら教えていただけないでしょうか? >識者 なお当方X68000に関する知識は皆無でございます。 |
>>2960 68user様 報告が遅れまして申し訳ありません。 /usr/bin/time 実行コマンド >& 出力ファイル を実行した結果うまくいきました。ありがとうございました。 |
タグのパースの件です。 別解ですが、会社の若い者が作ったプログラムが無事動きました。 で、せっかくなので XML::DOM を入れようとしたら、 XML::Parser を入れよと言われたので、 XML::Parser を入れようとしたら、 expat を入れよと言われたので、 expat の tar.gz を解いて ./configure して Makefile を #prefix = /usr/local prefix = /henna_directory として make したら(ぼくは管理者でないので)、 gcc: unrecognized option `-R/henna_directory/lib' といわれました。ここで止まっています。 ちなみに /henna_directory/lib というディレクトリはあります。 (ついでにいうと、bin も include も man も) 待て次号。;;; |
>>2977 UMA > システムコールをhookして安全性を云々というのは、 はい、そういうものを念頭に置いていました (が、ユーザランドで できたらいいなと。無理なのかな)。 Systrace の存在は知りませんでしたが、これはとてもいいですねぇ。 素晴らしいです。 >>2978 UMA 68user's page で X68000 の疑問が解決したことは一度もなかったりします。 インタフェースって API ですか? (ではなさそうな気がしますが)。僕が記憶に 頼って書くと多分間違っているので、X68000 エミュレータ関係の掲示板で 聞くのが早いと思います。 >>2980 ふくし まーいろいろありますが、がんばってインストールしてください。 あと、libwww-perl あたりもいれなきゃいけないのが perl の XML モジュールのうざいところ。 |
>>2973 68user様 お返事ありがとうございます.kikiです. 丁寧なご説明ありがとうございました. おかげで理解できました.ありがとうございます. |
いつも忘れて調べなおすはめにおちいるのでここにメモメモ。 TeraTerm 経由の mule などで PageUp が効かない場合、 Windows\Program Files\TTERMPRO\KEYBOARD.CNF の Remove=329 を ; でコメントアウトし、その下に User1=329 を追加。さらにファイルの一番最後に User1=329,0,$1B[5~ を追加。 って、ちょっと検索してみたら、 http://phe.phyas.aichi-edu.ac.jp/~cyamauch/mule.html の対処と全然違ってますな。なんでアレで PageUp できるんだろう。 |
OS: Solaris 2.5.1 プロセスの通知にシグナルを使っています。 これまで、SIGUSR1とSIGUSR2で間に合っていたのですが、 今回もう一つパターンの追加(SIGUSR3?)を行いたいのです。 そこで、質問なのですが <signal.h>にシグナルを追加できるのでしょうか? また、出来るとしたら注意しないといけない点や 影響を及ぼす範囲を教えて下さい。 よろしくお願いします。 |
>>2984 SIGNAL シグナルの追加はカーネルを書き換えないと無理です。 シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり をするのが正解でしょう。 と偉そうなことをいってますが、シグナルが足りず SIGXCPU を 使って逃げたことはあります。 |
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス が認識する方法があれば情報提供をお願いします。 ・親プロセスはwaitしません。 ・子プロセスは同じものが複数生成されます。(順次生成) ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。 理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果 が格納されるようなものです。 |
>>2986 koko > ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ > や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、 の方法を取らないのであれば、無理なんじゃないでしょうか。 |
>>2986 koko > ・親プロセスはwaitしません。 親でSIGCHLDを拾ってwaitpid()のオプションWNOHANGで チェックするのもダメですか? --- snip --- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/wait.h> void handler(int sig) { int pid,status,code; while((pid=waitpid(-1,&status,WNOHANG))>0) { if(WIFEXITED(status)) { code = WEXITSTATUS(status); printf("child process:[%d] was exited with code:[%d]\n",pid,code); } } } int main(int argc,char *argv[]) { int i,pid,code; char buf[16]; struct sigaction sa; if(argc>1) { code = atoi(argv[1]); srand(code+time(0)); sleep(rand()%10); return code; } memset(&sa,0,sizeof(sa)); sa.sa_flags = SA_NOCLDSTOP; sa.sa_handler = handler; sigaction(SIGCHLD,&sa,0); for(i=0;i<10;i++) { if((pid=fork())<0) { perror("fork"); return -1; } if(pid) continue; sprintf(buf,"%d",i); if(execl("./a.out","./a.out",buf,0)<0) { perror("execl"); return -2; } } for(;;) sleep(1); return 0; /* never reaches */ } --- snip --- かなり適当ですが。 |
>>2988 hsj 他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。 試してみたいと思います。 >>2987 68user 今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に なるかと思います。 ご回答頂き、ありがとうございました。 |
>>2986 koko > ・親プロセスはwaitしません。 ってのは親プロセスにも手を入れたくないという意味かと思った のですが、wait でブロックさせたくないという意図だったのですね。 読み違えておりました。 |
こんにちは 質問があってきました Perlを使っていると system関数やexec関数を使うようになりました 便利でとてもよいのですが Root権限でコマンドが実行されているような気がします くわしくはまだ確認していません。 また、CGIでファイルマネージャーを使っていますが これも同じようにパスワードファイルなどを開かれるという欠点があります 全ディレクトリやファイルのパーミッションを000にすることはもちろんできませんし 一部だけのパーミッション設定もだめです 例)/homeを000にするが/home/userが777だとアクセスされてしまう これらのことからセキュリティーホールとなっていてとても不安です これらについての対処法はなにかないでしょうか? |
>>2991 Japper > Root権限でコマンドが実行されているような気がします perl スクリプト中で print "$<\n"; print "$>\n"; の結果のいずれかが 0 なら root 権限を得ています (が、おそらくは 勘違いではないかと思います)。 > これも同じようにパスワードファイルなどを開かれるという欠点があります 書きかけですが、 http://x68000.startshop.co.jp/~68user/webcgi/cryptogram.html が参考になるかもしれません。 |
初めまして!YAHOO!オークションのログインをプログラムで実行したいのですが、上手くいきません。ブラウザでの通信のlogをとり、プログラムを組んでいたのですが、どうしてもPOSTした後の3種類のクッキーがとれ ないのです。上手くいけば下のような3種類のクッキー(個人情報なので***になっています)が返されるのですが、 ・・・・・・・・・・ブラウザのlog・・・・・・・・・ <ブラウザのPOST> POST /config/login?5934sjuoe8ci4 HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Content-Length: 259 Pragma: no-cache Cookie: B=cv85agsv02md9&b=2 Connection: keep-alive Browser reload detected... Posting 259 bytes... .tries=1 .src=auc .last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc promo= .intl=jp .bypass= .partner= .u=cq4ce2ov02mdi .v=0 .fUpdate=Y hasMsgr=0 .chkP=Y .done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus login=******** passwd=*********** <レスポンス> HTTP/1.1 302 Found Date: Thu, 19 Dec 2002 05:31:58 GMT P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie:**** Set-Cookie:**** Set-Cookie:**** ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ このセッションがどうしても上手くいかず、3種のset-cookie が取得できないのです。大変お忙しい中恐縮ですが、もしよろしければ、アドバイスをよろしくお願いします。とても見せれるプログラムではありませ んが、下記に示します。 try{ URL u = new URL("http://login.yahoo.co.jp/config/login?5934sjuoe8ci4"); URLConnection uc = u.openConnection(); uc.setRequestProperty("Cookie:","B=cv85agsv02md9&b=2); uc.setDoOutput(true); uc.setDoInput(true); OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(), "EUC_JP"); query.Encode3(".tries","1"); query.Encode1(".src","auc"); query.Encode1(".last","http://login.yahoo.co.jp/config/edit_auc"); query.Encode1("promo",""); *query.Encode()はクエリー文字列にするための関数です。 query.Encode1(".intl","jp"); query.Encode1(".bypass",""); query.Encode1(".partner",""); query.Encode1(".u",data2); query.Encode1(".v","0"); query.Encode1(".fUpdate","Y"); query.Encode1("hasMsgr","0"); query.Encode1(".chkP","Y"); query.Encode1(".done","http://user.auctions.yahoo.co.jp/jp/show/mystatus"); query.Encode1("login",ID); query.Encode1("passwd",PW); out.write(query.toString()); out.write("\r\n"); out.flush(); out.close(); /////////////(1)////////////////////////////// for (int j = 0; ; j++) { String header = uc.getHeaderField(j); if (header == null) break; System.out.println(uc.getHeaderFieldKey(j) + ": " + header); } } catch (Exception a) { System.err.println(a); } ちなみに(1)で出力されたヘッダ情報は null: HTTP/1.1 200 OK Date: Thu, 19 Dec 2002 07:16:58 GMT Refresh: 900; URL=http://www.yahoo.co.jp/ Cache-Control: private Pragma: no-cache Expires: Thu, 05 Jan 1995 22:00:00 GMT Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: B=el2pemcv02sja&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp 上記のレスポンスを取得してしまい、クッキーが取得できずに先に進めないのです。長くなってしまい、大変ご迷惑をお掛けしますがよろしくお願い致します。 では、失礼します。 |
>>2993 ruku いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを POSTすれば行けるんじゃないでしょうか。 この手のwebアプリはログイン後の画面ではCookieだけでなく、 それ以外の手段でもユーザを一意に識別する何らかの値を持ちまわらせ、 Cookieの(そのものでなく大抵はセッションオブジェクトなりDBなりに 入れた)値とのクロスチェックでユーザを認証している場合があります。 YAHOO!オークションがどうなっているかは知りませんが、 その手の仕組みが組み込まれているんじゃないでしょうか。 |
>>2993 ruku うまくいかないときのアプローチとしては、まずはやっぱり telnet とか Socket で直接つなぐ方がいいんじゃないでしょうかね。 アクセスに成功する QUERY は知っているし、失敗する QUERY も 知っているわけで (よくわかってませんが、OutputStreamWriter に 細工をすればリクエストの生データが取れるんですよね? ) その 2つの内容をつきあわせて一つ一つチェックすると。ないとは 思いますが、もしかしたら USER_AGENT で制限かけてたりする かもしれませんし。 |