どうもセキュリティエンジニアの西川です。私は最近ポケモンカードの奥深さと難しさを痛感する日々を過ごしていますが、みなさんいかがお過ごしでしょうか。
カミナシでは社内セキュリティ競技会を実施しました。1年に1度開催しておりまして、気付けば今年で3回目です。初回は私一人で運営していましたが、2回目は二人、3回目は三人と徐々にセキュリティエンジニアリングに人が増え、問題の幅が増えたように感じています。
「こいつ競技会やる度にブログ書いてるな」と思われるかもしれないのですが、新しい発見というか自分なりに改めて社内セキュリティ競技会を実施する目的などを言語化したので、それについても共有できればと思っています。
社内セキュリティ競技会ってどんなもの?
これは CTF(Capture The Flag) のようなものですが、社内で実施する良い点は下記のようなものがあります。
- 自分たちのサービスや環境のコンテキストをふんだんに問題に盛り込める
- 毎月カミナシで発行しているセキュリティニュースで書いた内容を問題にしているので読んでいない人は解けなかったり、次回はちゃんと読もうという気にさせることができる(多分)
- こんなクールな問題を作れるやつらなら困った時に相談するか!と思ってもらえる(多分)
- 詰まっている問題に個別に声をかけることができる
- 運営でちょっとやらかしても許される
- 軽いイタズラをしても怒られない(後述します)
また弊社はリモートワーク中心で全エンジニアが集う機会も少ないため、交流の機会にもなっています。実際初めてお会いした方もいたりして、そういうところでお互いの人物像を知ることでセキュリティエンジニアとして親しみを持ってもらえる機会になっています。
※当日の様子
辛いよ LLM
今回25問作成して、うち10問程度が Web の問題でした。ほとんどの Web の問題ではコードを提供します。コードを LLM に食わせると解けてしまうということが開催直前にわかりました(汗)。1年前はこんなに賢くなかった気がするので、この1年での LLM の進化をまざまざと体感させられました。ただ、LLM が解けないようないわゆる一般の CTF の問題を作成しまうと一人一人の学びにつながり辛く、そもそも問題が解けずにつまらない時間を過ごすだけになりかねません。それでは我々の目的を果たすことが難しくなってしまいます。
ということで LLM の使用を止めないものの LLM で問題を解くのは当日のレギュレーションで禁止にすることにし、アドバイスをもらうのだけを許可しました。ただ、アンケート結果からは逆に LLM の使い所が難しかったとあったのでそこは反省点です。
実際に LLM 対策で一つだけ難しい問題を用意していたのですが、作問に時間が掛かるしそもそもそこに辿り着けなかったので少なくともカミナシではそこまでやるメリットはほとんど感じられませんでした。メリットがあるとすれば運営側が全問解かれないように時間稼ぎができるという安心感ぐらいでしかありません。なので、それよりも多くの問題を作るという方がより良い効果を期待できると思います。
それにしても LLM の進化に圧倒されました。今回作問にあまり時間が取れず、開催3週間ぐらい前から本腰を入れて作問をし始めたのですが、これぐらいやったら解けないだろうと思っていた問題が LLM によって一瞬にして解かれていってしまったので前述した通りだいぶ焦りました。
一方で単純にエンジニアの学びにだけフォーカスするなら LLM 禁止や運営側で用意した LLM だけを使って問題を解くというのもアリだなーと思います。アンケートでそのようなフィードバックをもらって本当にそうだなと思ったので今後は色々検討したいと思います。
実際に出した問題
セキュリティエンジニアリングのメンバーのいちびさんが、Go Conference 2025 で発表のあった
サプライチェーン攻撃に学ぶModuleの仕組みと セキュリティ対策 - Speaker Deck
を参考にタイポスクワッティングの問題を出してくれました。Go のプロジェクトを配布してそれを実行するとイタズラのメッセージが出てくるのですが、その原因を探れという問題で、コードをよく見るとパッケージの URL が違っていて、そのモジュールは replace でローカルのものを実行するようになっていました。そのローカルのファイルを確認するとそこにフラグがあるというもので問題として非常に良かったと思います。
(それはそれとしてこちらの kuro さんの資料非常に良いものなのでぜひ一度ご覧ください。この場を借りてお礼申し上げます)
毎回この競技会ではテーマを設けているのですが、今回は RPG でした。これは問題を作問する段階で決めるのではなく、いつもデザイナーの方との打ち合わせの際に決めています。デザインありきで問題をそちらに寄せるという方法を私はとっていて、参加者一人一人が勇者として、問題(ダンジョン)をクリアしながら経験を積み重ねるというものを意識していました。
私もサプライチェーン攻撃に関する問題を1問 npm install を実行すると減点するという問題を作っていましたが、RPG というかドラゴン何ちゃらですが、呪いはつきものですよね!ということで The Curse of the NPM という npm run revear をするとフラグが出てくるという問題を作りました。npm install をすると呪いのメッセージが表示され Slack にその端末の情報が送られてくるようにしていたので運営としては面白かったです。ちゃんと npm install をせずに解けた人もいて、それもまた嬉しかったです。
※問題文に縦読みで NPM Don’t Install と書いていたり遊び心を散りばめています。
※npm install を実行したら上記のメッセージを表示していました
最後に
参加メンバーから終わった後に質問をもらいました。「よりセキュリティの知識を身につけるにはどうしたら良いか?」というものでした。以下はあくまでも私個人の考えで、カミナシという組織においてはこう考えているという風に読んでいただければと思います。
例えば私は英語話せないのですが外国人が困っていたら声をかけるようにしています。自分は喋れないけれど、喋れる人を代わりに見つけることはできるというのが自分の中にはあります。実際こういう時は大きい声で助けを求めることも厭いません。そうすると手伝ってくれる人が出てきたりします。昔からこういう風に振る舞っているのですが、これが大事だと思っていまして、困っている人に気付かない人もいたり、あるいは手助けできるけれどすでに声かけているから自分の出番じゃないかな?と思ってしまう人もいるのではないかと、もちろん英語が喋れないから困っている人の手助けはできないと思う方もいらっしゃると思います。
これはセキュリティも一緒で、そもそも気付かない人や、気付いてはいたけど放置してしまうということがあると思います。
いろんな言語を習得して困っている人を助けたい!人の役に立ちたいというのはすごく素敵なことだと思う一方で、セキュリティも自分で何から何までやるのは難しいと思っています。これはセキュリティエンジニアですら自分の得意な領域に限り知識を持っているけれど、それ以外のところは何もわからないというのは当たり前にあるからです。私自身もそうです。
ただ、幸いな事に私の周りに強いセキュリティエンジニアがたくさんいて、そういう人たちの力を借りることができています。この考えはきっとソフトウェアエンジニアも同様で、セキュアなコードを書くとか、設計をするとかできるに越したことはないものの、最低限のセキュリティの知識を持っていたら、それよりもコードを書くときや、設計する時に困っている人がいるのを見つけるみたいに、「あれここセキュリティ気にしなくていいんだっけ?」とかちょっとヤバそうだなという感覚をこういった競技会の場を通して身につけてもらいたいと思っています。
そういう気に掛けることができるかどうかというのがすごく大事で、そのような気付きがあったときに「一旦セキュリティエンジニアに聞いてみようかな」というマインドセットを持てるかどうかが重要だと思っています。そういうマインドセットになることこそがセキュリティ文化が醸成されている状態であり、カミナシにおけるセキュリティの一つのゴールであると定義しています。
このように気付くことさえできれば周りに助けられる人がいなくても自分が外国語を喋ることができなくてももしかしたら翻訳アプリがどうにかしてくれるかもしれないです。ですのでまずは気付ける状態を作りたいのです。
もちろん「自分が英語を喋ることができたら」「英語以外の言語も喋ることができたら」といったように、誰かの役に立つために勉強することはとても素晴らしいことだと思います。ただ、そこまでのモチベーションを維持し続けるのはよほどではない限り難しいですし、時間は有限です。それ以上にビジネスをやっている以上優先度が高いこともあるため、そこのモチベーション次第では開発の方のスキル向上に注力してほしいと考えています。
カミナシではセキュリティのオーナーシップもソフトウェアエンジニアが持ちますが、オーナーシップというのはそういうことで、自分で課題を解決できればもちろんいいけれど、他の人の力を借りてでもその課題を解決することに責任を持つということなのだと私は理解しています。
質問をしてくださった方はある程度知識をすでに持っているという前提で私は上記のように思っています。この”ある程度”は書籍を読んだりして基本的な脆弱性を抑えているというところがポイントです。
「最後に」がめちゃくちゃ長くなりましたが、カミナシではこういった環境で共に開発をしてくださるメンバーを求めています。ぜひ一緒に働きましょう!