yyy

CTFつよくなりたい

pixiv SPRING BOOTCAMP 2019のセキュリティコースに参加して最高の体験をしてきた

はじめに

念願のpixivインターンに行ってきました.

pixivは高校生の時ぐらいから知っていて,実際に絵を投稿したのは大学に入ってからですが,お絵描きを趣味とする自分にとってはとても身近な存在でした.インターンシップに参加している学生の様子をSNSで見ているととても楽しそうで,いつか自分も参加してみたいと思うようになりました.

また,バグバウンティを行っているということも魅力的でした.日本でバグバウンティをやっている企業はまだまだ少ないですし,絵を投稿する場として利用しているサービスが,実はセキュリティにも力を入れていることを知った時はpixivに対してより一層興味を抱きました.

実は,去年の夏インターンシップでも応募をしていました.その時はセキュリティコースはなく,Railsを多少やっていた自分はRailsで作られているBOOTHのコースで応募したのですが,書類選考後の面談でお祈りをいただいてしまい,半ば諦めていました.ですが今回春インターンがあるということで最後のチャンスだと思い,今回は自分が将来仕事にしたいと思っているセキュリティのコースで応募しました.

参加するまで

面談ではコードテストがあるというのはメールで聞いていて,夏に受けた時はなんの問題もなく書けたので今回もいけるだろうと思っていたら,コードテストの前にWebセキュリティに関する知識を問われて少しドキッとしました.

コードテストは頭が真っ白になりかけたりしたのですが,面接官の方達が優しかったのでなんとかなりました.その後,合格通知が来た時は思わずにやけそうになりました.セキュリティコースは今回初めて作られたものらしく,第1号ということでさらに嬉しくなりました.

業務開始まで

前日になかなか寝付けなかったのですがなんとか起きれて,無事オフィスへ到着しました.エレベーターを降りたら早速絵馬があって興奮していたのですが,オフィスへ到着するもセキュリティカードがないため入れず,うろうろと不審者化していました.

f:id:ywkw1717:20190314154023j:plain
絵馬1

f:id:ywkw1717:20190314154046j:plain
絵馬2

f:id:ywkw1717:20190314154143j:plain
絵馬3

その後,他のインターン生の方とお互いに軽く自己紹介をしてからNDAを結んだり人事のkamikoさんのお話を聞いたり,軽くオフィスを見学してから毎週水曜日に開催されている全社会議に参加させていただきました.ここでは各プロジェクトからの報告があった後,27日から参加の4人のインターン生は自己紹介をしました.全社員の前での自己紹介,緊張しかない.

セキュリティカードと一緒に名札も貰いました.

f:id:ywkw1717:20190314161027j:plain
なまえ

全社会議の後は全社ランチということで,自分のテーブルでは7人くらいでご飯を食べました.隣にいたhakatashiさんはルービックキューブをやっているということでものすごく親近感が湧きました.特に僕のメンターのkoboさんとhakatashiさんとはCTFのお話ができて良さみがありました.

f:id:ywkw1717:20190314161151j:plain
様子

2/27~3/1

CSPの導入①

この期間で主にやったことはVRoid HubへのContent Security Policy(CSP)の導入です.

hub.vroid.com

CSPとはXSSやその他いくつかの攻撃を防ぐためのセキュリティレイヤーであり,これを使用することで悪意のあるコードの実行を防ぐことができます.CSP Level2 まではドメインの指定によるホワイトリスト方式が推奨されてきましたが,それがバイパス可能だということがわかってきました.そのため現在のLevel 3では nonce+strict-dynamic が推奨されていて,nonceが付与されたscriptタグしか許可しないようにします.また,strict-dynamicを付けることで nonce が付与されたscriptタグ内で動的に生成されたscriptタグも正常に動作するようになるので,アプリケーション本来の動作に影響を及ぼさずにCSPを導入することが可能になります.その他,主に付けるべきディレクティブは script-srcobject-srcbase-uri です.

ここら辺のお話はメンターのkoboさんが書いた以下の記事がとても詳しいです.

inside.pixiv.blog

CSPの導入は次のように進めていきました.

  1. 試しに default-src: 'self' みたいなものだけ設定してCSPの違反がブラウザのコンソールに出ることを確認
  2. script-src object-src base-uri の3つのディレクティブを設定
  3. nonceをscriptタグに設定していく
  4. CSPの違反やnonceの付与漏れなどないことを確認したら,ブラウザごとに出し分けを行う
  5. CSPをReport Onlyモードで動かす
  6. report uriに設定したURLにてCSPの違反レポートを確認して,修正できるものは修正
  7. Report Onlyを外す

バグバウンティ関連①

その他にやっていたこととして,HackerOneに届いているレポートを過去のものも含め全て読んでいいということだったので,空き時間はひたすらレポートを読み漁っていました.なかなか世界中のハッカーが送ってくるレポートを読める機会などないと思いますし,こういう視点でバグを見つけて攻撃をするんだなというハッカーの視点のようなものを養うことができて非常に参考になりました.

エンジニア勉強会

毎週金曜日は勉強会が開かれているので参加しました. 今回はTECH SALONでLTをやる人たちのリハーサルの場でした.縦書きというユニークな話から,Kotlinの話,レイヤーの自由変形の話,CSP+SameSite cookieの話,HEIFの話まで,ジャンルも幅広く様々なお話を聞けました.僕は特にセキュリティな話が好きなのでメンターのkoboさんが話していたCSPとSameSite cookieの話を特に興味津々で聞いてました.SameSite cookieは知りませんでした.CSRF対策ということで,これから普及が進みそうな技術です.

3/4~3/6

CSPの導入②

金曜日にデプロイしない文化があるとメンターさんから教えてもらったので,3月4日の月曜日にいよいよContent Security Policy Report Onlyを有効化するPRをマージして,本番環境にデプロイしました(本番環境にデプロイするボタンをメンターのkoboさんに「このボタンを君に押して貰いたいんだ...!」と言われてクリックさせてもらえたのが印象的です).実際に動いているサービスへのコントリビュート,最高の体験です.

f:id:ywkw1717:20190307000237p:plain
Content Security Policy Report Onlyが付いている様子

unsafe-evalも外せると完璧らしいのですが外してみるとうまくいかない部分があり,結局付けたままにしました.本番環境でContent Security Policy Report Onlyがついていることを確認したらCSPの違反レポートが来るまで1日程度様子を見ました.翌日に違反レポートが来ていることは確認できたのですが,report-uri.comだとブラウザのバージョンが見れず,どのブラウザで違反が起きているのかわかりづらいということでreportUriをSentryに変更しました.

ですがその後,Sentryではあまりログが取れていないということがわかり,reportUriは2つ指定することも可能だったのでreport-uri.comとSentryの2つのURLを指定しました.また,Worker関連のCSP違反レポートが出ていることもわかったので,これに対応するために新たにworkerSrcディレクティブを追加しました.

バグバウンティ関連②

実際のバグバウンティの対応もやらせていただきました.届いていた報告をトリアージしてから報奨金の支払いまでをメンターさんに教えてもらいながらやりました.それまではレポートを読んでいただけだったのですが,未対応の脆弱性の対応のために検証を行ったり,GitHubにissueを立てて概要や影響について書いたりして,ここでも最高の体験をすることができました.

また,画像関係の脆弱性についても検証・調査を進めていました.

pixiv Bug Fix

pixivにあったバグ修正もしました.これはバグバウンティのほうで報告が来ていたもので,プレミア会員でしかできないはずのことが一般会員でも細工するとできてしまうことがあり,その修正をするためにtadsanに教わりながら開発環境を作りました.(PhpStorm初めて使った)

翌日,メンターのkoboさんに相談しながらPRを出し,それはその日中にマージされて本番環境にデプロイされました.pixiv本体へのコントリビュート,最高の体験すぎる.(「これで君は VRoid Hub と pixiv ,2つのコントリビューターだ」とkoboさんから言われた時は嬉しすぎて言葉が「なるほど...」しか出てこなかった🤔)

pixiv TECH SALON

また,3月5日の火曜日はpixiv TECH SALONに参加しました!

techsalon.pixiv.co.jp

pixivが初めて開催するテックカンファレンスで,完全招待制のイベントなのですが,インターン生は全員参加できるということで参加してきました.入場すると謎のサイリウム入りのトートバッグが渡されました.

pixiv BLUE,カルピスとなにかを混ぜたやつ(忘れてしまった)

f:id:ywkw1717:20190314154244j:plain
pixiv BLUE

f:id:ywkw1717:20190314154307j:plain
pixiv BLUE

メインセッションが始まるまでは両端でLTが開かれていました.僕はAのほうを聞いてからBのほうに行き,全てのLTを聞きました.LTの途中からボイチェンで声を変えて発表する『明日から女の子になるための「声」のお話』はだいぶ印象に残りました笑

メインセッションが始まってからは参加者は皆さん着席して聞いていました.どのお話も業務で直面した課題をどのように解決したかを話していたり,pixivの社風が存分に伝わってくるセッションで,聞いていてワクワクしました.

個人的に特に面白いなと思ったセッションは「大多数のメンバーがコードを書けるチームにおけるエンジニアの役割」です.pixivのBOOTHチームについてお話されていて,そもそもBOOTHチームはエンジニア以外にもコードを書ける人が多くて,エンジニア以外にPRを出してマージされたことがある人がいたり,issueを立てたことがある人はエンジニア以外を含めて全員だったり,特徴的なチームでした.

このセッションで伝えたいこととして2点挙げられていました.まず1点目は,BOOTHで商品が入荷するまでの間,ステータスが中々次のものに切り替わらないのでどうにかしたいという課題があったということで,非エンジニアの方からは新たにステータスを追加してはどうかという提案があったそうです.しかしエンジニアからすればステータスを新たに加えるということはコードの大きな変更を意味し,できれば行いたくないということで,もう少しヒアリングしてみると問題の本質はステータスを新たに加えなければいけないということではなくて,ステータスが切り替わらない間のお問い合わせ先に問題があるのでそこを変更すればよいという結論に至ったそうです.このように提案されたものを鵜呑みにするのではなく,問題の本質を見抜きそれを解決するところがエンジニアの腕の見せ所とおっしゃっていて,まさにその通りだなと納得しました.

もう1点は「小さく出す」ということで,PRなどを出す際に「ついでに」これもやっておきましたみたいなことを辞めようということです.なぜかというと,「ついでに」実装したものが実は正しく動いてなくて検証が必要だったりして,本来出すはずだった修正や機能追加が「ついでに」追加したものに足を引っ張られることでできなくなってしまうことがあるからです.そのために「小さく出す」ことで,よりスピーディーに開発が進むということでした.

メインセッションが終わった後はいよいよサイリウムを折ってから盛大な掛け声と共に懇親会がスタートして,みんなでわいわいしていました.(大学の元先輩3人と遭遇するという奇跡が起きてびっくりしました)

f:id:ywkw1717:20190314154435j:plain
様子

f:id:ywkw1717:20190314154416j:plain
サイリウム

f:id:ywkw1717:20190314155630j:plain
いろいろもらった

3/7~3/8

CSPの導入③

CSPのReport Onlyを外すPRを作成していました.いよいよReport Onlyを外すということで少し緊張していましたが,無事VRoid HubにCSPを導入することができました.

f:id:ywkw1717:20190314161814p:plain
Content Security Policyが付いている様子

バグバウンティ関連③

引き続き,画像関係の脆弱性について調査していました.Linuxのcgroupを使用した対策についての調査をローカル環境で試していて,正しく制御できていることを確認したのでissueに調査結果をまとめていたりしました.

成果発表

最終日では,インターン中の成果を発表しました.メンターのkoboさんに添削してもらいながら,ギリギリまでスライドを作っていました.僕の発表は2番目だったのですが,初手のインターン生のりゅう君が声は大きいし発表は面白いし盛り上がるしで,そんな素晴らしい発表の後に控えていた僕は「オワタ」という気持ちで見ていました.

僕の発表では初っ端から,もっと大きな声で喋ってと言われてしまい,普段から声が小さい自分にとってはなかなかに厳しい状況だったのですが,kameikeさんがすぐにマイクを用意してくれて惚れそうになりました.緊張しながらも発表を終えると,メンターのkoboさんが総評でいいことばかりおっしゃってくれて,嬉しすぎてついつい笑みがこぼれました.

f:id:ywkw1717:20190314161224j:plain
様子

発表の後は記念撮影をして打ち上げ会場に移動し,鍋をつつきながら楽しく談笑していました.その後会社に戻ってからは,お土産としてpixivのステッカーやグッズなどを頂いてから帰りました.

f:id:ywkw1717:20190314155710j:plain
お土産

その他の思い出

懇親会でルービックキューブについて話した

hakatashiさんの他に機械学習コースのメンターさんのfusshi-さんもルービックキューブの達人で,お話していてとても楽しかったです.

バイナリかるた貰った

koboさんから頂きました!!!!

f:id:ywkw1717:20190314154341j:plain
バイナリかるた

お絵かきブートキャンプ

こちらは3月6日の水曜日にありました.水曜日のランチでご一緒させていただいた社員さんにお誘い頂いたので喜んで参加しました.絵を描く人全てが偉いという考えで,批判はなくひたすら褒めてもらうような素晴らしい世界でした.自分は絵を描くのが半年~1年に1枚という具合なので,このような集まりがあるといい感じにモチベーションを保ててよさそうだなと思いました.

円盤鑑賞会的なやつ

3月7日の木曜日にAqoursのライブDVDを鑑賞したのですが,優勝しました.

f:id:ywkw1717:20190314155553j:plain
円盤鑑賞会

僕はラブライブは観ていたのですが,ラブライブサンシャインは観ていなかったので大丈夫かなぁと思っていたのですが,いざ始まってみると激熱でした.

ご飯情報

お昼はほぼ毎回メンターのkoboさんがいろいろな社員さんを誘ってくれて,ご飯に行っていました.

f:id:ywkw1717:20190314154521j:plain
28日ご飯 土古里

f:id:ywkw1717:20190314154539j:plain
1日ご飯 camp

f:id:ywkw1717:20190314154607j:plain
4日ご飯 串亭

f:id:ywkw1717:20190314154623j:plain
5日ご飯 キッチンカー

f:id:ywkw1717:20190314154652j:plain
7日ご飯 enjoy

f:id:ywkw1717:20190314154716j:plain
8日ご飯 みろく庵

最後に

去年の夏に2社,別のインターンに行きましたが,僕の目指している職業上どうしても堅いところが多く,このようなアットホームな会社のインターンシップは初めてでした.まず社員さんとの距離が近く,「インターン生」という別のくくりとして扱うのではなく一社員のように扱っていただいて,本当にpixivで働いているような,そんなインターンシップでした.

他にも社員の趣味を最大限に応援する会社で,個性溢れる社員さんばかりでしたし,参加する前から思っていた通りの本当に素敵な会社だなと身に沁み,「創作活動がもっと楽しくなる場所を創る」という理念が伝わってきました.

最後になりますが,メンターのkoboさん,VRoidチームの皆様,インターンシップに携わってくださった社員の皆様,そしてpixivの皆様,最高の体験をありがとうございました!