【情報処理安全確保支援士】HTTPに関するセキュリティリスクについて(その3):HTTPメッセージのレスポンスヘッダによるセキュリティ対策

2021年11月28日日曜日

HTTP セキュリティ 情報処理安全確保支援士

t f B! P L


 HTTPに関するセキュリティリスクについて(その3)



前回の記事「GETとPOSTの違いとセキュリティ上の注意点」


HTTPメッセージのレスポンスヘッダにはサーバから返信したページの表示や挙動を制御できるものがありブラウザが対応しているヘッダであればユーザーに対してセキュリティ機能を強化することができます。


セキュリティを強化するレスポンスヘッダ一覧




レスポンスヘッダはWebサーバソフトのApatchnginxなどで常に出力するように設定できます。

システムに影響がないことを確認できればWebサーバソフト側で出力することで抜けがなく対応することができます

 



上記のヘッダだけ簡単に説明します。


X-Frame-Options

ブラウザがframeiframeでページを表示することの可否を指定します。

 

DENY(拒否)

ページをフレーム内に表示することはできません

SAMEORIGIN(同一生成元のみ)

ページ自体と同じオリジンのフレーム内でのみ表示される。

 

他社のWebプラットフォーム上で自社のコンテンツを表示させる場合などは、プラットフォーム側が安全な表示ができるAPIを用意していることがあります。

 

攻撃者が用意したフレーム内でページを表示させることでクリックジャッキングなどの手口で利用者が意図しない操作を行わせることが可能になってしまうので、入力フォームや確定処理のあるページではX-Frame-Optionsを指定したほうが良いでしょう。



X-Content-Type-Options

レスポンスデータを作成する際、Content-TypeヘッダにMIMEタイプを必ず指定していると思いますが、Content-Typeヘッダが欠落しているか、Content-Typeヘッダに指定されたMIMEタイプと送信されたデータのMIMEタイプが違う場合にブラウザはMIMEスニッフィングを行います。


MIMEタイプ指定例:(PHP
header('Content-type:text/html; charset=UTF-8');

例えばSafariMIMEスニッフィングではURLのファイルの拡張子をみてMIMEタイプを判断し実行します。これにより悪意のあるJavaScriptPNGなどの画像に偽装された場合、JavaScriptファイルが実行される可能性があります。


ここで、MIMEスニッフィングによる脆弱性をついた攻撃方法について簡単に説明します。



     攻撃者が悪意のあるJavaScriptを含んだPDFや画像を用意しサイトA公開ディレクトリにアップロードする

     サイトAではPDFや画像のContent-typeには「application/pdf」「image/png」を指定しているが、X-Content-Type-Options」は指定していない

     攻撃者がアップロードしたファイルのダウンロードURLをコピーする

(例:https//~/download.php?file=1234.pdf)※1234は乱数

     攻撃者がURLに細工をする

(例:https//~/download.php/a.html?file=1234.pdf

     攻撃者が工夫したURLを他サイトの掲示板に張り付けアクセスを誘導する

     受信したdownload.phpは「/a.html」の部分をパラメータとして受け取るが通常通りPDFファイルを送信する

     利用者が使用しているブラウザのMIMEスニッフィングURLからファイルの拡張子を識別して実行するものだと、ダウンロードしたPDFhtmlとして実行してしまい攻撃者が仕込んだJavaScriptが利用者のブラウザ上で起動してしまう



この問題を解決するために、「X-Content-Type-Options:nosniff」をレスポンスヘッダで出力することで、ブラウザはMIMEスニッフィングを行わずにレスポンスヘッダにあるContent-Typeを常に優先するようになります。

 

Content-Typeが指定されずにデフォルト値(PHPではhtml)を返していてMIMEスニッフィングにより画像などが表示されているページでは、「X-Content-Type-Options:nosniff」を返してしまうと表示されなくなってしまうのでWebアプリケーション側の対応を行った後に指定するようにした方が良いでしょう。



X-XSS-Protection

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

 

ブラウザによってはXSSフィルターという機能が実装されており、ブラウザが反射型XSS攻撃を検知するとページの読み込みを停止するものです。

この機能はデフォルトで有効ですが利用者によって無効化されていることもあり、X-XSS-Protectionヘッダを返すことで該当ページの設定を有効化することができます。

 

しかし、この機能を悪用する手口も出てきたことから、現時点ではXSSフィルター機能を廃止したブラウザもあります。




今後はContent-Security-Policyで保護されることになります。




Content-Security-PolicyCSP

Content Security Policyは画像、動画、JavaScriptCSSなどのアセットの読み込みや、<iframe>読み込み、XML-HttpRequestFetchによるリソースの読み込みをポリシーの宣言によって制限できるものです。インラインのCSSJavaScriptの実行も制限できます

 

これらの指定はディレクティブと呼ばれるキーバリュー形式のセット(値=ソースという)を使ってホワイトリストとして開発者が設定することになります。

指定が無い項目については基本的に「default-src」ディレクティブの設定が参照されるので「default-src ‘self’」であれば同一オリジンのみ許可、「default-src ‘none‘」であれば全て拒否になります。

 HTTPS接続に限定したい場合は「default-src https://*:443」などのように指定します。

 

設定できるディレクティブ表(一部)



Content-Security-Policy HTTPレスポンスヘッダまたは <meta> 要素で設定すると、ポリシーに抵触したリソースの読み込みや実行がすべてブロックされます。ポリシーの宣言が間違っていると、最低限必要なCSSJavaScriptが実行されず、ウェブサイトそのものが利用できないということになりかねません。

 

Content-Security-Policyを使用することでクロスサイトスクリプティングなどの攻撃に対する問題を大幅に軽減することができます。

その反面、システムにあったポリシーを設定するための難易度が高くデバッグ作業などのコストも多くかかるため導入しているサイトはまだ少ないのが現状です。

XSS攻撃による被害が多くなっていることから、XSSへの効果が大きいCSPの設定を導入していくことが安全なWebアプリケーションを作るために推奨されています。

 

とはいえ、すでに運用中のWebサービスに適用するのはリスクが高いので、Content-Security-Policyの代わりにContent-Security-Policy -Report-Onlyを利用することでポリシーに違反した際にはブロックは行わず、指定されたURLに内容を送信することもできます。

既存システムなどに導入する際はこちらを活用して設定を調整することにも利用できます。

 

今後、個人情報を多く扱うようなWebアプリケーションをリリースする際には脆弱性検査で必須の項目となる可能性もあるため要件定義でクライアントとセキュリティポリシーについて確認しておくことが大事になります。



Strict-Transport-SecurityHSTS

レスポンスヘッダにHSTSが指定されたHTTPのサイトへアクセスすると次回以降の一定期間はWebブラウザによりHTTPS接続を強制されます。

HSTSを使わずにサイトへのアクセスをHTTPSに限定するための実装方法として、HTTPアクセスをHTTPSリダイレクト301307)することが行われますが、この際、中間者攻撃によりHTTPSアクセスをHTTPにダウングレードされるリスクがあります。

HSTSではWebブラウザが強制的にHTTPSでの接続に置き換えてアクセスすることでこの問題を解決します。


Strict-Transport-SecurityHSTS)で指定できるパラメータ表



開発にあたって下記内容に注意する必要があります。

 

u  max-age で指定された期間はHSTSの指定を解除することができない

u  HSTSヘッダを受け取るたびに期間は再設定される

u  サブドメインにもHSTSポリシーを適用した場合はSSL化していないHTTPページにはアクセスできなくなる

u  HSTS Preloadリストへの登録・削除の反映は数か月かかることがある

 

HSTSの期限を最初は数分にして設定内容が正しいことを確認しながら段階的に伸ばしていくことが推奨されています。

 

HSTSの設定をしていても、最初の1回目はHTTPで通信がおこなわれるため安全ではありません。そこで、最初の1回目からHTTPS通信を行えるようにHSTS Preloadという仕組みをGoogle が推進し提供しています。

 

HSTS Preload は主要なWebブラウザ(IE11EdgechromesafariFirefox)で対応されています。

https://caniuse.com/stricttransportsecurity(対応表リンク)



      HSTS Preload リストが使用されるまでの流れ


      WebサービスをHSTS Preloadリストへの登録条件を満たすように設定する(条件は別途)

      ドメインの管理者がWebサイト上でHSTS Preload リストへの登録申請をする

https://hstspreload.org/

      数週間~1か月ぐらいでドメインのステータスが「preloaded」になる

      Webブラウザを最新版に更新してアクセスすると最初の1回目もHTTPSで接続される

 

 

HSTS PreloadリストはWebブラウザのソースにハードコーディングされます。

そのためリストから削除することは簡単ではなくchromeアップデートでユーザーに届くまでに数か月かかり、他のブラウザについては保証されていません。ただし、削除をリクエストする削除フォームは用意されています

 

 

HSTS Preloadリスト登録条件

      有効な証明書を提供する

      同じホストでHTTPからHTTPSにリダイレクトする

      全てのサブドメインにHTTPS経由でサービスを提供する

      基本ドメインのHSTSヘッダは下記条件を満たしている事

max-age は1年以上(31536000秒)

includeSubDomainsディレクティブを指定する

preloadディレクティブを指定する

HTTPSサイトから追加のリダイレクトを提供する場合,そのリダイレクトにもHSTSヘッダーが含まれていること

 

サイバー攻撃の増加を背景にWebサイトの全ての通信をSSLに対応させる「常時SSL」が推奨されています。ChromeなどではHTTPサイトへのアクセス時に表示される注意表記がだんだんと強化されてきており、HTTPアクセスだとユーザーに不安を与えつつあります。

 

また、Google透明性レポートhttps://transparencyreport.google.com/https/overview?hl=ja)によると、ChromeユーザーからのアクセスはLinuxを除く他のプラットフォームでは90%以上がHTTPSでのアクセスになっています。


202110月時点ではGoogle以外のトップ100サイト(世界のあらゆるWebサイトのトラフィックのおよそ25%)のうちデフォルトでHTTPSを使用しているのは97サイトという概算が出ています。

 

そのため今後はWebブラウザのアドレスバーにドメインだけ入力した際のデフォルトプロトコルがHTTPからHTTPSになる可能性もでてきました。

会社の公式ページをHTTPアクセスしか用意していなければ、会社のドメイン入力だけではアクセスできなくなり影響がでてしまうかもしれません。HTTPのページが残っている場合はHTTPSへの対応を検討しておいたほうが良いかもしれません。



次回:「Cookieに対するセキュリティについて」




このブログを検索

ブログをよくする

自己紹介

自分の写真
はじめまして。あまるちゃんです。 子供のプログラミング学習に協力できるように教え方を勉強中です。 このブログでは自分が学んだことを投稿していきます。

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

QooQ