はじめに
8/26 ~ 30にかけて株式会社Flatt Securityのサマーインターンシップに参加させて頂きました。
今回はそこで私が体験した事とそこから学んだ事について話します。
会社概要
株式会社Flatt Securityはセキュリティ会社で、学習プラットフォームKENROや自動診断ツールのShisho Cloudを提供しています。
自動診断ツールに加えて、セキュリティのプロフェッショナルが実際のプロダクトに脆弱性が無いかを確認する脆弱性診断サービスも提供しています。
Flatt Securityではプロダクトのソースコードを見ながら診断を行うホワイトボックス診断が特徴となっています。
1日目
1日目は会社説明とFlatt Securityが提供しているトレーニング教材を用いた脆弱性についての学習を行いました。
教材のコンテンツには様々な項目がありましたが、1日目はXSSとCSRFの項目を行いました。
CSRFの部分では罠サイトの作成時になぜか罠サイト側でCORSを有効にしていたせいで詰まっていた覚えがあります。
罠サイト側でfetchを使用していた際にもヘッダ情報を記述し忘れるなど凡ミスが目立った1日でした。
コンテンツ自体は面白いものばかりでした。
2日目
2日目はXSSとCSRFの診断形式の問題を解き、余った時間でSQLインジェクションとOSコマンドインジェクションのコンテンツも行いました。
2日目になると環境にも慣れてきて、凡ミスも減ってきました。
XSSの診断形式の問題だけ、少し工夫しないとXSSに繋げられないようになっており、いつものCTFをやる感覚で楽しく解法を探していました。
3日目
3日目からは診断業務体験が始まりました。
診断対象としてWebサイトとそのソースコードが与えられました。
Webサイトはdockerを利用し、自身のPCに構築したものを使用しました。
CTFを趣味で行なっていたので、ソースコードを見ながらの診断は慣れていると思っていたのですが
ここでCTFと診断業務の違いを知ることになりました。
診断を行う前にはWebサイトが正常に動作しているか確認を行うのですが、私はこの作業は初めてだったので1日のうち半分以上をここに使ってしまいました。
最終的にはクライアントが直接操作するような機能に絞り、動作確認を行うことにしました。
残った時間でWebサイトを操作し、怪しそうな箇所があればソースコードと睨めっこしながら攻撃手法を考えるという方法で診断を行いました。
この日の最後にようやく1つ脆弱性を見つけることができました。
4日目
4日目は診断業務の続きを行いました。
この日は1日中ソースコードと睨めっこしていました。
CTFを趣味でやっているのでソースコードを見て、攻撃方法を考えるのには慣れていました。
そのおかげでこの日は3つ脆弱性を見つけることができました。
かなりソースコードの量が多いので、CTFでソースコードを読むのに慣れていなかったら脆弱性は見つけられなかったかもしれません。
それとこの日は、もう1つのCTFと診断業務の違いを知った日でもありました。
CTFでは対象に脆弱性が必ず存在しているという前提がありますが、診断業務ではそうとは限らないという事です。
ですが、攻撃を組み立てる考え方の部分は共通しているので、1箇所に集中して脆弱性を探すあまり沼にハマらないようにすれば、後はCTFと同じ流れで脆弱性を見つけることができました。
5日目
最終日が私にとって一番学びの多い日となりました。
この日は3~4日目で発見した脆弱性を報告する報告書作成を行いました。
報告書を作成する際には、開発者の方が実際に脆弱性を修正してくれる内容にすることを心掛けながら取り組みました。
PoCに使用するコードや修正版のコードを記述するようにもしました。
CTFでPoCコードを書くのには慣れていたので、スムーズに行くと思っていたのですが、実際には少し違いました。
なぜなら開発者の方が一番実行しやすいコードにする必要があったからです。
Flatt Securityでは、原則PoCコードはブラウザの開発者モードで実行可能なJavaScriptで記述するようにしていました。
私は普段PythonでPoCコードを書いていたのですが、それを実行するにはPythonの実行環境が必要です。
コードに外部ライブラリを使用している場合は、それをインストールする必要もあります。
なので私もJavaScriptでコードを書いたのですが、fetch関数でファイルを扱う方法が分からず苦戦しました。
ですがこのやり方の方が実行環境の構築をする必要が無いので、コードの実行が容易だと思いました。
他にも、参考資料はIPAやPortSwiggerなどの信用できる機関から引用すると良いと学びました。
さいごに
私は今回のサマーインターンに向けてOAuth1やS32の攻撃手法を調査し、準備してきました。
ですが、CTFと診断業務の違いを痛感する結果となりました。
開発者が実際に脆弱性を修正することが重要だということは自分でも理解していたつもりでしたが
実際の業務体験を通して、開発者にもわかりやすい報告書を作成することが大変だということを学びました。
サポートしてくださったメンターの方々と話している中でも、開発者が実際に脆弱性を修正してくれることの重要性が伝わってきました。
最終的には、お客様に信頼してもらえる脆弱性診断士を目指しますが
今後は、まずはCTFでwriteupを書く際にPoCコードをJavaScriptで作成するところから始めていきます。
最後にこの場を借りてFlatt Securityの方々に感謝を伝えたいと思います。
今回は貴重な学びの機会を提供していただき、誠にありがとうございました。
1: https://blog.flatt.tech/entry/s3_security
2: https://blog.flatt.tech/entry/oidc_security_gitlab_casestudy