前回は、セッション管理の不備、リダイレクト処理、クッキー出力による脆弱性対策についてまとめた。ここでは、メール送信、ファイルアクセス、OSコマンド呼び出しによる脆弱性対策についてまとめる。
1 メール送信の問題
メール送信の問題の概要
- メールヘッダ・インジェクション脆弱性
- hiddenパラメータによる宛先保持:hiddenパラメータの送信先アドレスを任意のアドレスに変更することにより、迷惑メールの送信に悪用される可能性がある
- メールサーバーによる第三者中継(参考)
メールヘッダ・インジェクション脆弱性
概要
メールヘッダ・インジェクションとは、メールメッセージの宛先や件名などヘッダフィールドに改行を挿入することにより、新たなフィールドを追加したり本文を改ざんするものである。
- 発生箇所:メール送信機能のあるページ
- 影響箇所:直接影響を受けるページはない。メールを送られたユーザが被害を受ける
- 影響の種類:迷惑メールの送信、メールの宛先や件名・本文の改ざん、ウイルス添付メールの送信
- 影響の度合い:中
- 利用者関与の度合い:不要
- 対策の概要:メール送信には専用のライブラリを使用した上で、以下のいずれかを行う。外部からのパラメータをメールヘッダに含ませないようにする。含ませる場合は改行を含まないようにチェックする
攻撃手法と影響
- 宛先の追加:Bcc
- 本文の改ざん:メール欄のFromアドレスに1行空行をはさんで本文を記述する
- メールヘッダ・インジェクション攻撃で添付ファイルをつける
脆弱性が生まれる原因
アプリケーションが改行をチェックしていない場合に、ヘッダや本文を追加・変更できること。HTTPヘッダ・インジェクション脆弱性の発生要因とよく似ている。
対策
- メール送信には専用のAPIやライブラリを使用する
- 外部からのパラメータをメールヘッダに含ませないようにする
- 外部からのパラメータには改行を含まないようにメール送信時にチェックする
- 保険的対策:メールアドレスと件名のチェック。メールプロトコル(特にSMTP)の理解が不可欠
2 ファイルアクセスによる問題
ファイルアクセスによる問題には、以下の2つの攻撃が可能になる場合がある。ディレクトリ・トラバーサルとOSコマンド・インジェクション(後述)である。
ディレクトリ・トラバーサル脆弱性
概要
ディレクトリ・トラバーサルとは、Webサーバー内のファイルに対する不正アクセスのことである。
- 発生箇所:ファイル名を外部から指定できるページ
- 影響箇所:すべてのページ
- 影響の種類:秘密情報の漏洩、データの改ざん・削除、任意のスクリプトの実行、アプリケーションの機能停止
- 影響の度合い:大
- 利用者関与の度合い:不要
- 対策の概要:以下のいずれかを行う。外部からのファイル名を指定できる仕様を避ける。ファイル名にディレクトリ名が含まれないようにする。ファイル名を英数字に限定する
攻撃手法と影響
親ディレクトリを示す「…/」の影響とヌルバイト([NUL])によりファイル名が終端されることを利用するなど。
脆弱性が生まれる原因
- ファイル名を外部から指定することができる
- ファイル名として、絶対パスや相対パスの形で異なるディレクトリを指定できる
- 組み立てたファイル名に対するアクセスの可否をチェックしていない
対策
以下のいずれかを実施すること。
- 外部からファイル名を指定できる仕様を避ける:ファイル名を固定にする・セッション変数に保持する・直接指定するのではなく番号などで間接的に指定する
- ファイル名にディレクトリ名が含まれないようにする:PHPではbasename関数
- ファイル名を英数字に限定する
意図しないファイル公開
概要
意図しないファイル公開とは、秘密ファイルをWebサーバーの公開ディレクトリに配置している場合に、ファイルに対するURLがわかることでそれを閲覧されてしまうことである。
- 発生箇所:Webサイト全体
- 影響箇所:公開されたファイルのみ
- 影響の種類:重要情報の漏洩
- 影響の度合い:中〜大
- 利用者関与の度合い:不要
- 対策の概要:非公開ファイルを公開ディレクトリに置かない。保険的にディレクトリ・リスティングを無効にする
攻撃手法と影響
ディレクトリ・リスティング(Directory Listing)という、URLでディレクトリ名を指定した場合にファイル一覧を表示する機能を悪用すること。
脆弱性が生まれる原因
- ファイルが公開ディレクトリに置かれている
- ファイルに対するURLを知る手段がある:ディレクトリ・リスティングが有効、ファイル名が日付やユーザ名や連番で類推可能など
- ファイルに対するアクセス制限がかかっていない
対策
- アプリケーションの設計時にファイルの安全な格納場所を決める
- レンタルサーバーを契約する場合は非公開ディレクトリが利用できることを確認する
- 保険的にディレクトリ・リスティングを無効にする
3 OSコマンド呼び出しの際に発生する脆弱性
OSコマンド・インジェクション
概要
OSコマンド・インジェクションとは、シェル経由でOSコマンドを実行する場合や、開発に用いた機能が内部的にシェルを用いて実装されている場合、意図しないOSコマンドまで実行可能になる現象のことである。シェルとは、ユーザの操作を受け付けて、与えられた指示をOSの中核部分に伝えるソフトウェアのこと。WindowsではExplorerやコマンドプロンプトが、Mac OSではFinderが、UNIX系OSではbashやcshなどがシェルにあたる。
- 発生箇所:シェルを呼び出す機能のある関数を実行している箇所
- 影響箇所:すべてのページ
- 影響の種類:秘密情報の漏洩、データの改ざん・削除、外部への攻撃、システムの停止など
- 影響の度合い:大
- 利用者関与の度合い:不要
- 対策の概要:以下のいずれかを行う。シェル呼び出し機能のある関数の利用を避ける。シェル呼び出し機能のある関数には外部からのパラメータを渡さない。OSコマンドに渡すパラメータを安全な関数によりエスケープする
攻撃手法と影響
- sendmailコマンドを呼び出すメール送信の例
- OSコマンド・インジェクションによる攻撃と影響:「;cat /etc/passwd」
脆弱性が生まれる原因
1行の指定で複数のプログラムを起動するというシェル機能の悪用によって発生する。条件は以下の3つ。
- シェル呼び出す機能のある関数(system、openなど)を利用している
- シェル呼び出し機能のある関数にパラメータを渡している
- パラメータ内に含まれるシェルのメタ文字をエスケープしていない
対策
以下のいずれかを行う(優先順)。
- OSコマンド呼び出しを使わない実装方法を選択する
- シェル呼び出し機能のある関数の利用を避ける
- 外部から入力された文字列をコマンドラインのパラメータに渡さない
- OSコマンドに渡すパラメータを安全な関数によりエスケープする
- 保険的対策:パラメータの検証。アプリケーションの稼働する権限を最小限にする。WebサーバーのOSやミドルウェアのパッチ適用
最後に
メール送信においては、専用のライブラリを使い、外部からのパラメータをメールヘッダに含ませないようにするか、改行を含まないようにメール送信時にチェックすること。ファイルアクセスにおいては、ファイル名を外部から指定しないこと。OSコマンド呼び出しにおいては、そもそもOSコマンド呼び出しを使わない実装方法を選択し、難しければシェル呼び出し機能のある関数の利用を避けることが重要である。
著書では参考文献として、網野衛二「3分間HTTP&メールプロトコル基礎講座」や、佐名木智貴「セキュアWebプログラミングTips集」などが挙げられている。興味のある方は読んでみることをおすすめする。
次回は、ファイルアップロード、インクルード、eval、そして共有資源に関する問題についてまとめる。
![]() |