FFRIエンジニアブログ

株式会社FFRIセキュリティのエンジニアが執筆する技術者向けブログです

2021年度インターンシップの紹介~エアコンファームウェアのペンテストをやってみよう

はじめに

セキュリティサービス部セキュリティエンジニアの一瀬です。セキュリティサービス本部では、2021 年 8 月と 9 月、それぞれ 5 名の方に参加いただき、「実践的手法を用いた IoT 機器ペネトレーションテスト」と称した、5 日間のインターンシップを実施しました。9 月に講師を担当しましたので、内容や当日の様子などについてお伝えします。

インターンシップの概要

インターンシップは全工程がリモートで、講義や連絡は Slack で行います。質問は Slack のインターンシップ用のチャンネルに投稿してもらい、必要があれば講師とハドルで通話します。

インターンシップのテーマはずばり、エアコンファームウェアのペネトレーションテスト(以下、ペンテスト)です。IoT 機器検証の実績があるFFRIセキュリティだからこそ、実践に即したことを学んでいただきたく、このテーマを選びました。

A 社が開発したエアコンの検証を依頼され、エアコンと操作アプリを提供されたという想定です。操作アプリは Linux 上でエミュレートして、エアコンファームウェアはエアコンから抽出して(という想定で)QEMU 上で動作させ、ペンテストを行います。今回は、 AWS の EC2 を 2 つ使って検証環境を構築しました。

2021年インターンシップの検証環境

作業用 EC2 には、Wireshark や Ghidra など、検証に必要な様々なツールがインストールされています。なお、ファームウェアは抽出済みという想定ですので、作業用 EC2 にファームウェアファイルが置かれています。参加者は作業用 EC2 にリモートデスクトップ接続して検証します。

ペンテストの流れ

本インターンシップでは、ただ手を動かして検証をするだけではなく、実務に沿った作業をするということを重視しました。そのため、初日の講義では以下のようなペンテストの一般的な流れなどもお話ししました。

  1. 脅威分析
    1. 資産の列挙
    2. データフローの可視化(例: DFD 作成)
    3. 脅威の洗い出し(例: STRIDE 分析)
    4. 発見された脅威を引き起こす攻撃手法の列挙(例: Attack Tree 分析)
    5. 脅威に対するリスク評価(例: DREAD 分析)
  2. 検証
    1. 検証手順の整理
    2. 実際の検証
  3. 報告
    1. 報告書作成
    2. 報告会

こうして見ると、実際の検証はペンテストのプロセスのほんの一部であることが分かりますね。

本インターンシップでの作業

本来は脅威分析から始めるべきペンテストですが、そこからやってもらうとそれだけで 5 日間が終わってしまうため、脅威分析は終了したという前提で、検証すべき 6 つの脅威をこちらから提示し、2. の検証から始めてもらうことにしました。例として、検証する 6 つの脅威うち 2 つを紹介します。

  • 操作アプリを認証するためのトークンが流出する
    • 操作アプリは、コマンドを送信する際に認証のためのトークンを一緒に送信します。そのトークンが外部から入手できるかを確認します。
  • プロセスが異常終了する
    • ファームウェア上で稼働している、エアコンの設定管理のためのプロセスを異常終了させられるかどうかを確認します。

参加者は、6 つの脅威について、以下のような作業をします。

  1. 検証手順の整理(テスト計画作成)
  2. 実際の検証
  3. 報告書作成
  4. 報告会

各作業について簡単に説明します。

1. テスト計画作成

前述の「ペンテストの流れ」の「2. 検証」でまず実施する「a. 検証手順の整理」を、検証すべき 6 つの脅威について行います。今回は、どういうツールを使って何をするかを簡単に記述したテスト計画を、ペンテストチームで作成して共有するための内部資料 (なので体裁は特に問わず) として作成してもらうことにしました。 8 月のインターンシップでは説明資料に検証のヒントを盛り込んだところ、あっさり全問を解いてしまう人が続出したため、9 月はヒントを大幅に削減しました。その代わりにテスト計画を作成してもらって、分からないところがあれば講師がフォローしようという目論見です。また、検証の時間が限られているため、テスト計画を作ることで、各脅威の検証にかかる時間を意識してもらう狙いもあります。

2. 検証

6 つの脅威について、実際にツールなど使って検証します。 早く終わった人のために、追加課題も用意しました。追加課題は、プロセスが異常終了する脆弱性を悪用して、任意のコマンドが実行できるか確認するというものです。

3. 報告書作成

検証結果に加え、実際に攻撃された場合の影響や対策などをまとめます。検証できなかったものについても、理由を添えて記載してもらいました。

4. 報告会

報告書をもとに、お客様である A 社の皆さまに報告します。報告 10 分、質疑応答 5 分で行いました。

5日間の戦い

5 日間のスケジュールは以下の通りです。

  • 初日〜2 日目正午まで:テスト計画作成
  • 2 日目正午〜4 日目終日:検証
  • 〜5 日目 15 時:報告書作成
  • 5 日目 15 時〜16 時:報告会

それぞれについて、参加者の皆さんの様子をご紹介します。

テスト計画作成

ゼロから作るのは難しいと思ったので、サンプルを用意してそれに沿った形で作ってもらいました。

テスト計画のサンプル

もちろん、実際に検証を進めていけば別の方法を思いつくこともあるはずですので、「各脅威についてまず何をすべきか」だけでも書いてもらうようにしました。そこで全く思いつかない場合は、講師がヒントを出しました。初日でしたが、皆さん物おじせず質問してくれていました。

検証

ここからが本番、つまづく人続出かと思いきや、テスト計画を作成していて少なくとも初動はそれほど迷わないため、Slack チャンネルはしばし沈黙していました。

具体的にどういった検証を行なったか、前述の 2 つの脅威を例に少しだけ解説します。 まず、「操作アプリを認証するためのトークンが流出する」について、まずは Wireshark で通信を傍受し、トークンらしき文字列を確認することが出発点です。さらに、Ghidra や GDB を使って調査し、トークンらしき文字列が実際にトークンであることの確認まで行いました。 もう 1 つ、「プロセスが異常終了する」脅威について。こちらは単純に操作アプリを使っていろいろな値を入れていくことが出発点です。ただ、こちらもそれだけで終わらず、異常終了した値について Ghidra や GDB を使って調査します。そして「この関数」の「ここ」で「こういうこと」が起こって異常終了する、というところまでみなさん検証していました。

何人かは追加課題に挑戦しました。プラットフォームが x86 でなく Arm ということもあり慣れていない人が多かったため、たまたま Arm 上での ELF マルウェアの解析をしていたサブ講師とも積極的にやり取りしてがんばってくれていました。ちなみにこれは前述の通り、8 月のインターンシップで急きょ捻出した課題です。講師も正解を知りません。本来のペンテストは、当たり前ですが CTF と違ってできるかわからない状態でやることになるため、図らずも本物の業務っぽくなってよかったです。

報告書作成に苦戦

検証が終わったら報告書作成です。検証そのものは、すでに CTF に参加していたり興味を持って学んだりしていた人が多かったため割とスムーズにいきました。しかし、それをセキュリティをあまり知らない人に説明する資料を作るとなるとやったことがある人はおらず、皆さん苦戦していました。

共通して悩んでいたのは、「どこまで書けばいいのか」です。Ghidra での解析結果を事細かく書くのか?結果だけ並べておけばいいのか?これは、私たちも案件のたびに悩むことです。基本的には、報告書は端的に結果を書き(この「端的に」が難しいのですが)、細かいログは付録に記載する、というのが常道ではあります。今回は、報告書が報告会で使うスライドも兼ねていたので、内容に加えて見やすさも考慮しなければならない上、報告時間が 10 分と短いのも、難しさに拍車をかけていました。

講師からは、以下のようなアドバイスをしました。

【誰に対する報告書なのかを意識すること】

  • お客様はエアコン製造メーカーという想定です。セキュリティに詳しいわけではありません。その前提の上で、お客様が欲しい情報をまとめましょう。

【何をどこまで書くのか】

  • 基本的には、テンプレートに書かれている程度の細かさで書いてください。分かりづらそうな点についてもう少し説明しますと:
    • 検証手順:テスト計画で書いた程度の粒度で書く
    • 検証結果:手順を実行した結果を書く(説明資料にある確認すべき事項を確認した結果を含めること)
    • 脆弱性の影響:この脆弱性を悪用されるとどんな悪いことが起きるのか、を書く
  • 修正方法、緩和策:脆弱性を無くす方法、脆弱性を悪用されたときの被害を小さくする方法を書く。可能な限りお客様にとって実現可能な方法を書きましょう(ただし、方法を細かく書きすぎないこと。それはペンテストの報告でなく、コンサルティングという別の仕事になります)

報告会

どうしても長くなりがちな報告書に対して、報告時間は 10 分しかありません。それでもみなさん時間内に必要なことはきちんと説明していて感心しました。8 月のインターンシップの報告会を見ていても思ったことですが、みなさんなんであんなに発表がうまいんでしょうね?自分が学生の頃のことを思い出すと、とてもじゃないけどあんなふうに話せるとは思えません。質疑応答も活発に行われ、むしろ時間が足りなくてもったいなかったなくらいでした。報告会の後、各参加者の発表についてコメントし、報告書の見本を見せつつ実際にどういう脆弱性だったかを簡単に説明したところで時間が来てしまいました。これは講師陣としては反省点で、もう少し報告書作成についてや、検証方法、追加課題の解説などに時間をとるべきでした。報告書の書き方について、参加者の皆さんとディスカッションしてもよかったかもしれません。それくらい、参加者の皆さんはセキュリティエンジニアとしてすでに優秀でした。

イベントいろいろ

5 日間と短い期間ではありましたが、せっかくの機会でしたので以下のようなイベントを詰め込みました。

  1. 初日座談会
  2. 講師との進捗報告 1on1
  3. セキュリティエンジニアによるなんでも相談 1on1
  4. 参加者のみのフリーディスカッション
  5. 最終日座談会
  6. 懇親会

それぞれについて説明します。

1. 初日座談会

まずはお互いの人となりを少しでも知っておこうということで、参加者と講師陣によるざっくばらんな座談会を行いました。講師陣の現在の業務の紹介や質疑応答など、初日ということで多少緊張感がありましたがいろいろとお話ししました。

2. 講師との進捗報告1on1

毎日 17 時から、各参加者と講師とで通話して進捗報告を確認しました。日中もハドルで質問に答えたりはしていましたが、ここで改めてその日やったことを報告してもらい、詰まったところの解決や次の日何をやるかの確認などを行いました。

3. セキュリティエンジニアによるなんでも相談1on1

講義内容だけでなく、FFRIセキュリティの話や就活そのものの話など、なんでもありの 1on1 を、期間中に一人 30 分時間を取って行いました。全員の前では話しにくいキャリアに関する相談から、参加者が興味のある技術を深堀りした議論(バックドア検出技術や最新のマルウェアの特徴、AI セキュリティ等...)まで、参加者の方のご質問に沿いながら幅広いテーマでお話しました。

4. 参加者のみのフリーディスカッション

講師とだけではなく、参加者同士でも交流をしてほしかったため、毎日の進捗報告後に 30 分ほどフリーディスカッションの場を設けました。講師は開始の時だけ参加し、以降は参加者のみの通話なため、何を話していたかは講師陣も知りません。ただ、30 分を過ぎても話している日もあったようで、盛り上がっていたのではないでしょうか。

5. 最終日座談会

こちらは正規の(?)座談会で、人事主導で様々な質問に講師や参加者が答えるという形で行われました。講師陣それぞれの入社までの経緯や、セキュリティサービス本部の仕事の面白さ、入社前に勉強しておいた方が良いこと、社会人から就活におけるアドバイスなど、様々な話をしました。

6. 懇親会

最終日の夜、任意参加での懇親会を行いました。5 日間の戦いを終え、話が弾みました。講師だけでなく、若手のセキュリティエンジニアにも参加してもらい、参加者に近い目線でもお話できたのではないかと思います。

おわりに

個人的に、人にものを教える仕事は久しぶりだったこともあり、とても楽しい 5 日間でした。終了後のアンケート結果を見るに、参加者の皆さんも満足してくださったようで、ホッとしています。やはり報告書作成や報告会など、今までやったことの無かったことをしたというのが印象的だったようで、実際の業務に即したことを体験してほしいというこちらの思いをうまく実現できたのではないでしょうか。 セキュリティサービス本部では、来年度以降もこのインターンシップを実施する予定でいます。興味のある方はぜひご応募ください。なお、今回はある程度セキュリティの経験のある方が参加していましたが、未経験でもエンジニアがサポートするのでご安心ください。

FFRIセキュリティのインターンシップについて

当社のインターンシップはセキュリティ専門企業ならではのテーマと実践的な内容が魅力です。 どのテーマも実際に業務で取り扱う題材をもとに課題が作成されており、インターンシップを通じてFFRIセキュリティで働くイメージを掴んでもらえるようになっております。 また、全てリモート形式で実施しているため、遠方にお住まいの方にもご参加いただきやすくなっております。

リモート形式ということで、社員との交流の機会が少ないかと思われるかもしれませんが、1on1、懇親会、座談会などの当社エンジニアとの交流の時間を豊富に設けておりますので、ご安心ください。

今年の夏のインターンシップでは、今回のブログで取り上げたテーマの他にも、 以下のテーマでインターンシップを企画しました。

  • テーマ 1: 実践的手法を用いた IoT 機器ペネトレーションテスト(本ブログのテーマ)
  • テーマ 2: CPU レベルでの脆弱性防御機構の作成
  • テーマ 3: AI に対する攻撃と防御
  • テーマ 4: マルウェア検出ロジックの開発

今年度は、冬のインターンシップの開催も予定しております。 自社 HP やリクナビで募集をしておりますのでご興味のある方は、是非ご覧になってください。