任天堂、サードパーティアプリを認識していた
[ご注意]『スプラトゥーン 3』などのネットワークサービスにおいて正規アプリになりすまし、当社サーバーに不正にアクセスするスマホアプリの存在を確認しております。このようなアプリの利用はセキュリティや個人情報が脅かされたり、思わぬ被害を受けたりする可能性が考えられます。ご注意ください。
という注意喚起が任天堂からされていました。
さて、これについてわたし自身がどう思っているかということなのですが「全くもってその通りである」という一言に付きます。「もっといいアプリをつくれ」とか「API を公開しろ」とかは全く思っていません。そりゃ、API があれば嬉しいですけれど…
では何故そう思うのか、ぶっちゃけ Salmonia3+はどこまで個人のデータが抜けて、セキュリティはどうなっているのかについて解説します。
Salmonia3+の権限
以下の文章は長いので、先に結論を書いておきます。
- パスワードと ID を知ることはできない
- トークンには権限があり、できることは限られている
- トークンは厳重に保護されている
- とはいえ、非公式アプリを安易に使うべきではない
パスワードと ID
さて、Salmonia3+ではログイン時にパスワードと ID を入力してニンテンドースイッチオンラインのアカウントに連携する必要があります。
「これ、入力しちゃって大丈夫なの?」と思った方も多いと思いますし、極めて自然なことだと思います。
これに対する回答は「あのログインページは任天堂公式のものであるため安全である」ということです。アプリ側からは入力されたパスワードはもちろん、ID すらも知ることができません。
アプリの内部からブラウザを開いて認証するような仕組みでは
WKWebView
かASWebAuthenticationSession
のどちらかの仕組みを使うことになります。
この際
WKWebView
は開発者が任意のタイミングで Javascript コードを実行可能なため、仮にアクセス先が本物のサイトであったとしても悪意のあるコードが挿入されていた場合、入力された内容を読み取ることは可能だと思います。
また、CDN を使って Javascript がロードされていた場合はそちらを書き換えることで第三者が任意のコードを実行することが可能になる恐れもあります。何が言いたいかというと安全面に考慮するのであれば
ASWebAuthenticationSession
を使うべきである、ということです。
以前のバージョンの Salmonia3+ではデフォルトで
ASWebAuthenticationSession
を使って認証を行うようになっていましたが、この仕組みを使うと認証時に「~がサインインのために nintendo.com を利用しようとしています」「これを行うと、App と Web サイトにあなたに関する情報を共有することを許可します」というメッセージが表示されます。
これは実は当たり前のことで
ASWebAuthenticationSession
はセキュリティ的にガチガチに固められているので何をしているのかをアプリ側は全く知ることができません。
全く何も分からなければログイン後の URL スキーマを Hook することもできないので、これは要するにログイン後に URL スキーマを踏んだときにその処理を実行するために「Safari からアプリにデータが渡されることを許可しますか」という内容になるのですが、これだけ見るとまるでアプリが個人情報をとってきているようで不安になる方が多かったらしく、仕方なくデフォルト設定では無効にしたという経緯があります。
ただ一つ注意点があり、悪意のある開発者が偽のアプリを作って公式のログインページにそっくりなものをつくったとすれば、そこに入力したパスワードと ID は筒抜けになってしまうということです。
これが非公式アプリを使うことに対して最も注意しなければいけない点といえます
で、もしここで
ASWebAuthenticationSession
を使っていれば「~がサインインのために nintendo.com を利用しようとしています」の文面の nintendo.com の部分が別のウェブサイトになるので、この時点で気づくことができるというわけです
スマートフォンのアプリ内ブラウザからはそういう点をしっかりとチェックすることができないので、信頼できないアプリは安易に使うべきではありません。
トークン
ではアプリはどうやってパスワードと ID がわからないのにイカリング 3 からデータを取得しているのでしょうか?
これは、パスワードと ID に代わるトークンというものを利用して「アクセスしている人が本人である」ということをチェックできるからです。トークンは使いまわしで有効期限があるため、簡単に変えることができないパスワードや ID に比べて安全というわけですね。
有効期限があるため、Salmonia3+は定期的にトークンを再発行しています。しばらく経つとなんか取得時間かかるな、というのはこれが原因です。
トークン自体は ID とパスワードの代わりのようなものなので、当然外部に洩れてしまうと不正にアカウントにアクセスできてしまいます。しかしながら、トークンには「権限」というものがあります。
これがどういうことかというと、例えば ID とパスワードがあれば「クレジットカード情報や ID、氏名、住所などのアカウントのすべてのデータにアクセスできる」とすれば「データ取得の権限しかない」トークンを発行すれば、そのトークンが洩れたとしてもそれらの秘匿にすべき個人情報にはアクセスできないということです。
じゃあ気になるのは Salmonia3+で使われているトークンにはどんな権限が設定されているか、ということですよね。
トークンの権限
Salmonia3+が利用しているトークンがもっている権限は以下の五つです。
- openid
- user
- user.birthday
- user.mii
- user.screenName
この権限は公式のニンテンドースイッチオンラインのアプリと全く同じであり、それ以上の権限は持ちません。本当かどうか気になる人はソースコードを読むか、Fiddler などを通してパケットキャプチャしていただければわかります。
で、上の権限を見ても「実際、何が見れるんですか?」ということになりますね。
権限 | 内容 |
---|---|
openid | データ取得 |
user | 性別・国・言語 |
user.birthday | 生年月日 |
user.mii | 不明 |
user.screenName | アカウント名 |
で、見れるのは大雑把に表のような感じです。生年月日が必要になっているのはある年齢以下ではイカリングが利用できないためで、その判定に使われています。
とはいえ Salmonia3+では年齢確認をパスしているので実際には必要ないのですが…
なので、Salmonia3+の開発者がこっそりユーザーのトークンを盗んだとしてもわかるのは性別と生年月日だけで、氏名すらわかりません。当然ですが、クレジットカードの情報もわかりません。
そして、当たり前ですが Salmonia3+はユーザーのトークン情報は任天堂の認証以外に一切利用していません。開発者向けに送ったりもしていないので、ユーザーの方のトークン情報は一切知りません。本当に送っていないかどうかはパケットキャプチャかソースコードを読んでチェックしていただければ、と。
セキュリティ
万が一洩れても大丈夫とはいえ、トークンは外部に洩れるべきではありません。
ではそのトークンはアプリ内のどこに保存されているのかということになります。
名前は伏せますが、とあるアプリでは全く暗号化されずにファイルとしてトークン情報が保存されていたことがありました。iOS のセキュリティは基本的には堅いので大丈夫だとは思いますが、これは結構危ないです。
Salmonia3+では個人情報を含むデータは全てKeychainと呼ばれるセキュアな領域に保存しています。Apple 謹製のセキュリティガチガチな仕組みなので、一般の方は十分に安心して良いセキュリティレベルだと思います。
ログ送信について
Salmonia3+ではログ送信を行うことで、開発者がバグの原因を突き止めやすくなるシステムを採用しています。
で、このログ送信時には全ての認証情報は削除された上で送信されています。ただし、ログには以下の情報が含まれています。
- iOS のバージョン
- アプリのバージョン
- デバイスの UUID
- ランダムな値です
- フレンドコード
- 送られてはきていますが、使っていないので秘匿にしても良いかなとは思います
- nsaid
- Nintendo Service Account Id の略です
- イカリング 2 などから誰でも他人のこの値を確認できるので秘匿にしていません
- npln_user_id
- Splatoon3 用の専用 ID です
- オンラインでマッチングした相手の ID は誰でも調べることができます
- よって、秘匿していません
というわけで、既に利用されている方は基本的には Salmonia3+は安心して使っていただいて大丈夫です。