LINE株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。 LINEヤフー Tech Blog

Blog


【インターンレポート】Talk Message Risk Assessment Toolの開発

はじめに

はじめまして。大阪大学大学院工学研究科 修士1年の小谷将太郎です。
2023年8月21日から9月29日までの6週間、Security Assessment Team(SAT)にインターンシップとして参加させていただきました。
SATでは、LINEのリリース前のサービスや機能に対するリスクアセスメントやBugBounty Programの運営などを行なっています。

リスクアセスメントでは、サービスの開発者から依頼を受けると、脆弱性やバグがないかを調査し、問題があれば開発者に修正の依頼を行います。
BugBounty Programでは、外部のセキュリティ研究者から報告のあった脆弱性について社内で調査し、影響度の確認や修正の依頼、報奨金額の決定などを行います。

私がLINEのセキュリティエンジニアのインターンに興味を持ったきっかけは、LINEのBugBounty Programです。
以前、私が管理するOpenChatに不具合が生じたことがありました。

この不具合の原因を調査する過程でバグを発見したため、LINEのBugBounty Programに報告したところ、報奨金の対象として認めていただきました。
このような経緯から、LINEのセキュリティエンジニアのインターンに興味を持ち、参加させていただきました。

本レポートでは、インターン中の過ごし方と、取り組んだプロジェクトであるTalk Message Risk Assessment Toolの開発について紹介したいと思います。

インターン中の過ごし方

まず、私が6週間のインターン期間をどのように過ごしたかを紹介します。

1週目

1週目は、Onboardingの期間でした。学習用の脆弱なWebアプリケーションを攻撃してみて、発見した脆弱性についてまとめるという体験をしました。

また、Androidデバイスをroot化し、LINEやファミリーのアプリの通信をプロキシツールであるBurpSuiteを用いて確認したり、Dynamic Binary InstrumentationツールであるFridaを用いた動的解析などを行いました。
自分が興味のあるサービスのソースコードや仕様書を読んでも良いとのことだったので、OpenChatを調べたりもしていました。

2週目

2週目は、SATの業務の一つであるリスクアセスメントを実際に担当させていただきました。
担当したのはWebアプリケーションであったため、BurpSuiteの通信を見たり、リクエストを書き換えたりして調査を進めました。

担当するサービスの仕様書やソースコードも与えられるため、静的な調査も行いました。
発見した問題については、再現手順や原因箇所の追求を行い、可能であれば修正方法なども合わせて、開発者に報告しました。

3週目

3週目は、iOSアプリのリスクアセスメントを担当させていただきました。
Commit, PR, Diff、開発者側のチケットなどから変更点を中心に調査したり、実際に実機にインストールして検証を行なったりしました。

また、インターン中に取り組むプロジェクトのアイデアについてもこの週で考えました。

4、5、6週目

この3週間でプロジェクトに取り組みました。

背景・目的

ここからはインターンで取り組んだプロジェクトであるTalk Message Risk Assessment Toolの開発について紹介します。

LINEのトークサービスにおいて、iOS版、Android版、デスクトップ版などのクライアントとサーバー間の通信には、Apache ThriftというRPCが用いられています。
LINEクライアントはメッセージを送る際、Thrift IDLで定義されたMessage構造体を用いて、sendMessageという関数で送信します。
Message構造体は、メッセージの種類を表す数値型のフィールドや、メタデータを格納するMap型のフィールドなど、メッセージを表現する様々なフィールドを持っています。

例えば、メッセージの種類には、テキストや画像、動画、Sticker、連絡先、ギフト、Flex Messageなどの様々な種類があります。
メタデータには、様々なデータが{"key":value"}という形式で格納されます。

例えば、連絡先を送信する場合だと、{"mid":"uXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}といった形で格納されます。※midとはLINEで使用されているユーザーの内部識別子です。
LINEはLetter SealingというEnd-to-end encryptionを提供していますが、暗号化されたメッセージもMessage構造体を用いてやりとりされます。

様々な使われ方をするMessage構造体ですが、過去には通常のLINEクライアントから送信されることのない不正なメッセージを送信することで、受信者のLINEクライアントがメッセージを解析できず、クラッシュして開けなくなるバグがありました。
既にこのバグは修正されており、最新版のLINEクライアントでは発生しませんが、このようなバグが仮に悪用された場合、ユーザー自身で対処することが難しいです。
私がはじめに申し上げたBugBounty Programで報告したバグもこれに起因するものでした。

このような攻撃を防ぐためにはサーバーサイドでMessageが不正な形式ではないかの検証、クライアントサイドで不正なMessageが送られてきた場合に適切に例外処理を行うことが必要ですが、漏れがあったり意図していない実装になっている場合があります。

そこで、インターンのプロジェクトとして、スクリプトを用いて不正なMessageを送信することで、クライアントに不具合が発生しないかを動的に確認することを目的とした、Talk Message Risk Assessment Toolの開発に取り組みました。

調査

まず、LINEのメッセージに関する仕様の調査と理解を行いました。例えば以下のようなものです。

  • LINEの仕様で定められているメッセージの種類
  • 想定されているメタデータ
  • E2EEでのメッセージの送受信方法

さらに、BugBountyの報告や、リスクアセスメントで見つかったIssueを読み、過去の事例の調査も行いました。

実装

本ツールの実装には、SATが開発しているPython実装のLINEクライアントを使用しました。
これはメッセージの送信やアカウントの作成、友達追加などiOS版やAndroid版のLINE上で行うことができる操作を、Pythonで行うことができるものです。

実際に以下のような手順で、開発したツールを用いてバグの検査を行いました。
まず、BETA環境下で、攻撃者のアカウントと、被害者となるアカウントを用意します。

BETA環境とは、LINEの開発者がサービスのリリース前に利用できるステージング環境です。
実際のユーザーがいるサービスとは隔離された環境であるため、安全にセキュリティ検査を行うことができます。
ここでは便宜上、不正なMessageを送信する側を攻撃者、受信する側を被害者と表現しています。

次に、攻撃者のアカウントからTalk Message Risk Assessment Toolを用いて不正なMessageを送信し、被害者アカウントがログインしているデバイスで挙動を確認します。
検査の対象としたチャットは、1:1の個人チャット、グループチャット、OpenChatです。
メッセージの送信はE2EEに対応しています。

最後に被害者側のデバイスでバグが発生した場合は、クラッシュダンプなどを分析し、どの部分でバグが発生しているかを突き止めます。

また、攻撃対象のチャットの識別子を一覧で表示する機能や、攻撃者側のアカウント切り替えなど、利用者にとって扱いやすい機能の実装も行いました。

まとめ

本ツールを用いて、いくつかのバグを発見することができたため、原因の追求と開発担当者への報告を行いました。
元々、不正なMessageを自動で生成するFuzzerとしての実装を検討していましたが、手動で作成した不正なMessageでバグが発生することを発見したため、Fuzzerとしての実装は一旦置いておいて、バグについての原因追究などを優先して取り組みました。

ツールの実装にあたって非常に良いと感じたことは、BETA環境の存在と、テスト用アカウントの自動生成です。
BETA環境下で検査を行うことで、関係ないのユーザーを巻き込まず、安全に検査を行うことができました。
また、本来LINEアカウントを作成するためにはSMS認証用の電話番号を用意する必要がありますが、テスト用アカウント作成のためのワークフローが自動化されており、ストレスなく複数アカウントを用いた調査を行うことができました。

また、プロジェクトを進めるにあたって、BugBounty Program参加者の方のレポートは大変参考になりました。
LINEの安全性は多くの外部のセキュリティ研究者によって支えられているということを実感しました。
余談ですが、LINEのBugBounty Programに既に参加していたり、興味のある方でもLINEのインターンに参加することができます。

LINEのインターン終了後6ヶ月以降であれば、再びBugBounty Programに参加することができ、報奨金の対象となります!
詳しい参加方法は次のURLを参考にしてください。https://bugbounty.linecorp.com/ja/terms_of_use/

LINEのバグを探してみたいと思った方は、自身が管理するアカウントに対してのみ検証することに注意してください。
バグを発見した場合には、Bug Bounty Programへの報告を推奨しています。

最後になりますが、インターン期間を通してサポートしてくださったメンターの方やSATメンバーの皆さん、本当にありがとうございました。

May the LINE be with you...