キーワードロガーとして機能するオメガ社のキーボードSDKとその採用アプリ

アドテク企業・オメガ株式会社のカスタムキーボード/キーボードSDKを採用するアプリ(ANYTYPE、moppyキーボード、USAVICHキーボード、瞬間日記、PUSH!、PicoSweet)の通信内容をパケットキャプチャにより解析・考察する。

結論としては、予め指定された特定のキーワードを入力した事実がオメガ社のサーバに随時送信されていた。キーロガーならぬキーワードロガーとでも呼ぶべきものだろう。これにより、オメガ社はユーザーの使用アプリ名称と入力内容の一部または全部(個人情報、機密情報、機微情報を含む)を知得できる状態にあった。

経緯

発端は高木浩光氏へのタレコミである。

所構わず営業を仕掛けるだけならば行儀の悪い企業によくある話だが、このときAmazon S3で公開されていたオメガ社のオメガキーボード説明資料が注目を集める。

この資料によれば、オメガ社が開発するキーボードSDKを自社アプリに組み込めば、ユーザーの入力内容や使用アプリ情報を収集できるという。こうした機能は一般に「キーロガー」と呼ばれ、ユーザーの同意なく実行されればスパイウェアであることから、スマートフォン利用者らに不安が広がった。

同様の懸念は過去に百度の「Baidu IME」「Simeji」で現実のものとなっており、キーボードアプリへの信頼を揺るがす一大事に発展している。

早速有志によってオメガ社のプレスリリースから提携先の特定が進められ、そのうちの一つ「moppyキーボード」で文字コードらしきもの(詳細は後述)が送信されていることが確認される。

だが、文字コードにしてはいささか奇妙である。実際にmitmproxyでオメガキーボードの通信内容をパケットキャプチャした結果、幾つかの事実が判明した。

送信されているのは「キーワード」

オメガキーボード採用アプリは起動時に約9万行のキーワードリストをオメガ社のサーバ(https://a.omega-adnetwork.com/api/keyword_list)からJSON形式で取得しており、これには広告入札キーワードと思われる文字列とそれに対応するキーワードIDが列挙されていた。

通信内容と照合した結果、アプリから送信されていたのは文字コードではなくこのキーワードIDであることが判明した。キーワードIDが分かるということは、キーワードを逆引きすることもできるので、キーワードを送信していることと同義である。

文字入力確定の度に、形態素解析か何かで文字列をキーワード単位に分解。キーワードリストと照合して、合致するものがあれば、そのキーワードIDのリストをオメガ社のサーバに送信。合致するものがなければ、何も送信せず、汎用広告を取得、キーボード上部に表示するというロジックのようだ。

本来はキーワードIDの送信後にターゲティング広告を取得・表示して然るべきなのだろうが、実験中、そのような挙動は観測できなかった。何らかの条件があるのか、広告出稿が皆無なのか、不具合なのかは不明である。

キーワード送信はセキュリティを侵害する

ここでキーワード送信の是非について考えよう。

アプリ提供者がどこまでキーワード送信の事実を把握していたのかは定かではない。先に槍玉に挙がったmoppyキーボードは「特定の入力情報」の送信について明確に同意を求めているだけマシな方で、他のオメガキーボード採用アプリは何ら同意を取得していなかった。

また、すべてのアプリにおいて個人情報等は取得していないことを謳っていた。オメガキーボード説明資料にも個人情報は取得しない旨が記載されており、オメガ社もその認識でいたのだろう。今や不必要な個人情報を保持することは事業者にとってリスクでしかない。

ところで、ユーザーの入力から個人情報、機密情報、機微情報を取り除いて興味関心キーワードだけを取得することが出来るだろうか? 否、否である。

前述の百度も同様のことを謳っていたようだが、その実態は「アプリによる変換を伴わずに直接入力されたクレジットカード番号や電話番号などの半角数字、半角英数字パスワードは送信されない」というものであった。

オメガキーボードの場合、現在のキーワードリストに1~5, 8, 9の数字がキーワード登録されているため、ユーザーの入力した郵便番号、番地、部屋番号、電話番号、クレジットカード番号、セキュリティコード、暗証番号、PINコードなどのうち、6, 7, 0を除いた数字を入力した事実がオメガ社に送信されている。同時に入力対象のアプリ名称も分かるため、郵便局や銀行のアプリ上でそれらを入力したことまで判別できる。十分セキュリティ侵害に繋がるインシデントである。

これはキーワードリストから数字をすべて除外すれば解決する話ではない。皇居の所在地を例に挙げると「東京都」「千代田区」「千代田」「一番」はそれぞれキーワード登録されているため、結局は住所が送信されてしまうことになる。同意に基づくオプトイン方式にすればセキュリティインシデントとまでは言えないかもしれないが、それでアプリストアのガイドラインに適合するかは別の話である。

許可を与えなければ情報は送信されない

オメガ社のキーボードSDKとその採用アプリのiOS版は、しれっとユーザーにフルアクセスを許可するよう求めてくる。実際のところ、フルアクセスを必要とするのはユーザーの入力情報の収集と利用アプリIDの取得のためであり、実はフルアクセス許可を与えなくともキーボードの許可だけ与えればキーボードとしては問題なく機能する。その場合、一連の情報は送信されず、広告表示も行われない。

送信形式がアプリによって異なる

アプリ提供者によって同意の取り方に差があるのは勿論のこと、iOS版とAndroid版のアプリで挙動が異なる上、APIの使い方が様々で、網羅的な検証に時間を要した。検証自体は22日中に行ったが、まとめる時間がないため、ひとまず記事を公開し、検証データは順次追記する。

ANYTYPE(iOS版)

ANYTYPEはオメガ株式会社謹製のキーボードアプリである。他社提供のアプリと挙動に違いがあり、具体的には利用する広告配信APIのバージョンがv2で、キーワードに関連の深いターゲット広告が表示されるが、一方で複数キーワードに対応していない。

AppStore説明文と利用規約の矛盾については、はてな匿名ダイアリーで指摘されている通りである。

iOS端末の標準SMSアプリで「1」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?token=ffffffffffffffffffffffffffffffff&keywords=124383&platform=1&ua=Mozilla/5.0%20(iPhone;%20CPU%20iPhone%20OS%2012_3_1%20like%20Mac%20OS%20X)%20AppleWebKit/605.1.15%20(KHTML,%20like%20Gecko)%20Mobile/15E148&locale=ja_JP&version=2.3.2&app=com.apple.MobileSMS&symbol=ANYTYPE&os_ver=12.3.1&uid=550E8400-E29B-41D4-A716-446655440000

GETリクエストのkeywordsパラメータに「1」を示すキーワードID:124383が含まれている。

iOS端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?token=ffffffffffffffffffffffffffffffff&keywords=&platform=1&ua=Mozilla/5.0%20(iPhone;%20CPU%20iPhone%20OS%2012_3_1%20like%20Mac%20OS%20X)%20AppleWebKit/605.1.15%20(KHTML,%20like%20Gecko)%20Mobile/15E148&locale=ja_JP&version=2.3.2&app=com.apple.MobileSMS&symbol=ANYTYPE&os_ver=12.3.1&uid=550E8400-E29B-41D4-A716-446655440000

GETリクエストのkeywordsパラメータは空欄になっている。複数キーワードに非対応のためと推測される。

ANYTYPE(Android版)

Android端末の標準SMSアプリで「1」と入力した際の送信内容は次の通り。

POST https://a.omega-adnetwork.com/api/v2/ads
{
 "l": "ja",
 "u": "550e8400-e29b-41d4-a716-446655440000",
 "v": "2.0.27",
 "a": "com.android.mms",
 "ks": [124383],
 "s": "ANYTYPE_Android",
 "t": "ffffffffffffffffffffffffffffffff",
 "p": 2,
 "ua": "Mozilla/5.0 (Linux; Android 8.0.0; Android SDK built for x86 Build/OSR1.170720.005; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.125 Mobile Safari/537.36",
 "ov": "8.0.0",
 "input_type": "unspecified",
 "lc": "ja_JP"
}

POSTリクエストのJSON中のksパラメータに「1」を示すキーワードID:124383が含まれている。

Android端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

POST https://a.omega-adnetwork.com/api/v2/ads
{
 "l": "ja",
 "u": "550e8400-e29b-41d4-a716-446655440000",
 "v": "2.0.27",
 "a": "com.android.mms",
 "ks": [],
 "s": "ANYTYPE_Android",
 "t": "ffffffffffffffffffffffffffffffff",
 "p": 2,
 "ua": "Mozilla/5.0 (Linux; Android 8.0.0; Android SDK built for x86 Build/OSR1.170720.005; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.125 Mobile Safari/537.36",
 "ov": "8.0.0",
 "input_type": "unspecified",
 "lc": "ja_JP"
}

POSTリクエストのJSON中のksパラメータは空配列になっている。複数キーワードに非対応のためと推測される。

moppyキーボード(iOS版)

ポイントサイトmoppyを運営する株式会社セレスのキーボードアプリ、のはず……販売元の"tetsu ikeuchi"って誰だ。

iOS端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

POST https://a.omega-adnetwork.com/api/ad
{
   "app": "com.apple.MobileSMS",
   "keywords": [124383,124384,124385,124388],
   "platform": 1,
   "symbol": "moppy_ios",
   "uid": "550E8400-E29B-41D4-A716-446655440000"
}

POSTリクエストのkeywordsパラメータに「1」「2」「3」「4」を示すキーワードIDが含まれている。

moppyキーボード(Android版)

Android端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

POST https://a.omega-adnetwork.com/api/v2/ads
{
 "l": "ja",
 "u": "550e8400-e29b-41d4-a716-446655440000",
 "v": "1.3.7",
 "a": "com.android.mms",
 "ks": [124383,124384,124385,124388],
 "s": "moppy_android",
 "t": "ffffffffffffffffffffffffffffffff",
 "p": 2,
 "ua": "Mozilla/5.0 (Linux; Android 8.0.0; Android SDK built for x86 Build/OSR1.170720.005; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.125 Mobile Safari/537.36",
 "ov": "8.0.0",
 "input_type": "next",
 "lc": "ja_JP"
}

POSTリクエストのksパラメータに「1」「2」「3」「4」を示すキーワードIDが含まれている。

USAVICHキーボード(iOS版)

Nobollel株式会社のキャラクターコンテンツアプリ。

iOS端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

POST https://a.omega-adnetwork.com/api/ad
{
   "app": "com.apple.MobileSMS",
   "keywords": [124383,124384,124385,124388],
   "platform": 1,
   "symbol": "Usavich_iOS",
   "uid": "550E8400-E29B-41D4-A716-446655440000"
}

POSTリクエストのkeywordsパラメータに「1」「2」「3」「4」を示すキーワードIDが含まれている。

USAVICHキーボード(Android版)

Android端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=1.0.0&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=Usavich_Android&keywords=124383

GETリクエストのkeywordsパラメータに「1」を示すキーワードIDのみが含まれている。複数キーワードに非対応のためと推測される。

瞬間日記(Android版)

ウタゴエ株式会社の日記帳アプリ。

Android端末の標準SMSアプリで「1」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=7.0.6&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=MomentDiary_Android&keywords=124383

GETリクエストのkeywordsパラメータに「1」を示すキーワードID:124383が含まれている。

Android端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=7.0.6&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=MomentDiary_Android&keywords=

GETリクエストのkeywordsパラメータが空となっている。複数キーワードに非対応のためと推測される。

利用規約が存在せず、「特定の入力情報」の送信についての説明すら行われていなかった。

6月24日のVer.7.1.0で問題のキーボード機能が削除されている。

- Ver7.1.0(released 2019/6/24) -
・キーボードに関するライブラリに問題がありましたため、キーボード機能を削除しました。

なお、瞬間日記(iOS版)にはキーボード機能は搭載されていない。

PUSH!(Android版)

ジグノシステムジャパン株式会社のスタンプ獲得アプリ。

Android端末の標準SMSアプリで「1」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=3.5&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=PUSH_Android&keywords=124383

GETリクエストのkeywordsパラメータに「1」を示すキーワードID:124383が含まれている。

Android端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=3.5&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=PUSH_Android&keywords=

GETリクエストのkeywordsパラメータが空となっている。複数キーワードに非対応のためと推測される。

利用規約が存在せず、「特定の入力情報」の送信についての説明すら行われていなかった。

なお、PUSH!(iOS版)にはキーボード機能は搭載されていない。

PicoSweet(Android版)

株式会社アンジーの写真加工アプリ。

Android端末の標準SMSアプリで「1」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=3.150.459&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=PicoSweet_Android&keywords=124383

GETリクエストのkeywordsパラメータに「1」を示すキーワードID:124383が含まれている。

Android端末の標準SMSアプリで「1234」と入力した際の送信内容は次の通り。

GET https://a.omega-adnetwork.com/api/v2/ads?platform=2&os_ver=8.0.0&token=ffffffffffffffffffffffffffffffff&ua=Mozilla%2F5.0+%28Linux%3B+Android+8.0.0%3B+Android+SDK+built+for+x86+Build%2FOSR1.170720.005%3B+wv%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Chrome%2F58.0.3029.125+Mobile+Safari%2F537.36&locale=ja_JP&lang=ja&version=3.150.459&uid=550e8400-e29b-41d4-a716-446655440000&app=com.android.mms&symbol=PicoSweet_Android&keywords=

GETリクエストのkeywordsパラメータが空となっている。複数キーワードに非対応のためと推測される。

利用規約が存在せず、「特定の入力情報」の送信についての説明すら行われていなかった。

なお、PicoSweet(iOS版)にはキーボード機能は搭載されていない。

まとめ

もはや、キーボードアプリを信用することはできない。我々は専門家によるパケットキャプチャなしにキーボードアプリを使用することはできないだろう。