ウェブ・セキュリティ基礎試験 (徳丸基礎試験)に合格しました

沖縄チームのキリです。先日表題の試験を受験しました。セキュリティエンジニアの徳丸浩さんの著書である「体系的に学ぶ安全なWebアプリケーションの作り方」(以下徳丸本)を題材とした試験で、PHPやRuby、Pythonなど、Web上で動作するアプリケーション開発を行うにあたってほぼ必須のセキュリティ知識が問われます。

試験についてはPHP技術者認定機構のページを確認ください。

https://www.phpexam.jp/tokumarubasic

これまでの業務経験でウェブセキュリティの独学はしていましたが、受験対策としては徳丸本の前半を流し読みする程度しか間に合いませんでした。結果としては800点で合格でしたので、基礎というだけあって日頃セキュリティについて意識していればそう難しいものではないかと思いました。

例によって問題内容に触れるようなことは禁止されていますが、徳丸本を題材とした試験ですのでその範囲が抑えられていれば問題ありません。どのような攻撃方法があり、どのような脆弱性が対象になり、適切な対策はどのようなものか、というところをしっかり覚えておくと実務にも役立ちます。せっかくなので代表的な攻撃方法をいくつか紹介します。

ウェブアプリケーションに対する代表的な攻撃

XSS(クロスサイトスクリプティング)

英語表記を頭文字を取るとCSSですがスタイルシートと被るのでXSSが略称とされているようです。基本的には攻撃者が任意のJavaScriptを仕込む攻撃方法です。PHPの場合htmlspecialchars()関数かhtmlentities()関数を使うと大抵の場合回避できます。文字エンコーディングやファイルアップロード等、非常に多彩な攻撃手段があるので気をつけることは多いですが、テキストを扱う部分はすべてUTF-8で統一して変数を表示するときには確実にHTMLエスケープ処理をすることを徹底しておけば大丈夫だと思います。

CSRF(クロスサイトリクエストフォージェリ)

こちらもクロスが入りXSRFとも表記されますがCSRFが使われることが多いです。こっちは罠ページや罠リンク経由で正常にログインしているユーザーの権限で任意の操作を行われる攻撃です。昔mixiでリンクを踏んだら『ぼくはまちちゃん!こんにちはこんにちは!!』という内容の罠リンク付きの日記が投稿されるはまちちゃん騒動というものがあり、それで一気に注目を浴びた攻撃手段らしいです。対策としてはランダムに生成したトークン文字列をセッション変数に持たせつつHTMLに埋め込み、フォームやAjaxのリクエストで送信するようにします。リクエストを受け取ったときにセッションに保持しているトークンと送信されたトークンが一致しなければ不正なリクエストとして拒否します。手動でやると少し面倒ですがLaravelの場合はミドルウェアで自動的にチェックしてくれるので便利です。トークンは毎回生成しなおすことが必須ではありませんが、ページ読み込みの度に再生成することで多重リクエストを防ぐこともできるので一石二鳥です。

SQLインジェクション

SQL文の組み立てに外部入力を使っているところに任意のSQLを流し込むやべー攻撃です。最悪の場合DB上のすべての機密情報を盗まれたりすべてのデータを削除されたり書き換えられたりします。対処法はプレースホルダーを使うこと一択と認識しておくとよいです。素のPHPだとPDOのprepare()を使用可能です。Laravel等のフレームワーク使っててもDB::rawのように生SQL実行できる手段もあるので、そこで外部入力をそのまま使うとSQLインジェクション脆弱性になるので要注意です。

ディレクトリトラバーサル

ファイルパスが外部から指定できるようなシステムになっていると../../../../../etc/passwdのように通常許可されない上位の階層を辿ってファイルを取得されたり書き換えられたりする攻撃です。ファイルアップロード時に受け取ったファイル名をそのままシステムで利用しているような場合も危険です。アプリケーションでファイルパスを取り扱う場合は、たとえば連想配列で指定可能なファイルパスを用意し、利用者はそのキーを指定する、のように直接ファイルパスを入力させないようにしましょう。またファイルアップロード時には保存先のファイル名をランダム文字列にすると安全です。ファイル名だけを抜き出す方法もありますが、文字エンコーディングの不備で攻撃が通ってしまう場合もあるのでできる限り避け、どうしても必要な場合は厳重にバリデーション処理をしましょう。

安全なウェブサイトの作り方

https://www.ipa.go.jp/security/vuln/websecurity/index.html

セキュリティ対策の第一歩は『この実装は安全かな?』と疑うことだと考えています。情報処理推進機構(IPA)の安全なウェブサイトの作り方のページに主要なウェブアプリケーションの脆弱性とその対策についてまとめられています。ウェブアプリケーションを作るに当たってどのような対策が必要になるのか、怪しい実装をしていないか意識するために、ひととおり目を通しておくことをオススメします。