げんたろう's備忘録

セキュリティに関して思ったことをまとめます。

C1 ブラウザの脆弱性とそのインパクト

スライド資料については
https://speakerdeck.com/nishimunea/burauzafalsecui-ruo-xing-tosofalseinpakuto
にてアップロードされています。
記述することのほとんど全てはスライド上にあります。
また、内容については僕がスライドを読んで思ったこと、考えたことを書いています。なので、お二人の思いや伝えたい内容を十全に伝えられていない可能性もあります。
真にお二人の話された内容を知りたい方は上記の資料を読まれることをおすすめします。

講師のお二人の簡単なプロフィール

Masato Kinugawaさん
ドイツのCure53という企業に所属されている。
ご飯を食っていけるぐらい脆弱性報奨金で稼いでた(現在進行形かもしれない)

西村 宗晃さん
株式会社リクルートテクノロジーズに所属されている。
朝電車でコミット履歴とか仕様書とかを読んで日夜脆弱性を探しているらしい・・・。

講義

講義は、お二人の経験に基づく脆弱性探しのポイントをお話しされる形です。

ブラウザのモジュール

ブラウザがいろんな機能を持っていることは、多くの人が知っている事実ですが、それらは多くのモジュールによって構成されています。
まずはブラウザはどのようなモジュールで構成されているかを知るところから始まりました。

ブラウザには、Html,XML,SVG...等々のパーサやJS,VBS,asm.js等々のスクリプトエンジン、ネットワークプロトコルなどなどなどなど・・・・
物凄く沢山あるらしいです。
そりゃあ脆弱性の1つや2つや100つぐらいありますよね。

プロが教える脆弱性発見の狙い目

  • 新しい機能

そうか!新しい機能か!確かに新しい機能は洗練されてない!

  • 古い機能

確かに!古い機能はセキュリティ意識なく記述されたものもあるのかもしれない!

あれ?全部じゃない?

とかいう冗談は置いておいて、
新しい機能については、やはり洗練されていない可能性があります。
また、古い機能についても長い間注目されて調査され尽くしている機能ならばいいですが、結局マイナーな機能として使われることが少なかった機能や標準化されていなくて仕様が不明確なものなどには脆弱性発見のチャンスがあるらしいです。

  • 概念のまとまりを列挙してその中から探す

例えば、HTTPリクエストを送信できるAPIだとか、windowオブジェクトにぶら下がってるものだとかそういう列挙されているものの中から探す。

  • コミット履歴から探す

これがめっちゃ面白そうでした。新しいモノならワンチャンあるんじゃないか、そう思えました!

  • 攻撃のシナリオをイメージする

攻撃のシナリオをイメージして、ブラウザが本当にその攻撃シナリオを防げる仕様になっているかを見ていく。
例:
CSPが正しく機能しなければ...という攻撃シナリオを考えたなら
→CSPの実装が正確かを見てみる

  • 過去に学ぶ

過去に修正された脆弱性情報を見る。大体人間がやる間違いは似たようなものなことが多いのは何となくこれまでの人生経験からも感じられますよね。

実際にコミット履歴を見て、脆弱性を見つけてみる演習

演習としては、以下の修正が題材として挙げられ、その中の脆弱性を見つけるお題でした。

https://github.com/mozilla-mobile/firefox-ios/commit/78be54586c9e027465d8e0da28bb42595d4ebe32
https://github.com/mozilla-mobile/firefox-ios/pull/2249/files

是非皆さんも探してみてください。
(解答等は冒頭に上げた資料の38スライド目あたりにあります。)

でも実際に数あるコミットの中から脆弱性があるものを見つけ出すのって、相当根気とかいろいろ必要ですよね。

KinugawaさんがKinugawaさんに成れた要因

  1. はせがわようすけさんの資料を熟読(http://utf-8.jp/)
  2. XSSの手法の勉強
  3. 手を動かして実際に再現
  4. さらに深堀り

https://l0.cm/encodings/table/
全ての文字コードの動作を一から調べられたとのこと・・・。
すげえ・・・文字コード一体めっちゃあるやん・・・
思ったよりも5倍ぐらい沢山ありました。
後は、about: URLをひたすら解析とかサードパーティライブラリの脆弱性探しなどもやられたそう。

素人が脆弱性を見つけられると思うな!

脆弱性を見つけたい対象のことを深く知っていなければ脆弱性は見つけられない。当然のことですよね。
モジュールの目的・使用用途、入出力、制限事項、そのモジュールを経由することで何かをバイパスできないか等々モジュールについて知る必要があります。

深く知るために
  1. 実際に動かす
  2. 仕様を読む
  3. コードを読む
  4. バイナリを読む

バイナリを読む!!!!!

誰が予想したでしょう、Web脆弱性の講義の中でバイナリを読むことを・・・!

f:id:gntrua:20170822141316p:plain
edge用はC:\Windows\System32\edgehtml.dll
IE11用はC:\Windows\System32\mshtml.dll

例えば、
{<[?]?im{p}ort[ /+\t].*?implementation[ /+\t]*=} を見てみると、importの「p」を別のものに置換するっぽい感じの雰囲気のような何かは感じられます。言われないとわかりませんね。
この部分のバイナリコードはXSSフィルターに関する正規表現が記述されているとのことでした。
(なぜ分かったのか聞き逃した・・・。)

つまり、ここに書かれている正規表現を理解したうえで、何とかバイパスするXSSを考えてみよう、ということです。

そこで、この正規表現を理解するために実際に動かしてみよう、ということで演習がありました。

そもそもXSSフィルターとは?

https://www.slideshare.net/codeblue_jp/xssxss-by-masato-kinugawa
より

「リクエストの値とレスポンスから
危険と判断される条件にマッチすればページを書き換える」

らしいです。

例えばリクエストで送っている内容をそのままWebページに表示していてかつ、その内容がscript実行に繋がる可能性がある場合にページの内容を書き換える
みたいな動作かと思います。

とりあえずXSSされそうだったら、いい感じに書き換えてくれるぐらいの理解しか持てていません。
厳密な条件は中々わからないのかな~

そうした中で

XSSフィルターの反応原因を探る演習

Kinugawaさんが用意された
https://goo.gl/WSEkgq
を使って、どの正規表現が反応してフィルターをかけられてしまっているのかを調査。

今回、

"instagram(インスタグラム)"

"instagram#インスタグラム#"

にフィルタリングされてしまっている。

f:id:gntrua:20170822153923p:plain

上記したバイナリをよーく読むことで

{[\"\'].*?{\)}[ ]*(([^a-z0-9~_:\'\" ])|(in)).+?{\(}.*?{\)}}

の辺りが反応していることが見つけられる。

f:id:gntrua:20170822153643p:plain

実際、上記のようなXSSは実行可能で
Kinugawaさんが用意された
https://goo.gl/Vmkebc
で試せる。

考察

q = "入力"

みたいな部分があったときに

q = "" alert(1)//

を試すんだけど、前半の式とalert()が繋がってしまっているから実行されないという問題の解消のために

q = "" in alert()//

とするんだろうと考えました。

なら例えば

q = "" * alert() //

できるんじゃね?ということですが
上記の場合でも上手くいきます(下記画像)
f:id:gntrua:20170822152201p:plain
しかし、やっぱりこれも当然
f:id:gntrua:20170822152313p:plain
XSSフィルターによってフィルタリングされます。
その中そんなに甘くねえ!

APIの仕様書を読んでルールを明確化してみる演習

仕様書の内容を理解していきます。そうすると、どのパラメタはどういう値が許されているかなどを明確化できます。
そして...

仕様通り動くかを調べるだけで脆弱性が見つかる

世の中甘いかよ・・・(深い知識が必要です)

対象のおかしな動作を探す

おかしな動作はすなわちバグであっても、時には悪用可能かもしれないこともあるとのこと。

おかしな動作 × 何か = 脆弱性
になる・・・可能性もある。

CSPバイパスXSSチャレンジの演習

おかしな動作からヒントを得、CSPをバイパスしてXSSをします。

CSPとは

Content Security Policyのこと。
WebサーバがHTTPヘッダのContent-Security-Policyにポリシーを設定します。
例えば、

Content-Security-Policy: default-src 'self'

とすると、全てのコンテンツを自身のドメインから取得するよう設定できますし、

Content-Security-Policy: default-src 'none'

と設定すれば、いかなるドメインからのコンテンツの読み込みも許可しません。
また、

Content-Security-Policy: script-src 'nonce-hogehogehogehogehoge'

と設定されていると、

<script nonce="hogehogehogehogehoge">alert()</script>

と正しいnonceが設定されているscriptタグのスクリプトのみが実行されます。

演習

https://vulnerabledoma.in/camp2017/csp

上記もURLパラメタに入力した文字が表示されるようになっています。
これを使ってCSPバイパスXSSにチャレンジします。

解答については、冒頭のスライドの85スライド目にありますので、参照してください。

仕様変更につながることも

こうした脆弱性の発見によって、仕様そのものも変わることもあるそう。

悪用のシナリオを考える

めっちゃ悪そう。
でも、やっぱり実際に示さないと人には理解して貰えない・・・。

演習

https://github.com/nishimunea/securitycamp2017
Firefox拡張には、脆弱性があってそれを最大限悪用するとどれだけのことが出来るのか?という演習でした。

解答については、冒頭のスライドの94スライド目にありますので、参照してください。

結論から言うと、
ページ内の全コンテンツを外部に送信可能
らしいです。
やばい・・・。
西村さんはgmailでデモされていましたが、他人とのメールが外部に送られたら困りますよね・・・。

結局

脆弱性探しは十人十色
らしい。結局!!!
まあ、そりゃそうですよね。
~プロが教える脆弱性探しの完全攻略~
とかいう本があったら誰も脆弱性生まないですよね。

Sakerity Camp 2017全国大会のインシデントレスポンスをした話

算数が出来ない人だけ見てください!

まず、冒頭にて私の過ちによってご迷惑をお掛けした関係各所の皆様にお詫び申し上げます。
そしてネタにさせてください。

セキュリティキャンプ2017 全国大会(8/14 ~ 8/18)開催期間中は、例え成人していようとしてしまいと禁酒・禁煙生活を余儀なくされていました。
(中学生も小学生もいるからね!)


その鬱憤を晴らすべく、Sakerity Camp(名称は個人に因る)に行きました。

セキュリティキャンプ参加者80名の中から厳正な審査によって選ばれた12名が参加し、
やれ1024bit CPUだの、カーネルエクスプロイトだの、Cでパケット作った話だの、コアな内容が飛び交ってました。
また、各参加者が受講した講義の情報共有等も出来、非常に有意義かつ面白い会だったと思います。

そう、これだけで終わっていれば・・・。

こういう会を行う上で最も気にしなければならないことは会計だと思います。
卓ごとの会計のため、私は都合4人分の会計を行いました。

[2017/08/18 19:00頃]
f:id:gntrua:20170820170842p:plain:w300
僕「4200お願いします~」

[2017/08/19 10:00頃]
いや、さすがにチェーンであの値段冷静になってみるとおかしいよな・・・。
f:id:gntrua:20170820171159j:plain

???
12,547 / 4 = 3,137

あれ・・・昨日絶対4千円もらった・・・

インシデント発生

早急に関係各所への連絡

今回は同じ卓に居たメンバーの詳細な連絡先を記憶していなかったため、Twitterアカウントの捜索。
1人は確実に分かっていたので、その人にも聞きながら関係する全員の連絡先を入手

ごめんなさいをする

大変申し訳ありませんでした、こういう事情で昨日間違えましたという旨をお伝えしました。

どう返済するか

問題は、ここからどうするかでした。
皆さんの居住地はバラバラなため、オフラインで会うことは困難・・・かといって住所や口座等を聞くのも・・・。
僕の間違いによってそんな個人情報明かさせるわけにはいかない・・・。

f:id:gntrua:20170820171934p:plain
アマゾンギフトカード

アマゾンギフトカードは基本的に、ギフト券を買って、アクティベートされた番号を渡せば相手に送付出来ます。
そこで、全員に伺いアマゾンギフトカードで以て返済とさせていただくことに。

コンビニでは、細かい単位のものを購入することが出来ないため、E mail形式で購入し、TwitterのDMで全員に送付。

f:id:gntrua:20170820172246p:plain

無事、受領していただけました。

同じ卓だった3人の方々、本当に申し訳ありませんでした。

また、このブログを見られてる方は算数ができるフレンズだと思うので、僕のような間違いは犯さないとは思いますが、もし起こしてしまった時の対応の一手法としてご紹介できればと思い、投稿しました。

また、僕自身もこのような間違いを二度と起さないよう生きていきたいと思います。

セキュリティキャンプ2017全国大会の感想(全般)

セキュリティキャンプに関連するエントリ

gntrua.hatenablog.com


セキュリティキャンプ全国大会について私が感じたこと等を順次投稿していきたいと考えています。
差し当たり、セキュリティキャンプの生活面について記述したいと思います。
参加者各位が得られる情報はないです。

生活

クロスウェーブ府中

f:id:gntrua:20170819140618j:plain
f:id:gntrua:20170819140645j:plain
吹き抜けの物凄い施設
https://x-wave.orix.co.jp/fuchu/room/img/room_singlePhoto.jpg
結構広い、家帰った時落差に衝撃を感じた

食事

サラダが自由に取れてご飯も任意の量に盛って貰えた。まあ、面積が広いけど普通にホテルのブッフェみたいな感じだった。
各階に自販機もあって、飲み物にもアクセスしやすかった。(水が永遠に配布されてたので、僕は利用しなかったが)

トイレ

平面構造が円なのでトイレアクセシビリティは必ずしも良いとは言えなかった。

回線

また、xwaveなるSSID無線LANを飛ばしてくれているが割と貧弱なので基本的には自分の回線を使ってインターネットしていた。

教室施設等

教室の椅子はめっちゃリクライニングしてとても快適だった。
また、グループワーク等で集まって座れる机がそこら中にあったので良かった。
ただ、23時以降はチューター・講師からの凍てつく視線を浴びるので使えない。

スケジュール

http://tool.stabucky.com/maker/twentyfour/24circle.php?w=400&e=0,%E7%9D%A1%E7%9C%A0;6,%E8%B5%B7%E5%BA%8A%E3%83%BB%E3%82%B7%E3%83%A3%E3%83%AF%E3%83%BC;7,%E6%9C%9D%E9%A3%9F;7.5,%E3%82%B1%E3%83%A2%E3%83%95%E3%83%AC%E7%AD%89;8.5,%E8%AC%9B%E7%BE%A9;12.5,%E6%98%BC%E9%A3%9F;13.5,%E8%AC%9B%E7%BE%A9;17.5,%E5%A4%95%E9%A3%9F;19,%E8%AC%9B%E7%BE%A9;23,%E7%9D%A1%E7%9C%A0;

タイムスケジュールはこのような感じ。
23時就寝だが、事前課題やらグループワークやら寝れないやらで23時に寝れたことはない。
参加者も3,4日目にはかなり疲労していた。朝1の講義に遅れてくる人も居たらしい。
僕自身も朝から晩まで講義がある日はかなり疲労した。

運営による支援

飲料

お水が飲み放題。税金が自由で飲めるらしい。
後は、朝一番の講義でアクエリアスが無料配布されます。

健康管理

看護師の方が1人常駐しておられるらしい。
また健康調査用紙を毎日書く必要があり、全参加者の健康が常に監視される。出さないとすごく嫌な顔されながらさっさと出すように言われます。

貰えるモノ

書籍

サプライズイベントと称されて4日目に書籍を貰えます。書籍は講師の方が書かれたものから出版社から提供されたもの等いろいろありました。僕はブラウザハックがすごく欲しかった。しかし、数には限りがあるので今回は年齢の値が小さいもの順で一人2冊まで取っても良いというルールでした。
年長者は心の中でブチ切れながら隣の中学生のためになるなら仕方ない・・・と耐えました。

企業の宣伝的なパンフ

協賛企業が沢山いらっしゃるのでものすごい量貰います。中にはクーポン的なものも付けてくれる企業さんもありました。

ステッカー

ステッカーもいろいろ貰えます。あらかじめ配布される各企業のステッカーから、書籍配布の際に貰える講師の方などのステッカーがあるようです。