2017年11月24日金曜日

OWASP Top 10 2017に対する弊社脆弱性診断の対応

先日OWASP Top 10の最新リリースである2017版が正式に公開されました。

OWASP Top 10 - 2017 [PDF]

OWASP Top 10 2017の公開に向けては、RC1が公開された際に議論百出した後いったん破棄されるなど波乱の幕開けとなりましたが、その後別メンバーにて作成されたRC2の内容で正式版として公開されたようです。

OWASP Top 10は多く企業にてガイドラインとして使われていると思いますし、PCI DSSなどの別の標準から参照されていますので、脆弱性診断サービスの内容がOWASP Top 10 2017にどのように対応するかは関心のある方が多いと思います。本稿では、弊社脆弱性診断サービスがOWASP Top 10 2017にどのように対応するかについて説明します。弊社診断サービスには、簡易なものから順に以下のものがあります。詳しくは弊社ウェブサイトを参照下さい。

  • ウェブ健康診断
  • ライト診断
  • スタンダード診断(標準的・網羅的なリモート診断)
  • プレミアム診断(スタンダードに加えてソースコード診断を併用する)

なお、以下の説明では、OWASP Top 10 2017の各項目の日本語訳として、以下のNTTデータ先端技術株式会社の記事で使われている翻訳に従いました。記してお礼申し上げます。

A1 インジェクション

インジェクションは、SQLインジェクションやOSコマンドインジェクション等の総称で、旧版である2013年版からの据え置きです。弊社の脆弱性診断サービスはすべてのサービスで標準的に対応しています。IPA ウェブ健康診断仕様では下記の項目が該当しますが、弊社のスタンダート以上のサービスではより詳細の試験を行います。以下の項目についても同様です。
  • (A) SQLインジェクション
  • (D) OSコマンドインジェクション

A2 認証の不備

文字通り認証処理における脆弱性です。2013年版は「認証とセッション管理の不備」となっていてタイトル上は2017年版にてセッション管理が外れました。しかし、2017年版も内容としてはセッション管理を含んでおり、ほぼ同じ内容をカバーしています。弊社の脆弱性診断サービスはすべてのサービスで標準的に対応しています。IPA ウェブ健康診断仕様では下記の項目が該当します。
  • (J) 認証
  • (K) セッション管理の不備

A3 機密データの露出

この項目は2013年版ではA6でしたが、A3に昇格しました。
「露出」はExposureの訳ですが、データが「見ようと思えば見られる状態」であることを指します。2000年代初頭の情報漏えい事件の多くが、機密データがドキュメントルート下に置かれていて、そのURLが2ch等に投稿されて騒ぎになるというパターンが多かったのですが、これがExposureです。弊社の脆弱性診断サービスはすべてのサービスで標準的に対応しています。IPA ウェブ健康診断仕様では下記の項目が該当します。
  • (E) ディレクトリ・リスティング
ただし、OWASP Top 10の解説を読むと、データの暗号化やハッシュ値による保存が強調されています。リモート診断(スタンダード)では、HTTPSによる保護は診断できますが、サーバー内部で暗号化保存されているかどうかは原理的に診断できません。これに対して、ソースコード含めて確認するプレミアム診断では、サーバー内部でのデータ暗号化についても確認できます。

A4 XML外部実体参照(XXE)

XML外部実体参照(XML External Entities; XXE)とは、XMLの外部実体参照の機能を悪用した攻撃および脆弱性であり、2017版でTop 10初お目見えとなりました。XXEに関する日本語ドキュメントはあまり多くありませんが、例えば海老原昂輔氏の下記のスライドが参考になります。

XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb…

以下、簡単なサンプルを用いてXXEを説明します。以下は、POSTデータとしてXMLデータを受取り、その中から<data>タグを持つ最初の要素をとりだし、その要素内容をXMLとして返す簡単なPHPスクリプトです。

<?php
  header('Content-Type: text/xml; charset=utf-8');
  $doc = new DOMDocument();
  $doc->loadXML(file_get_contents('php://input'));
  $data1 = $doc->getElementsByTagName('data')->item(0)->textContent;
  echo "<data>". htmlspecialchars($data1). "</data>";
このスクリプトに以下のXMLデータを与えます。
<?xml version="1.0"?>
<!DOCTYPE str [
<!ENTITY wget SYSTEM "http://192.168.0.2/">
]>
<str><data>&wget;</data></str>
すると、上記3行目で定義される外部実体が処理され、http://192.168.0.2/を参照した結果がXMLとして返されます。外部からは参照できないプライベートアドレスの内容が外部に漏洩することになります。
この種の攻撃は、XXE脆弱性を悪用したSSRF(Server Side Request Forgery)攻撃と呼ばれます。SSRF攻撃とは、ウェブサーバー等を中継して、外部からは到達できない別のサーバーやネットワーク機器等に攻撃することを指します。
また、URLではなくサーバー内のローカルファイル名(/etc/passwd等)を書くと、ディレクトリトラバーサルのように、サーバー内部のファイルを閲覧できます。

ただし、PHPでこの種の攻撃が設立するには、libxml2のバージョンが古い必要があります。上記の実験はまったくパッチを当てていないCentOS 6.3では成功しましたが、CentOS 6.4ではlibxml2にパッチが当たっていて成功しません。
弊社の脆弱性診断サービスはスタンダード以上のプランでXXEの診断に対応します。スタンダード診断ではリモート診断の手法により、既知の攻撃パターンを用いて脆弱性の有無を検証します。プレミアム診断では、これに加えてソースコードの確認により、より深い診断が可能です。

A5 アクセス制御の不備

アクセス制御の不備は、IPA 安全なウェブサイトの作り方の「アクセス制御や認可制御の欠落 」に該当します。すなわち、認証を必要とするページに認証なしでアクセスできたり、強い権限が必要な機能を弱い権限で使用できる問題などを含みます。この項目は、2013年版の「A4 安全でないオブジェクト直接参照」と「A7 機能レベルアクセス制御の欠落」をマージしたものです。
弊社の脆弱性診断サービスはすべてのサービスで標準的に対応しています。IPA ウェブ健康診断仕様では下記の項目が該当します。
  • (L) 認可制御の不備、欠落 

A6 セキュリティ設定のミス

文字通りセキュリティ設定の不備による問題を指します。典型例としては、デフォルトパスワードのままでソフトウェアを使用していたり、詳細のエラー内容やスタックトレースがウェブページに表示される状態などです。2013年版ではA5でした。
弊社の脆弱性診断サービスでは、スタンダード以上のプランで標準的に対応しています。また、ウェブ健康診断とライトプランでも、下記項目はセキュリティ設定のミスとも考えられます。また、他の診断項目の結果として副次的に判明した場合は報告いたします。
  • (E) ディレクトリ・リスティング

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

おなじみのクロスサイトスクリプティングです。2013年版ではA3でした。弊社の脆弱性診断サービスはすべてのサービスで標準的に対応しています。IPA ウェブ健康診断仕様では下記の項目が該当します。
  • (B)クロスサイト・スクリプティング

A8 安全でないデシリアライゼーション

この項目は2017年版からの新規導入となります。「安全でないデシリアライゼーション」はPHP界隈ではオブジェクトインジェクションと呼ばれる場合もあります。詳しくは以前に書いた以下の記事を参照下さい。

安全でないデシリアライゼーション(Insecure Deserialization)入門

弊社の脆弱性診断では、安全でないデシリアライゼーションはウェブアプリケーション診断の標準としては診断していませんでしたが、OWASP Top 10入りを受けて、スタンダード診断以上にて以下のように診断項目に含めることにしました。

スタンダードプラン(リモート診断):
リモート診断にてベストエフォートの診断を実施します。脆弱なアプリケーションの例として、Welcartの1.9.3を題材とします。Welcartにて会員ログインすると、以下のようなクッキーが発行されます。
a%3A2%3A%7Bs%3A4%3A%22name%22%3Bs%3A0%3A%22%22%3Bs%3A3%3A%22rme%22%3Bs%3A0%3A%22%22%3B%7D
これをパーセントデコードすると以下の形になります。
a:2:{s:4:"name";s:0:"";s:3:"rme";s:0:"";}
これはPHPのシリアライズ形式であることがわかります。シリアライズ形式がクッキーとして発行されている限りは、これをデシリアライズしている可能性が高いと考えられます。このようなケースでは、「安全でないデシリアライゼーションの可能性」として報告します。
現実には、クッキーは発行しているが利用していないケースとか、自作のデシリアライザを用いて安全に処理している(可能性は低いと思いますが…)可能性もあるので、あくまで可能性であり、過検知の可能性はあります。しかし、シリアライズ形式を外部に出すこと自体が好ましくないため、指摘自体は有益なものと考えます。一方、特殊なシリアライズ形式で見かけ上は単なるXMLにしか見えないケースなど、見落としの可能性もありえます。

プレミアムプラン:
プレミアムプランではソースコードの確認を行うため、各言語のデシリアライズ機能を確認することにより、精度の高い診断が可能となります。

A9 既知の脆弱性を持つコンポーネントの使用

文字通り、ソフトウェアから使用しているコンポーネントに既知の脆弱性があるケースを指します。この項目は2013年版でもA9でした。
弊社の脆弱性診断では、この項目は基本的にプラットフォーム診断として実施していますが、アプリケーション診断でも判明する場合があり、その場合は報告しています。
既知の脆弱性の代表例としてSturts2の脆弱性がありますが、リモートからの診断ではStruts2のバージョン把握等には限界があります。ヒアリングの結果、必要に応じてリモートログインさせていただいての内部からの診断を提案させて頂く場合があります。

A10 不十分なロギングおよび監視

こちらも2017年版からの新設になります。ログ取得は攻撃の検知および事後調査に重要ですし、攻撃に対する監視もできれば実施するべきでしょう。
通常のリモートからの脆弱性診断では、A10の項目を外部診断業者が診断することは困難です。このため、この項目は弊社のスタンダード診断では未実施となります。
プレミアムプランでは、ソースコードを確認するため、ログ取得の状況を確認することが可能です。一方、監視についてはソースコードを確認しても判明しません。
監視をカバーする弊社サービスとしては、ウェブアプリケーションアセスメントがあります。このサービスは通常の脆弱性診断に加えて監査手法を併用し、アプリケーションの運用状況やログの活用、監視の状況などを確認し、サイト運営の改善点を指摘するものです。

診断対応のまとめ


ウェブ健康診断・ライトスタンダードプレミアムアセスメント
A1 インジェクション
A2 認証
A3 機密データの露出◎(*1)
A4 XXE
A5 アクセス制御の不備
A6 セキュリティ設定のミス
A7 XSS
A8 安全でないデシリアライゼーション
A9 既知の脆弱性を持つコンポーネント
A10 不十分なロギングおよび監視◎(ログ)◎(監視)

*1 サーバー内のデータ暗号化も確認

凡例
◎:標準的で網羅的な検査
○:抜き取り診断
△:簡易的な診断
-:非対応

まとめ

OWASP Top 10の改定に伴い、弊社診断サービスと新OWASP Top 10 (2017)とのマッピングについて紹介しました。2017年版は、XXEや安全でないデシリアライゼーション等、従来日本ではあまり話題にならない項目も含まれており、診断業者としても対応を迫られています。新規の脆弱性診断はもちろんのこと、既に診断済みサイトに関してもこれら新規項目について安全性を確認する機会ではないでしょうか。
弊社のサービスが貴社ウェブサイトの安全に寄与できれば幸いです。