_ おひさしぶりです。生きてます。風邪ひいてしばらく死んでたけど。
_ *BSD にはわりと古くあるコマンドに fromってのがある。BSD 発祥だけど、歴史が古いだけあって SysV 系でもたいてい使える。Linux では見たことないけどな。新着メールの送信者と到着時刻のリストを表示するというお便利コマンドなんだけど、今では活躍する機会があんまりない。だって mbox 形式しか使えないんだもん。Maildir な環境では使えないんだもん。
_ つーことで、風邪で死んでる間、布団の中でヒマだったので Maildir 版の from を書いてみた。sh で。
POSIX sh の機能をフルに使ってるので、Bourne sh では動かん。いや、POSIX sh の正確な仕様を把握してるわけじゃないんだけど、手元にある posix 準拠を謳うシェル(ash, bash, dash, ksh) ではみんな動いたんでたぶんだいじょうぶだろ。逆に、POSIX sh であれば、それ以外のものは一切必要としない。外部コマンドはまったく起動しないし、サブシェルすら生成しないという、完全に sh の内蔵機能だけで書かれた変態スクリプト。openssl base64 -d <<_EOF_ | gzip -dc H4sIAENFskkAA5VWbW+bSBD+DL9iDsM1OKIGO00bKG19clInOpwqTnU6WXzAsBh0 NuR4udRK8987+4KNE6c9I9nsvDwzz+zO7tL5rTdPs16ZyHKUxrE76J+YptSBs0Qu SRaRwpXDvM4q15RtUB+84eWfo8sb21XU8bV3rvS8IF1GafEo3yfpksCCVPldVUIY 26UNQbFwIMplwCcMSgKKiioF0oyrdInHthyHKWJdEgkw/vWX2+HNZ0WYSl0SfJ5a urpEwiQHpS6DBbEhLvIVzIzQx78YVpwfFUrgEXwFrA+/9x0g39JKBCFlEMpRnhG5 TNK4AvXoiKa5nIzAAEvXZUHfYuQVRQcEdnUEstQ0J07PJ0gXWV6QSGRwZBZXrkhZ gVEgXpTXy8i9At+/w8NOgDDIXlVQkCCCXc8tX7AceJRDXI44LyBGNjuuve7TCY83 063sOmINc0z1T3sG6IClT/CPFBBEUQHvWZRtTPVjE9HECdisArxYStwUEOZZlWY1 eZpSUOVJN3xnN4U/Oyf+7LbyZ19rn8mTzDdmX+782TDghnHi27osUabYGg/03Xn/ qOxqtA9U07QgKlgSCddRuNGZOb8xRsNz73pCO0ti5BoIb5wtiDqIQDodd2knb2pr sC7tovCYto8UUypxp9PtUSZc0rTX3RYvthd4DhMRdAo60P1jOhLjKKgI7yKc0GPl gvY54wBaANocNALa2NY8W5uC9rfSRPg8+boTIIJPB0YoE5jX6bIyKDWqmrLKYu3U 1AXRiGpQZajT4yOVniS63tuaPQaIGAB2EJGhem3PsfDsn+zxHOs9qpe5njcj836L zg25gQ737rTO6EJQ+YTKXr6R31D5li8UlU+p/BeJGtlk9qRuZIvKF0XayH0WP6ga mW9xNly71tlbk4+Xrtmir0a8DaiCn5QzUCMwFuyoGZy+OVaXWIPPdq8krRlmzTGS iGCgm0HdULWpfa2diNqxaTApPUol7Eeanw15LzIi9HjjwzSGpw/ng8QGFqVRJSST Vu5VIGaVLBGzIYK8nC2i/66FuCDzFgJ9lmCQf8ECI2D+OO6fvejfZOi/Y5U6L9Dy guLXtAZmCzG824swf5ZjfWCOq3rvZP0kx1W9/B852ohhvTiQ1ZTcHcjqOqwOzDHJ /2sQ2Jc7OSR8Vu6IiCaM053dO6YX2Ecdt72pjh0Htt3K7Z6we2j39tinwj5F+3SP PRL2yFVQUBoPQZbdV61TUL0HdUVB6thWPRujq+vNZfDsS+HZsW3p7dss3FxkVvOF cpuQgkBa4m5YkZJ+rlB667wu8B3mqzRbsA+Wef7t9bPPGw4O8KeGDbz8NV5QZ7R/ AN1Hm47tCQAA _EOF__ スクリプトの半分は date コマンド一発で済む日付計算なんだけど、実際に date に置き替えてみたら実行速度がだいぶ落ちたんでびびった。いくら外部コマンドの起動はコストが高いとはいえ、50行もあればさすがに外部コマンドを呼んだ方が速いかと思ってたのに。
_ SIGTERM と SIGKILL の違いを説明した。
_ 「kill -TERM ってのはさ、正確にいうと殺さないんだよ。カーネル自身は手を下さず、おめー死ね、と迫るだけなの。だからそのプロセスは必要に応じて身辺整理してから切腹するわけな。kill -KILL はそうじゃなくて問答無用で打ち首な。で、たいていの場合は切腹でカタがつくんだけど、それで死にきれないヤツがたまにいるんで、そういうときはしかたないから SIGKILL でカーネルが介錯してやるわけだ」
_ まわりで聞いてる人から「ひどい説明だ」と笑われたけど、わし間違ったこと言ってないよね。
_ apache のアクセスログを見てたら、なんか脆弱性のある php スクリプト(?)を探しにやってきた攻撃の中で、ディレクトリトラバーサルで /proc/self/environ を拾おうとしてるものがあった。なんだこれ。
_ 環境変数だったらそんな方法を使わずにごくごくあたりまえの方法で取得できるし、/proc/self ならばパーミッションは開いてるからそんなことしなくてもふつーに読めるはずのに、なんでこんなことするんだろ。
……というあたり? だとしてももっとマシな方法はあるよなぁ。よくわからん。
- ディレクトリトラバーサルが成功するかどうか(php がセーフモードで実行されてるかどうか)を確認するだけで、これ自体で侵入の意図はない
- OS が Linux かどうかの確認
- スクリプトに渡された環境変数ではなく、それを呼び出した httpd 自身の環境変数がほしい(php-cgi じゃなくて mod_php かどうかの確認?)