パーミッションって大事

Google 検索で、「intitle:”index of” mp3 Description」といったキーワードで検索してみると、著作権法に保護されているはずの音楽ファイルが大量に、かつダウンロード可能な状態でヒットします。サーバ管理者/サイト運営者のデータ置き場が誤って公開状態になっていただけでは、Google の BOT は検索結果データベースに登録する事は出来ないはずなので、少なくともどこかパブリックな場所からリンクを貼られ、そこから自由にダウンロード出来るようになった結果ではないかな、と思いました。

Youtube やニコニコ動画といった動画サイトで、著作者以外がコンテンツをアップロードして共有する事は珍しくなくなりましたが、同時に手軽に著作物を公開してしまおうという敷居も低くなった気がします。Warez などのように、コンテンツがそのままの状態では使用できないように、何重にも工夫( ファイル分割やパスワード付与、URL の隠蔽… etc. )していた頃に比べて、必死さが見受けられないというか、悪い事をしている意識が見受けられないというか。まあ、それに関しては「ユーザのモラルが下がってるというか、エンドユーザが増える事による危機感の低下かなー」程度の感想しか持っていません。自分もそんなに危機感をビシバシ持ってるタイプではありませんが、root として最低限の事はしているつもりです。

* * *

MP3 以外にもいろいろなものが”おおっぴら”に落ちているので、Google 検索を眺めていったところ、ある PHP スクリプトファイルを見つけました。その PHP ファイルにアクセスすると、スクリプトが実行され、カレントディレクトリのファイル一覧に加えて、基本的なファイル操作用のコマンドボタンがいくつか、さらに exec コマンドをブラウザ経由でサーバに実行させるインタフェイスが付いていました。

その PHP スクリプトは誰が作ったものか分かりませんが、スクリプト経由で確認した PHP スクリプトファイルがあるディレクトリのパーミッションは 777。どうやら、誰かが仕込んだもののようでした。

ブラウザ経由からサーバに任意コマンドを実行させて結果を表示させるのは、別段、珍しい技術でもなく、むしろそれが出来なければ動的ページを吐けないものです。自分も何年か前に、Perl でコマンドを発行/表示する事が可能なウェブターミナルを書いて、昔の携帯電話のウェブブラウザでも簡単にサーバ管理が出来るようなスクリプトを設置していました。もちろん Basic 認証の下*1にですが。

* * *

「誰かが仕込んだとすれば、どうやって仕込むかなー」と考えた時、PHP アップローダが手軽な事に気付きました。あまりスクリプトに馴染みがないエンドユーザの増加、携帯やスマートフォンなどのアクセス手段の増加、安くて高品質かつ初心者でも手軽に使えるレンタルウェブサービスの増加、簡単に設置できる PHP スクリプトの配布サイトの登場、などなどが相俟って、PHP ファイルをアップロード許可している PHP アップローダが、Google 検索しただけでいくつか見つかりました。PHP スクリプトを配布しているサイトのものをそのまま設置したものや、自作コードによるものでしたが、どうみても危険です。本当にありがとうございました。

ここからはもちろん、自宅のサーバ上で試したものです。

  1. PHP ファイルのアップロードを許可している PHP アップローダを設置してみる。
  2. ブラウザより、先ほど拾ってきた PHP ターミナルスクリプトをアップロードする。
  3. サーバ上にアップロードされたターミナルスクリプトの URL を開いてみる。

うっわ、やっぱり実行されたΣ

試しに id コマンドを実行してみると、httpd 権限でスクリプトが動作している事を示す結果が表示されました。ほとんどのファイルは、read 権限だけで書き換える事は出来ませんが、閲覧は出来てしまいます。さらに、ファイラ機能やコマンドを用いてルートディレクトリ(/)にアクセスしてみましたが、もちろん、全てのユーザが rx できるパーミッションなので、ファイルシステムとしてアクセス禁止されていないところは、例え .htaccess だろうが .cgi ファイル*2だろうが、全ての内容を見る事が出来てしまいました。他人の個人ホームページでこのスクリプトを実行すると、

  • 掲示板のログやパスワード、メールフォームのメールアドレス → パスワードを数種類使い訳てないとメールアカウントが乗っ取られそう。
  • 携帯電話にファイルを送る為に一時的にウェブスペースに置いておいたファイル → アドレス帳とか写真とか。
  • メール自体 → ユーザディレクトリ以下に保管されている可能性が。
  • 担当さんにチェックしてもらうラフ原稿や、同僚に送る仕様書・プログラムソースコード

などなど、「URL さえ非公開にしていれば第三者の目にはつかない」と思っているユーザのファイルを危険に晒す事になります。

今回は自分ん家のサーバでしたが、suEXEC (user CGI 権限)をサポートしているレンタルサーバなどで実行したら、第三者がユーザディレクトリ以下のファイルを全部消してしまう事も可能になります。

また個人レベルで維持が可能なレンタルウェブサービスは、有料・無料に関わらず、数十人から数百人単位で一つのホストを共用して使用しているハズです。このようなサービスの利用者の一人が、PHP ファイルをアップロード可能な PHP アップローダを設置*3していると、その利用者だけではなく、同じホスト上の他の利用者のディレクトリまで参照可能となってしまいます。

さくらインターネットのレンタルサーバなどでは、同じホストの利用者間のプライベートはしっかりと確保されており、suEXEC は有効( PHP は user 権限で動作)、全ての一般ユーザは users というグループに所属され、各々のホームディレクトリ以下のパーミッションは g-rwx となっている為、利用者一人の誤ちで他の人の”どこからもリンクされていないファイル”が閲覧されたり、CGI や PHP の書き込みディレクトリにファイルを追加される恐れはありません*4

ただし、レンタルサーバでもセキュリティ意識が低い*5ところも数多くある為、何気なくホームページを運用している方は、一度、パーミッションを見直してみてはいかがでしょうか。もちろんこの後、自分もパーミッションを見直しました。

プライベートな ML やチャットなどでよく見かけますが、「URL は非公開、どこにもリンクしていないから大丈夫!」といって、安易に、第三者に見られたくないファイルをアップロードするのもいかがなものかと思いました。

*1:もっとちゃんとセキュアな環境にしたいなら、Basic 認証だけでは平文の username/password を渡す事となるので、SSL などを組み合わせなければなりません。お金かかるけど。

*2:正攻法?でアクセスすると、CGI の実行結果しか見る事が出来ませんが、この方法だとソースコードがそのまま読めてしまうワケです。あなたが設置している掲示板の CGI ファイルには、平文でパスワードなどが書いてありませんか?

*3:CGI の場合は、外部からアップロードされたファイルに対して -x しておけば、まず実行される事はありません。これは PHP の CGI モードも同じだと思います。

*4:もちろん、自分でホームディレクトリのパーミッションを変更したらアウトですが…

*5:/etc/shadow~ 644 とか。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください