こんにちは。この度、技術職就業型コースでインターンシップに参加しました京都大学修士課程1年の平井雅人です。本インターンで所属したチームはアプリケーションセキュリティチームという社内のアプリケーション全般の脆弱性診断(リスクアセスメント)などを行うチームです。アプリケーションセキュリティチームで行っている業務について詳しくは昨年のブログをご覧ください。
本ブログでは、6週間のインターンシップでの成果や感想について話していきたいと思います。
取り組んだ内容
セキュリティチームにはSIMS(Security Issue Management System)と呼ばれるセキュリティ上の問題の報告などを管理するシステムがあります。今回はこのシステムに対して機能追加の実装を行いました。
SIMSとは
LINEでは、LINEが提供するサービスに潜んでいる脆弱性のチェックを行うために、リリースの前段階においてセキュリティエンジニアによる診断を行います。しかし、セキュリティエンジニアによる診断には個人のスキルに依存するところが大きく、どうしても見逃しが発生してしまいます。そこでLINEではこれらの診断を自動化することで、発見率を上げるという取り組みをしており、この核となるシステムがSIMSです。
SIMSではCI(継続的インテグレーション)上でAST(アプリケーションセキュリティテスト)を行うことで診断の自動化を行います。ASTではソースコードの解析や、攻撃スクリプトの実行によって脆弱性を見つけます。これを業務上の運用フローに乗せることによって、より迅速な発見を行うことができます。また、これらの機能によってセキュリティエンジニアは自動化されている作業をやらなくて良くなるため、短いスパンでより多くのプロダクトのリスクアセスメントを行うことにもつながります。
今回はこのSIMSというシステムに対して、リスクアセスメントにおいてセキュリティエンジニアがより効率的に作業できるようにするための機能拡張を行いました。
機能拡張の動機と概要
すでに修正済みの脆弱性に対して、誰かが誤ってその脆弱性を再度発生させてしまうといったことがあるかもしれません。例えば、バグを修正する際に古いコードを再利用してしまい、それによって全く同じ脆弱性が再発してしまうといった場合などです。このようなことを確認するために、セキュリティエンジニアが都度攻撃用のスクリプトを用いて再発していないかどうかを確かめるということが行われていたのですが、そもそも機械的な作業をセキュリティエンジニアが行うというのは効率的ではありません。
従って、この部分を自動化することでセキュリティエンジニアの仕事を効率化することができないかということが考えられており、今回のインターンではCIでの既知の脆弱性の攻撃用スクリプト実行の自動化の実装を行うことになりました。
機能拡張の内容
今回は既知の脆弱性に対するテスト用の攻撃スクリプトを用意しておき、それをCIで実行してその脆弱性が再発していないかや正しく修正されているかを自動的に確かめる機能を実装しました。SIMSでは既にCI上での静的なソースコード検証ツールが動いていたので、そこに今回の処理を追加する形で実装を行いました。
アーキテクチャの構成図は上記のようになります。SIMSにおいて、リスクアセスメントのチケット作成時に自動で実行され、そのリクエストをRegression Testerに送信します。それを受け取ったRegression Testerは、それを用いて実際にそのスクリプトを実行します。その結果、攻撃が成功したかどうかをSIMS側に報告して実行終了です。
エンティティの分離
今回の実装ではSIMSとRegression Testerのエンティティを分離しました。SIMSと一緒にしてしまうというのは異なる役割のものをまとめてしまうことで結合性が高まるため当然良くはないのですが、それよりも今回はRegression Testerによる攻撃スクリプトの実行の際にRegression Testerのサーバーリソースを大量に消費する可能性があることが一番の理由です。将来的にロードバランサを用いて負荷を軽減したり、コンテナを用いたスケーラブルな環境で実行できるようにすることを想定して極力分離された設計を行う必要がありました。
結果の表示
また、攻撃スクリプトの実行結果をSIMSで一覧表示できるようにSIMSのバックエンド側の実装も行いました。結果をSIMSが受け取った時に、攻撃が成功していれば別途チケットの発行を行うというものです。
実行環境の構築(Regression Tester)
攻撃用スクリプトについては、セキュリティチーム内ではほとんどPythonが使われているということもあり、Pythonを主に取り扱うことにしています。Dockerを利用して環境を構築し、Regression Tester内に作られたコンテナからPythonのソースコードを実行して、特定のエンドポイントに対して攻撃可能であるかどうかを検証します。
機能拡張の設計
今回はこのようなテストを行う機能を新規に追加しましたが、もともとはSIMSの既存機能を利用する形で実装しようと考えていました。その機能は、対象となるサービスやソースコードに、予め設定した静的解析(SAST)や動的解析(DAST)ツールによる診断を実施するものです。そこで設定されるツールは、SIMSで管理されているすべての対象に汎用的に適用できるものであることが想定されていました。しかし、今回のケースでは、既知の脆弱性ということで特定のプロダクトに特化するような形式を考えていたため、SIMSの既存設計を流用することは難しいと判断した次第です。攻撃の検証部分については、SIMS上で脆弱性チケットに攻撃用スクリプトを紐づけてDB上で保存する実装が既に行われていたため、この部分を用いるように設計しました。
フロントエンド
上記は開発に用いたテスト用のページです。左側のTickets, Scanner,...が並んでいるナビゲーションバーにRegressionTestのページを作成して、ここからRegression Testの結果を見ることができるように実装しました。赤枠の部分が今回実装した部分になります。
SIMSの運用など、新機能の実装後の話については説明が長くなってしまうため、ここでは割愛させていただきます
感想
今回はアプリケーションセキュリティチームとしてインターンシップに参加させていただきました。LINEにおいてセキュリティチームがどのように動いているのか、どのようにリスク評価をしているのかといった、普段は見えないようなところを見ることができて、とても満足しています。ただ、最初の2週間程度の間はやることがなかなか決まらなかったり、いろんなトラブルがあったりして、スケジュールが押されてしまい、少し行う予定だったリスクアセスメント業務がほとんどできなくて残念でした。しかし、皆さんに大変よくしていただいて、無事にここまで漕ぎ着けることができてよかったです。特にメンターの方には色々とお世話になりました。
今回のインターンシップで主に担当したSIMSの機能拡張の実装においては、SIMSのソースコードが既にそこそこ巨大だったため、実装に際して読まなければいけない部分を読むのに結構時間を使ってしまったのが大変だったかなと思います。できるだけ既存の哲学を守りつつ保守性を意識してコードを書いていたのもあって、時間が押してる中で必要以上にソースコードを読んでしまっていたのは少し反省点だと考えています。もう少しバランス良く行えると良いと思いました。
また、今回のインターンは原則リモートで参加することになっていたのですが、希望すれば出社できるとのことだったので、今回は1日だけ四谷にあるオフィスに出社させてもらいました。綺麗なオフィスで、とても多機能な良い椅子が使われていたり、机も広く、業務が捗りました。昼食ではカフェテリアにてお弁当を購入し、福利厚生のマッサージを受けるなど最大限LINEの雰囲気を知ることができたと思います。
今回インターンシップに参加して得られた経験はとても貴重なものだと思います。興味を持っている方がいましたらぜひ参加してみてください。