虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

(書籍レビュー)大企業のWebサイトの脆弱性発見事例が学べる「リアルワールドバグハンティング」

あけましておめでとうございます。CTOの野田です。 オライリー社の「リアルワールドバグハンティング」(https://www.oreilly.co.jp/books/9784873119212/)を読みましたのでその感想になります。

本を読んだきっかけ

この本は発売されたのが2020年09月と発売してから暫く経っていますが、オライリー新刊のタイトルを必ずチェックしている私の視界には当時入ってきませんでした。 表紙がカマキリなこと、「リアルワールド」「ハンティング」というタイトルから本当にリアル世界で虫をとる本かと思って手にとっていませんでした(最近DIYや健康の本もオライリーは出しているのでありえない話ではないと当時思っていました)

最近セキュリティ系の本を探していたときに改めてアンテナにひっかかったので今回を機会に読み始めました。

全体的な本の概要

実際の企業で起きたバグの内容とその報奨金、バグが発見された経緯などが脆弱性の種類ごとにケースとしてまとまっており事例集としてわかりやすい。 事例としてはこのようなもの

Twitterのサブスクライブ解除通知
難易度: 低
URL: http://twitter.com/
ソース:  https://blog.mert.ninja/twitter-hpp-vulnerability/
報告日: 2015年8月23日
支払われた報酬:$700

バグバウンティプラットフォームとして有名なHackerOneで取り上げられた事例や、HackerOneそのものに対する脆弱性の話題が多い。

techblitz.com

セキュリティの教科書ではないので各種のバグの内容の解説は比較的簡素になっており、複雑な脆弱性の再現手順を文字だけで全部説明しようとしており図がないのである程度知識がないと理解しづらい。またAmazonのレビューでは翻訳に難ありとも書かれており、たしかにそう感じる部分もありました。

ただし内容密度は濃く書籍の値段(紙で3300円)以上の価値があり、多くの事例と知見が得られる良書だと感じました。セキュリティの基本的な教科書(例えばIPAのセキュリティ系の資料)を読んだ後に読み込むと実践版の教科書として役に立つと思います。

各章の要約

■はじめに

本書ではエシカルハッキング(倫理的ハッキング)の世界を紹介する。

■1章 バグバウンティの基本

バグバウンティ=倫理に基づいて脆弱性を発見した人に対し、Webサイトあるいは企業が贈る報酬。 HTTPの仕組みが解説されている初歩的な章。

■2章 オープンリダイレクト

Webサイトのリダイレクトの動きを攻撃者が任意に書き換えられる脆弱性について書かれてある。 主な例はURLのリクエストパラメーターにリダイレクトURLが直接書かれている場合など。 事例の会社としてはShopifyが紹介されている。

■3章 HTTPパラメーターの汚染(HPP)

攻撃者からのHTTPのパラメーターの改ざん、意図的な挿入をクライアントサイド、サーバーサイドでチェックを実施していない場合に起こる脆弱性の話。特に単純にURLパラメーターの値を書き換えるのではなく、正規のURLパラメーターと値を書き換えたURLパラメーターを追加した場合に発生する脆弱性について書かれてある。(例えば http://hoge/?user=tanaka&user=hacker) 事例の会社としてはTwitter社が主に紹介されている。

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

CSRFの一般的な例と防ぐための策となるCSRFトークンの基本的な話。 またShopifyのTwitter連携の脆弱性(連携解除がGETで不正にできてしまう)の例をあげてGETでデータ更新をすべきでないと書いてある。

■5章 HTMLインジェクションとコンテンツスプーフィング

HTMLインジェクションの事例としてCoinbase社での事例を取り上げ、入力された値に対してのHTMLタグフィルタリングは機能していたが、HTMLエンコードされた値を入力した場合はそのままHTMLとして描写されてしまっていた事例を紹介している。 コンテンツスプーフィングの例としてWordPressの管理画面のURLパラメーターを書き換えてログイン画面にコンテンツを挿入するよくある例が紹介されている。

■6章 キャリッジリターンラインフィードインジェクション

GETリクエストパラメーターに不正に改行コードを挿入し、HTTPレスポンスを分割し任意のレスポンスが生成できてしまう事例について書かれてある。

■7章 クロスサイトスクリプティング

例としてはよくあるjavascript:alert(1)の話から始まり、ページの描写やページ処理に影響を与えるURLパラメーターには常に注意せよという内容。 XSS脆弱性の事例会社としてGoogleが取り上げられており、巨大企業でかつメジャーな脆弱パターン(XSS)であっても脆弱性は起こりうることが書かれてある。またXSS対策のベストプラクティスとして、ユーザーからの入力をDBに保存するときにサニタイズするのでなく、その入力データを描写するときにサニタイズすることとしている。(理由は本を読むこと)

■8章 テンプレートインジェクション

サーバーサイドテンプレートインジェクション(SSTI) の説明 (対象としてはSmartyやHaml)、クライアントサイドテンプレートインジェクション(CSTI)の説明(対象としてはReactやAngular)の後に実際の事例について紹介されている。

■9章 SQLインジェクション

単純なリクエストのデータ書き換えによるSQLiから始まり(test’ OR 1=‘1)、リクエストとして送信するBase64エンコードされたJSONデータをデコードしSQLiがおきるように改ざんし送信した結果、脆弱性が発見されたUber社が事例としてあがっている。

■10章 サーバーサイドリクエストフォージェリ

SSRFはサーバーがユーザーの入力したURLを検証せずにそのURLに対して取得のリクエストなどを行う場合に発生する。SSRFが見つかった場合の脅威事例としてAWSを使用していた場合に、リクエストしてきたサーバーのクレデンシャルを返すAWSの公式サーバーへのリクエストを行うようにされる脅威について書かれてある。

■11章 XML外部エンティティ XXE(XML External Entity, XXE攻撃)

XMLをアップロードできるサイトに起こりうる脆弱性。 XMLファイルだけでなくXMLを利用したOfficeファイル(docx, xlsx等)をアップロードできそれをパースするWEBアプリケーションも注意が必要。

■12章 リモートコード実行(RCE)

WEBアプリケーション側でシェルコマンドを実行するコードが実装されており、さらにユーザーから入力された値をサニタイジングしない場合に起こる脆弱性。ただし実装したアプリケーションがシェルコマンドを直接使っていない場合でも使用しているライブラリが間接的に使っている場合がありその場合脅威となりうる。例として2016年5月のImageMagickの件が紹介されている(CVE-2016-3714)

www.jpcert.or.jp

■13章 メモリの脆弱性

WEB開発言語(PHPやRuby)ではCやC++で起こりうるメモリ管理について注意する必要は通常ないが、WEB開発言語自体がC言語で書かれている(ことが多い)以上は、常に文字列やバイトの長さには注意するべきだと書かれてある。

■14章 サブドメインの乗っ取り

サービス終了に伴うドメインの設定の削除忘れに伴い、使われなくなったドメインをそのまま攻撃者が乗っ取る事例について紹介されている。HerokuとCNAME設定の組み合わせ、S3とCNAME設定の組み合わせなどで起こり得る。

■15章 レース条件

レース条件=ある初期状態に基づく2つの処理があり、それらの処理中にこの初期条件が無効になり処理の終了が競合する場合に生じる。 銀行口座を例にとり

残金:500の場合に
処理A. 銀行残高500 -> X社に送金500
処理B. 銀行残高500 -> X社に送金500 
処理Aの処理が終わる前に処理Bを再送信のつもりで送ってしまうと結果的にX社にデータ上は1000送金されてしまう問題。

イベントの招待を人数制限しているWebサイトに対して残り1枠に対して、攻撃者が複数アカウントを作成し同時に申し込むことで上限枠を突破して枠を申し込みできる事例を紹介している。

■16章 安全でないダイレクトオブジェクト参照 (IDOR)

www.ほげ.com/user?id=1がユーザーID1しか見れない仕様だとした場合
www.ほげ.com/user?id=2をユーザーID1が見れてしまうような事象。

上記のような単純なリクエストパラメーターの例だけでなくPOSTリクエスト、JSONレスポンス等の中のidなど推測されやすい値は攻撃対象になり得るという内容が書かれてある。

■17章 OAuthの脆弱性

OAuth2.0の基本的な説明と代表的な脆弱性について紹介されている。 例えばリダイレクトURLのチェックが、URLパス全体に対してではなくドメインのみチェックしている場合、さらに言うとドメインのチェックがサブドメインを含まずにチェックしている場合に問題がおきる例を挙げている。

■18章 アプリケーションロジックと設定の脆弱性

いままでの章のカテゴリに属さない様々な脆弱性とその探し方について解説がされてある。

  • とあるWEBアプリケーションの例で、初めてログインしたブラウザに対してIPごとの電話認証をかける処理があるが、PCブラウザでは実施してモバイルブラウザでは実施してない場合の脆弱性。
  • ある程度の推測されるワードの組み合わせから特定のドメインに対しての非公開S3バケット名の探索とその権限のチェック。

■19章 独自のバグバウンティの発見

バグバウンティを行うにあたってのツール群の紹介、基本的な脆弱性発見の糸口などのアプローチが書いてある。各種カテゴリごとの脆弱性を扱っている他の章よりも重要度は高く先にこの章を読んでおくのも吉。

■20章 脆弱性レポート

脆弱性報告の書き方が書いてある

  • 再現性を動画にすること。
  • 焦ってレポートを出す前にそれが既知のバグでないか?を冷静になって調べてから報告すること。

■付録A ツール

バグバウンティに使えるツールリストの紹介がある。 まずなにか試したい人はここを見るだけでも価値のあるリスト。

■付録B リソース

セキュリティを学習するために勉強できるサイトを紹介している(ほとんど英語) 日本のバグバウンティングのサービス(https://bugbounty.jp/ )も紹介されている。


要約は以上です。

私が思った、おすすめの「リアルワールドバグハンティング」の使い道

  • 自社の脆弱性診断リストを作成するときの参考にする
  • 自社でバグバウンティ制度の検討をしてみる
  • 自社でセキュリティチェックしたいときに付録Aのツールを参考に脆弱性診断をしてみる

P.S.

採用

虎の穴では一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
yumenosora.co.jp

LINEスタンプ

エンジニア専用のメイドちゃんスタンプが完成しました!
「あの場面」で思わず使いたくなるようなスタンプから、日常で役立つスタンプを合計40個用意しました。
エンジニアの皆さん、エンジニアでない方もぜひスタンプを確認してみてください。 store.line.me