メッセージングアプリLINE(Android版)が行う通信をパケットキャプチャにより適当に調べてみる。
環境
Androidバージョン: 4.1.2 LINEバージョン: 4.4.1
手順
tPacketCaptureというアプリケーションを利用すると、root権限なしでパケットキャプチャができる。 今回はこのアプリケーションを使いパケットキャプチャを行った。 通信内容としては、適当な公式アカウントを追加した後、数回メッセージ送信および自動返信メッセージの受信を行った。
結果
確認できた通信先は以下の通り。
1 | 119.235.235.xxx | LINE (LINE Corporation) | obs-jp.line-apps.com (HTTP/HTTPS) | メッセージ送受信 2 | 120.29.145.xxx | AKAMAI-4 (Akamai International BV) | dl.stickershop.line.naver.jp (HTTP) | スタンプに関するメタデータ? 3 | 203.104.131.xxx | NHN-JAPAN (NHN Japan Corporation) | (TCP/10006) | エラーログの送信
主にメッセージのやり取りは1のIPと行われているようだった。 HTTPで行われるのは公式アカウントのプレビュー画像の送受信のみで、実際のメッセージの送受信はHTTPSにて行われていた。 そこでのClientHelloおよびServerHelloパケットの内容を抜き出すと、次のようになる。
Secure Sockets Layer
SSL Record Layer: Handshake Protocol: Client Hello
Version: TLS 1.0 (0x0301)
Handshake Protocol: Client Hello
Version: TLS 1.0 (0x0301)
Cipher Suites (35 suites)
Cipher Suite: TLS_RSA_WITH_RC4_128_MD5 (0x0004)
Cipher Suite: TLS_RSA_WITH_RC4_128_SHA (0x0005)
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
Cipher Suite: TLS_ECDH_ECDSA_WITH_RC4_128_SHA (0xc002)
Cipher Suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA (0xc004)
Cipher Suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA (0xc005)
Cipher Suite: TLS_ECDH_RSA_WITH_RC4_128_SHA (0xc00c)
Cipher Suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA (0xc00e)
Cipher Suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA (0xc00f)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_RC4_128_SHA (0xc007)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
Cipher Suite: TLS_ECDHE_RSA_WITH_RC4_128_SHA (0xc011)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)
Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)
Cipher Suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA (0x0032)
Cipher Suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA (0x0038)
Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
Cipher Suite: TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA (0xc003)
Cipher Suite: TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA (0xc00d)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA (0xc008)
Cipher Suite: TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (0xc012)
Cipher Suite: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (0x0016)
Cipher Suite: TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA (0x0013)
Cipher Suite: TLS_RSA_WITH_DES_CBC_SHA (0x0009)
Cipher Suite: TLS_DHE_RSA_WITH_DES_CBC_SHA (0x0015)
Cipher Suite: TLS_DHE_DSS_WITH_DES_CBC_SHA (0x0012)
Cipher Suite: TLS_RSA_EXPORT_WITH_RC4_40_MD5 (0x0003)
Cipher Suite: TLS_RSA_EXPORT_WITH_DES40_CBC_SHA (0x0008)
Cipher Suite: TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA (0x0014)
Cipher Suite: TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA (0x0011)
Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
Secure Sockets Layer
TLSv1 Record Layer: Handshake Protocol: Multiple Handshake Messages
Handshake Protocol: Server Hello
Version: TLS 1.0 (0x0301)
Cipher Suite: TLS_RSA_WITH_RC4_128_MD5 (0x0004)
Handshake Protocol: Certificate
Certificates (3207 bytes)
Certificate (id-at-commonName=*.line-apps.com,id-at-organizationalUnitName=System Operation Team,id-at-organizationName=LINE Corporation,id-at-localityName=Shibuya-ku,id-at-stateOrProvinceName=Tokyo,id-at-countryName=JP,id-at-serialNumber=
subjectPublicKeyInfo
algorithm (rsaEncryption)
Algorithm Id: 1.2.840.113549.1.1.1 (rsaEncryption)
Padding: 0
subjectPublicKey: 3082010a0282010100ca66804c12c4ea44db1b9883a91dc2...
extensions: 9 items
Extension (id-ce-subjectAltName)
Extension Id: 2.5.29.17 (id-ce-subjectAltName)
GeneralNames: 2 items
GeneralName: dNSName (2)
dNSName: *.line-apps.com
GeneralName: dNSName (2)
dNSName: line-apps.com
Certificate (id-at-commonName=GeoTrust SSL CA,id-at-organizationName=GeoTrust, Inc.,id-at-countryName=US)
Certificate (id-at-commonName=GeoTrust Global CA,id-at-organizationName=GeoTrust Inc.,id-at-countryName=US)
ClientHelloのCipher SuitesにおいてTLS_RSA_WITH_RC4_128_MD5 (0x0004)が優先されていることから、ServerHelloでもTLS_RSA_WITH_RC4_128_MD5 (0x0004)が選択されている。
Android 4.3以下においてHttpURLConnectionクラスを使って通信を行うとこのようになることが知られているため、LINE Appもこれに類するAPIを使っているものと思われる。
また、subjectPublicKeyInfoを調べたところ、RSAの鍵長は2048bitであった。
2のIPとの通信では、何かしらのメタデータと思われるJSONデータがHTTPにより受信されていた。 HTTPのHostヘッダの記述から、スタンプに関するものと推測される。
3のIPとの通信では、アプリ起動中に発生したと思われる例外エラーの内容が平文にて送信されていた。 この中には端末のIPアドレス、通信種別(Wifi、LTE、3G)、SIMキャリア情報、言語設定の内容、Androidバージョン、機種情報が含まれる。
まとめ
Android APIの仕様によりイマイチなCipherSuiteが選ばれていたり、エラーログが平文で送信されていたりするものの、とりあえずメッセージの送受信についてはTLSで暗号化されているようである。 iOSやWindowsなど他のOSのアプリであれば、より暗号強度の高いCipherSuiteが選ばれるのかもしれない。