NTTドコモR&Dの技術ブログです。

アプリ開発者必見!情報漏えいを防ぐためのリバースエンジニアリング入門

自己紹介

はじめまして。新事業開発部 事業アクセラレーション担当 佐藤美沙希(@dcm-satou)と申します。

いきなりですが、企業で働くアプリ開発者の中にはセキュリティチェックシートの回答に頭を悩ませたことがある方は少なくないのではないでしょうか?経験がある方なら、その苦労をよくご理解いただけるかと思います。この苦労については、こちらの記事でも詳しく述べられています。

qiita.com

弊社も例に漏れずで、特にたくさんのお客様を抱えているドコモは、お客様に安心してアプリを届けるために、他社と比較してセキュリティチェックが厳しい部類に入ると思います。私は今年新入社員として入社し、希望していたアプリ開発ができる部署に配属されたはいいものの、時間や手間がかかるセキュリティチェックシートを目の当たりにして早速その大変さを実感しています。この負担を軽減したいと思った私は、現在社内のセキュリティチェックシートの回答を自動化するアプリセキュリティ検査ツールを開発しています。

今回の記事では、検査ツールを開発する上で身につけた、「アプリのリバースエンジニアリング」について解説し、実際リバースエンジニアリングでどのようなことができるのか、アプリにどのような情報漏えいのリスクが潜んでいるのかをを紹介してみようと思います。

概要

本記事では、iOSアプリのビルドデータであるipaファイルを例にとり、アプリのリバースエンジニアリングの方法と、実際にどのような情報が見えてしまうのかをご紹介します。また、その結果からアプリビルドデータの流出の危険性について触れようと思っています。

本記事の対象者は、アプリ開発に関わる人全員です。現時点で「リバースエンジニアリング」をご存知でなくても大丈夫です。「こんな情報がこんなにも手軽に見ることができてしまうんだ」ということを知っていただき、ビルドデータが流出する危険性を認識していただけると嬉しいです。むしろ「リバースエンジニアリング」をご存知でない方にこそ、この記事を読んでいただきたいと考えています。

本記事の構成は以下です。気になるトピックだけ読んでいただいてもOKです。とにかく、アプリのビルドデータに潜む情報漏えいのリスクを最低限知っていただければ筆者としても本望です。

リバースエンジニアリングって何?

早速ですが、「リバースエンジニアリング」とは何でしょう?端的に言うと「既存の製品やシステムを解析し、内部構造や仕組みを理解すること」です。アプリ開発にかぎって言えば、コンパイルされたプログラムから無理やりソースコードを取り出すなどして、プログラムの仕様を知ることなどが挙げられます。

「そんなことしたらアプリに含まれている大切なデータが全部見られてしまう、やばいじゃん」って思いました?そうなんです。何度も言いますが、この記事ではそのやばさを知ってほしいので、その感覚は間違ってないです。

とはいえ通常アプリのリバースエンジニアリングはアプリの利用規約で禁止されていることがほとんどなんですが。

X(旧Twitter)の利用規約(https://twitter.com/ja/tos)から引用

では、どんなときにリバースエンジニアリングを行うのでしょうか?一般的には、侵入テストや弱点発見、セキュリティコードの開発などのセキュリティ分野や、バグ修正、新技術の研究と学習などで行われます。

一方で悪用される可能性も考えられます。リバースエンジニアリングの知識を持つ悪意のある人は、セキュリティ上の脆弱性を見つけて不正アクセスに利用したり、ソフトウェアの不正コピーをしたりすることができてしまうかもしれません。

実はとっても簡単にできてしまうので、やってみて危険性を実感してみましょう。一緒に手を動かしてみたい方は、ご自身で開発されたアプリや、許可されたアプリを使うなど、規約に触れないようにしてくださいね。

リバースエンジニアリングをやってみよう

準備

実行環境などは以下の通りです。

  • macOS Sonoma 14.1
    • Apple Silicon (M3 Max)
  • Xcode 15.0.1
  • アプリビルドデータ(ipaファイル)
    • XcodeでiOSアプリのプロジェクトを作成し、必要なコードとリソースを追加します。開発者アカウントを使って証明書とプロビジョニングプロファイルを設定し、Xcodeでビルドしてアーカイブします。最後に、Xcodeのオーガナイザーからipaファイルをエクスポートします。
    • 今回の記事は例として一般には公開されていないあるアプリを対象にします。

アプリの中身を見る

では早速、アプリビルドデータ(ipaファイル)の中を見てみましょう。

ipaファイルはzipアーカイブとして構成されているので、まずは、ipaファイルをzip展開します。

展開された中から、Payloadというファイルを開きます。

すると、(アプリ名).app というファイルが出てきました。このファイルを右クリックして、「パッケージの中身を表示」を選択します。

そうしたら、アプリを構成する様々なファイルが見られると思います(なお、以下の画像ではアプリの特定に関わる部分は黒くマスキングしています)。

アプリや実行環境によって多少の差はあると思いますが、概ね共通しているファイルやディレクトリ構造はこちらの表のようになります。また、各ファイルの役割や保持しているデータの大まかな内容も記載しました。

一見すると、重要な情報を含んでいそうなファイルが沢山ありますが、実際にリバースエンジニアリングでどのようなことが見れるのか、さらに解析してみましょう。この記事では以下に具体例を2つ挙げます。

アプリで使われている画像を見る

さきほど開いたipaファイルの中の、Frameworks > App.framework > assets > imagesを開いてみてください(使用しているフレームワークによって多少パスが異なるかも知れません)。このように実際にアプリで使われている画像が見えてしまいます(なお、以下の画像ではアプリの特定や他アプリに関わる部分は黒くマスキングしています)。

アプリで使用した画像が抜き取られてしまうことの何が危険なのでしょうか?

もし抜き取られた画像がそのまま使用されると、著作権が侵害される可能性があります。アプリ内のグラフィックや画像などは『美術の著作物』(著作権法第10条1項4号)として著作権の保護対象に含まれることがあります。

前述したように、多くのアプリでは利用規約でリバースエンジニアリングを禁止していますが、権利上容易に取得されてしまうと問題のある画像については配布するアプリケーション内には含まずネット経由で取得するなどの対策を検討すべきです。

使用されているライブラリを見る

MacOSで利用できるコマンドの1つに、「otool」コマンドというものがあります。このコマンドは、Mach-O形式(iOSやMacOSで一般的に利用される実行可能ファイルのフォーマット)のファイルを解析するために使用されます。

では、実際に以下のコマンドを実行してみましょう。

otool -L <アプリファイル名> | grep @rpath

「-L」オプションは、アプリファイルにリンクしている全てのライブラリの情報に加え、ライブラリのフルパス、バージョン情報を表示することができます。@rpath はリンカがライブラリを検索するためのパスです。つまり、上記のようにgrepコマンドで@rpathを含むもののみ絞り込むことで、外部提供のライブラリの情報のみを抽出することができます。

コマンドを実行してみると、以下のような結果が得られます。

このように使用しているライブラリが見れるということは、仮にプロジェクトのコードに問題がなくても、第三者ライブラリの脆弱性から攻撃されてしまう可能性があります。

対策としては、特別な理由がない限りライブラリは基本的に最新のバージョンに保つことが基本です。

まとめ

ここまで読んでいただきありがとうございました。ここでご紹介したリバースエンジニアリングの方法は本当にごく一部ですので、リバースエンジニアリングに興味を持たれた方はさらに詳しく調べてみてください(最後に個人的に参考にしたサイトや書籍をご紹介しています)。

また、今回はiOSのipaファイルについてご紹介しましたが、Androidのビルドデータであるapkファイルは(難読化が施されていなければ)コマンド一つで簡単にソースコードを見れてしまうなど別のリスクもあり、プラットフォームごとに留意すべきポイントも異なります。

このように、リバースエンジニアリング…ビルドデータからプログラムの中身を見るのは意外と簡単だということをおわかりいただけたかと思います。アプリのビルドデータに情報漏えいのリスクが潜んでいることに十分留意してアプリ開発を行いましょう!

参考文献

最後に、より詳細にリバースエンジニアリングについて学びたいと思った方向けに、私が勉強で大変お世話になったサイトや書籍をご紹介します。

  • Reverse Engineering Tools

    • リバースエンジニアリングでよく使われるコマンドを紹介しています。
    • 今回ご紹介したのはごく一部なので、色々試してみると楽しいと思います。
  • Apple Documentation / Bundle Resources

    • ipaファイルの中身を知りたいときに参考になります。
  • Apple Documentation Archive / Secure Coding Guide

    • Appleのセキュリティがどんな思想で設計されているのかを勉強できます。
    • とはいえ辞書的にしかまだ読めていないのでちゃんと読んで理解したいと思っているサイトです。。。
  • プログラムはなぜ動くのか

    • 文字通り、プログラムがどのように動いているのかを低レイヤから説明してくれています。
    • 個人的には、どうやってリバースエンジニアリングができているのかの裏側の動きを想像できる本で面白かったです。
  • はじめて学ぶバイナリ解析

    • バイナリ解析を実践する方法が学べました。
  • リバースエンジニアリングバイブル

    • リバースエンジニアリングの全体像について解説されています。
    • とはいえこちらも辞書的にしかまだ読めていないので、ちゃんと読みたいなと思っている1冊です。。。