coding, photo, plant and demo

*1000円で携帯電話(GSM)を盗聴する方法

tech sdr 20140201 124608
前回までの粗筋: ワンセグチューナーでSDR、色々受信できて面白いかも

ワンセグドングルを使ったGSM解読

ワンセグドングル+RTL-SDRでいろいろ受信できるけど携帯はどうだ?と思ってググったらありますね。

Cracking GSM with RTL-SDR for Thirty Dollars
http://hackaday.com/2013/10/22/cracking-gsm-with-rtl-sdr-for-thirty-dollars

直訳すると「30ドルでRTL-SDRを使ってGSMをクラックする」(既にワンセグドングルは1000円で買えます@aitendo、量販店とかで安売りしてればもっと安い)。2,3年前からそこそこ高価か特殊な機材を使えばハック可能とは分かっていたのですが、色々な技術がオープンソースや安価な機材で揃ってしまい比較的カジュアルにハックできるのがヤバい、という感じ。

GSMは第2世代(2G)の携帯電話の通信方式の一種で世界中で使われています。ただ日本(GSMじゃなかったのは後は韓国くらい)では使われませんでしたし、同世代のmovaやPHSは既にありません。

よって、日本ではこの方法では盗聴できませんし、3G以降では暗号の強度も高いので今のところ盗聴される心配は基本的には無いです。ただ海外に行けばGSMを使うこともあるので全く無関係な話ではないでしょう。

GSM解読の手順

こちらに詳細な解説があります。

The big GSM write-up – how to capture, analyze and crack GSM?
part1 part2 part3 part4

僕も完全に理解できたわけではないですが、手順を簡単に説明すると次のようになると思います。

1. 攻撃対象にサイレントメールを数回送る
2. ダウンリンクの帯域をキャプチャする
3. airprobeで制御チャネルを取り出し、Krakenで暗号を解読して鍵を得る
4. 鍵を使ってキャプチャしたデータをデコードする
5. 制御チャネルを見てどのチャネルに対象のデータがあるかを調べる
6. SMSならwireshark上でそのまま見れる、音声なら状況によるけどデコードして再生する

もう少し詳しく説明します。

1のサイレントメールですが、これは相手に届いたことすら分からないpingのようなSMSメッセージのことらしいです。これを送るにはSilentSMSというapkを使います。要ルートですがjavaだけでこんなことできちゃうんですね。ちなみにcom.android.internal.telephonyにあるImsSMSDispatcherあたりを使っています。
ただこれは相手に受信(page)してくれという制御メッセージを基地局から出すためのものなので、空メールでもスパムでもOKだと思います。サイレントメールだと相手に気づかれないというだけ。

2のキャプチャはRTL-SDLを使います。ワンセグドングル登場です。airprobeのarfcncalcでチャンネル番号から周波数を計算して、その周波数をgsm_receive_rtl.pyや普通にrtl_sdlを使って取り込みます。

3の制御チャネルの取り出しはGSM解読ツールairprobeを使います。暗号はKrakenで解きます。Krakenの本家のページにつながらなかったのですがWin32版は見つかりました。GSMにはA5/1という暗号がかかってます。この暗号はそれなりに強力なのですが、受信時に制御チャネル(Cell Broardcast Channel)では平文が推定できるパターン(受信要求)が繰り返し流れるため、A5/1の状態をうまく圧縮して1.6TBの レインボーテーブル を使うことで、鍵が求まるようです。

この鍵はKcと呼ばれるもので、KiというSIMの中と基地局(正確には基地の先にあるAuC=Autentication Center)に保存されている秘密鍵と基地局で作った乱数RANDから暗号A8から生成されたものです。最終的に通信データはKcと基地局のフレーム番号を鍵としてA5で暗号化されます。

つまりKcさえ求まれば流れるデータは平文になります。こうなればGSM特有のプロトコルとチャンネルが複数あるのが厄介ですが、基本はTCP等に流れるパケットの解析と同じだと思います(wiresharkでパケットが見えます)。

ただ上記の解説ページでは実際にKrakenを使って攻撃対象のKcを求めるのではなく、SIMから自分のKcを求める方法しか実践してないです。というのも実際にエアーからKrakenに入力するためのPaging RequestのSystem Informationのburstを抽出するのは、経験の浅い素人には難しいからのようです。

あと法的にその方法を詳細に書くと危ないから、かもしれません。極端な話、もし簡単に解読できるシステムを作って公開してしまったらキャリアのビジネスを破壊することになりかねないので、いくら学術目的と言い張っても酷い目に合うでしょう。技術的に偉大なことをしても現状の社会のルールやシステムに損害を与える形で公表するのは社会的な悪と判断され何らかの罪に問われても仕方ありません。(と、おっさんになってからワシは思った)

3GやLTEには応用できるか

GMSと比べて3Gは解読するハードルは果てしなく上がるはずです。その理由ですが自分が思いつく限りだと、
  • 暗号が強化されている
    • 結局これが一番重要
  • プロトコルが複雑
    • どこに誰のデータが流れているか解析するのが大変
  • 変調が複雑
    • GSMは単純なTDMA(時分割)ですが、3GだとCDMA(単純に周波数を見ても時間を見てもチャネルが分からない)、LTEだとOFDM等で周波数ごとなのでCDMAよりは分かりやすいかな?
あたりでしょうか。

プロトコルと変調に関しては仕様書がネットで手に入るので根性があれば作れるかもしれませんし(実際GSMを解析している人はそうだし。変復調に関して言えばGNU Radioがあるし)、コーディングが大変なだけで計算量は問題になりませんが、暗号を解くのだけはハードの圧倒的な進化と数学的なハックとかないと厳しいよね…とか思っていたら3GのA5/3暗号を解いたというニュースもあったんですね。かなり条件付きですが、表にこんな情報が出ているということは(しかも2010年に)もうNSAとかはとっくに解読しててもおかしくないな(NSAがBlackberryのメールを盗聴していたというニュースはありました。エアーからでは無いようですが)。

というわけでカジュアルにハックされるのはまだ先だろうけど、裏ではもう実は解読できてました…ということもあるかもしれません。

参考文献

Decrypting GSM phone calls
https://srlabs.de/decrypting_gsm

上記のGSMスニファーの第一人者にして、無線関係のセキュリティー研究者Karsten Nohhl氏の講演。彼はRTL-SDRではなく携帯のファームを書き換えることで復調データを得て(OsmocomBBを使う)、簡単に大掛かりな機材無しにGSMがハックできることを世界で初めて示しました。

http://www.youtube.com/watch?v=0hjn-BP8nro


GSM System Architecture
http://www.csie.nuk.edu.tw/~lhyen/wn/gsm.pdf

GSMのもう少し詳しい解説
https://skydrive.live.com/view.aspx?resid=8F7DEEEC761F130B!603&app=WordPdf&wdo=2&authkey=!AN3UlLqs7FxmZmQ

GSMの解説。シーケンス図有り。
http://www.willassen.no/msl/node4.html

携帯と基地局が接続される様子
http://en.wikipedia.org/wiki/GSM_procedures

GSMの送信電波に関する仕様書
http://www.etsi.org/deliver/etsi_ts/145000_145099/145005/10.00.00_60/ts_145005v100000p.pdf

W-CDMAの仕様書
http://www.etsi.org/deliver/etsi_ts/125100_125199/125101/11.08.00_60/ts_125101v110800p.pdf

RTL-SDRのGSM関係の記事
http://www.rtl-sdr.com/tag/gsm

SAE/LTE を実現するセキュリティ技術 - NTTドコモ
https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol17_3/vol17_3_027jp.pdf

ASCII.jp:携帯電話は盗聴される可能性がある? (1/3)|Q&Aで理解する情報セキュリティ
http://ascii.jp/elem/000/000/492/492067