初めまして!10 月にカミナシへ入社した いちび(@itiB_S144) です。セキュリティエンジニアリングユニットに所属しつつ、8 月にリリースしたばかりの カミナシ従業員 の開発に携わっています。
先日社内エンジニア向けのセキュリティ競技会「第 2 回ごーとんカップ」を開催しました。ごーとんカップとは、社内のエンジニアが集まって CTF(Capture The Flag) 形式でセキュリティに関する問題、カミナシの開発に関わる問題を一人ひとりが解いて得点を競う大会です。CTFとは、セキュリティなどに関する問題を解いて隠されたキーワード(フラグ)を取得する競技です。 今回は、その運営を担当したので、その様子を紹介します。
ごーとんカップの目的と概要
ごーとんカップはカミナシのエンジニアリング組織におけるセキュリティ文化の醸成を目的としています。カミナシのエンジニア全員参加で、まとまった時間を取ってセキュリティに関する問題を解くことで普段の業務にもなにか応用できることを見つけてもらう場としています。
大会タイトルの「ごーとん」とはカミナシのマスコットキャラクターのことです。 この子はヤギではなく、ヤギモチーフのロボットらしいです。入社して一番の衝撃でした。
昨年実施した第 1 回ごーとんカップの様子は以下に記事があります。
kaminashi-developer.hatenablog.jp
カミナシのエンジニアは「システムのライフサイクル全体を見る」エンジニアとしてロールは基本的に全員ソフトウェアエンジニアです。フロントやバックエンドにとどまらずインフラやセキュリティもすべて含めてオーナーシップを発揮することが期待されます。かといってすべての領域を網羅し、あらゆる分野で How のプロフェッショナルになるのは非常に難しいです。
今回のごーとんカップでは問題を通してセキュリティに限らず、日々の業務で利用している技術についてもより深く理解し、手数を増やしてもらうことを目指しました。
問題
今回の環境は昨年と同様、AWS で構築しました。スコアサーバーには CTFd(https://github.com/CTFd/CTFd) を利用し、問題は「MISC」、「GitHub」、「Web」「AWS」、「認証基盤」の 5 つのカテゴリに分けて用意しました。
※ MISC: いわゆる "その他" の問題。
いくつか問題をピックアップして紹介します。
AWS WAF のバイパスに関する問題
サンプルの SQL インジェクションコマンドが渡されます。このコマンドを修正して AWS WAF をバイパスし、フラグを取得してください。
curl -X POST "<https://xxx.cloudfront.net/users>"\\ -d "user_ids=id%3D8%20union%20all%20select%208%2C2%2Cflag%20from%20secret%20--"
この問題は AWS WAF のバイパスに関する問題です。AWS WAF は Web アプリケーションファイアウォールで、SQL インジェクションなどの攻撃を検知してブロックできます。この問題では、AWS WAF をバイパスする方法を見つけ出し、SQL インジェクションを実行してフラグを取得することが求められます。
AWS WAF を入れれば大丈夫!と思ってしまうかもしれませんが、AWS WAF は内容次第ではバイパスできてしまいます。この問題を通して AWS WAF は緩和策であり、アプリケーション側での対策も必要なことを理解してもらうことを目的に出題しました。
例外処理から情報を漏洩させる問題
ユーザには以下のソースコードと、/input
にアクセスできるエンドポイントが提供されます。
どのようにすれば Nice Input!!
を表示させ、フラグを取得できるでしょうか?
func main() { ... e.GET("/input", func(c echo.Context) error { param := c.QueryParam("input") if containsNonNumeric(param) == false { if _, err := strconv.Atoi(param); err != nil { return errors.New("Invalid input param") } return c.String(http.StatusOK, "Nice Input!!") } return c.String(http.StatusOK, "try harder!!!") }) e.HTTPErrorHandler = func(err error, c echo.Context) { if err.Error() == "Invalid input param" { c.String(http.StatusOK, fmt.Sprintf("flag: %s", flag)) } else { c.String(http.StatusInternalServerError, "An unexpected error occurred.") ...
この問題は例外を発生した際に誤って秘匿情報を出してしまう可能性を再現したものです。strconv.Atoi(param)
がエラーを返した場合に flag
が返されます。例外処理でログなどに意図せず機微情報を表示させて漏洩させてしまう可能性があるため、気をつけてもらいたいという意図で出題しました。
認証基盤に関する問題
認証基盤の問題に関しては、カミナシの認証基盤を管轄しているチームが作問していただきました。認証認可の基本を再確認するクイズから、システム構築に役立つ具体的な知識を問う問題まで幅広く用意されており、参加者にとって実践的な学びの機会となりました。別途ブログが公開される予定ですので、お楽しみに!
作問について
認証基盤に関する問題以外は 昨年アイデアが溢れすぎて来年の問題もすでに構想ができてしまっていた西川さん がすべて作ってくださりました。ごーとんカップ開催 1 ヶ月前に入社した私は問題サーバとアカウントを渡され、実際に問題を解いて内容の確認と難易度の調整をしました。
全部で約 30 問あり、trivy(https://github.com/aquasecurity/trivy) を使ってみよう、直近で GitHub Marketplace に公開された Actions の内、Script Injection が見つかったものを探してみようなど、問題を解くことで新しい技術や知識に触れる機会が数多く設けられていました。
大会当日の様子
当日はみんなの回答する Flag が送られてくる様子を見つつ、詰まっていそうな方がいれば適宜ヒントを出す形で進めました。 はじめはフロントやバックエンドそれぞれ得意分野の問題を解き、その後他の分野にも進出して悩みながらも解いてくださっているのが印象的でした。入社 1 ヶ月の自分としてはみんなの得意分野がわかって面白かったです。 競技の後には解説の時間を設け、それぞれの問題の作問意図と解法を紹介し、理解を深めてもらいました。
優勝者
2時間の激闘の末、やることがなくなって暇になる人が出ないよう、時間稼ぎに出した Zip の既知平文攻撃を用いる問題を唯一解いた トモ=ロウ(@kobutomokoro)さんが優勝となりました🎉
2位は CTO の トリ(@toricls) さん、3位は flada(@flada_auxv) さん。1~3 位のスコアは僅差で大接戦が繰り広げられていました。
優勝者には今回のために描き下ろしていただいたごーとんイラストのアイテム(フーディやシャツの中から自由に選べる)が贈られました。現在何にするか決めているところとのことです。
参加者の反応
ごーとんカップに参加したエンジニアへのアンケートでは「普段の開発で使えそうな学びはありましたか」という問いに対して全員が少し以上の学びがあったと回答してくれました。また、問題の難易度については「ちょうどよかった」という声が多かったです。
- trivy 知らなかったので使っていきたい
- WAFの限界の問題は非常にインパクトありました!もう忘れなさそう。
- 理解が曖昧だった部分がはっきりしたように思います!
- nonce や state などをかつて調べて理解したつもりではあったが、理解が浅いのか忘れてしまっている
- 普段明確に理解せずに使っている内容について、クイズやCTFに応えることで集中して調べたり考えたりできることが価値だと感じました。日々過ごす中ではなかなか時間を作ることができないので、よかったです。
- エンジニア一同に集まってワイワイできて楽しいので来年も開催されることを期待してます!
普段の業務にもなにか応用できることを見つけてもらう場としてごーとんカップを開催したため、目的を十分に達成した場になったことがアンケートからわかります。
ごーとんカップを通じてエンジニア全体の知識、手数を増やすことができ、よりセキュリティに対してなにできるかを考えてもらうきっかけを作ることができました。人によっては普段まったく触らなかった分野に触るきっかけにもなり、今後の業務で活かしてもらえることを期待しています。
今後のごーとんカップ
エンジニアからのアンケート結果が非常によく、今後もカミナシのセキュリティ文化を醸造していくためにもごーとんカップは続けて行きたいと考えています。インフラ、バックエンドよりな知識を問われる問題が今年は多かったため、次回はフロントエンドにフォーカスした問題を増やすなど、幅広くセキュリティに触れる機会を提供していきたいと考えています。 また個別で解いてもらう形式で開催しましたが、チームで解く形式や相互に教え合う機会を作るなど、よりコミュニケーションを取りやすい形式にするのも面白いかもと思っています。いいアイデアがあればぜひ教えてください!
カミナシのエンジニアリングは非常にわくわくできる環境です。興味持っていただけたら気軽にカミナシの雰囲気聞きに来てください!