はじめに
株式会社FFRIセキュリティ セキュリティ・エンジニアの鈴木大輔です。本記事では GPS の spoofing(なりすまし)について解説します。
GPS spoofing は、攻撃者が細工した偽の GPS 電波を正規の GPS 電波よりも強い強度で発信することによって、正規の GPS 電波になりすます攻撃です。GPS spoofing を行うことで、その電波を受信した GPS 受信機に位置を誤認識させたり、GPS 時計の時刻を変更させたりすることが可能になります。近年では安価なデバイスを用いて GPS 電波を発信できるようになっており、実際に自動運転車に対して GPS spoofing を行うことで車両を操作できることが実証されています。
今回行う GPS spoofing ではその性質上電波を発する必要がありますが、電波を発する作業はすべてシールドボックス内で行い、外部に電波が漏れないよう遮断しています。シールドボックス外で電波を発すると電波法に抵触する可能性がありますので、十分注意してください。
GPSについて
Global Positioning System(GPS)はアメリカ合衆国によって運用されている衛星測位システムです。
GPS では準同期軌道上に配置された 30 基ほどの GPS 衛星が発する電波を用いて GPS 受信機の位置を特定します。GPS 衛星が発する電波には、GPS 衛星に搭載された原子時計を用いた正確な時刻や GPS 衛星の軌道要素(衛星軌道を表すためのパラメーター)の情報などが含まれています。GPS 受信機は複数の GPS 衛星から受信した電波をもとに、各衛星の位置と衛星から GPS 受信機までの距離を算出することで位置を特定できます。
このような仕組みのシステムは一般的に Global Navigation Satellite System(GNSS)あるいは全球測位衛星システムと呼ばれています。GPS の他にも EU の Galileo やロシアの GLONASS、中国の北斗などがあります。また、特定の地域のみを対象とした衛星配置を持つ衛星測位システムとして日本の QZSS やインドの NavIC などがあります。
SDRについて
Software-defined radio(SDR)は、ハードウェアに変更を加えずにソフトウェアを変更することによって様々な電波の受信や送信を可能にする技術です。
ハードウェアとしては SDR デバイスと呼ばれる汎用的な機器が使用されます。この SDR デバイスには電波を送受信するアンテナや周波数変換回路、A/D および D/A 変換回路などが搭載されています。例えば SDR を使用して電波を受信する場合、SDR デバイス上のアンテナが受信した電波は周波数変換回路によって処理しやすい中間周波数へと変換され、A/D 変換回路を通してデジタル信号になります。デジタル信号に変換された後はソフトウェアで自由に信号を処理する事が可能となります。
GNU Radioについて
GNU Radio はオープンソースの SDR ツールキットです。
無料で使用でき、様々な SDR デバイスをサポートしていますので、SDR を試してみたい場合にはおすすめです。GUI の開発ツールである gnuradio-companion を使用すれば信号処理を行うブロックを配置・接続してパラメーターを設定するだけで簡単に送受信機を作成できます。また、送受信した信号などをリアルタイムでグラフィカルに表示できるため、本記事中では gnuradio-companion を使用して GPS 信号の波形を確認しています。
GPS spoofing
前述の通り、GPS spoofing は、攻撃者が細工した偽の GPS 電波を正規の GPS 電波よりも強い強度で発信することによって、正規の GPS 電波になりすます攻撃です。GPS spoofing を行うことで、その電波を受信した GPS 受信機に位置を誤認識させる事が可能です。車や船舶、ドローンなどの GPS による位置情報に依存したシステムに対して位置を誤認識させることができれば、攻撃者はそれらを誤った場所へ誘導できる可能性があります。
今回はまずツールを使用して偽の GPS 信号ファイルを生成し、その後作成した GPS 信号を SDR デバイスを通して発信してみます。
GPS 衛星が発する電波には周波数の違いなどによっていくつか種類がありますが、今回は民間用信号の 1 つである L1 信号を対象としています。SDR デバイスは USRP B210 を使用しました。
L1 信号では、前述の時刻や軌道要素などの航法メッセージ(LNAV)と C/A コードと呼ばれる PRN(擬似ランダムノイズ)を xor した信号を使用して、搬送波を Phase Shift Keying(PSK)変調して送信されています。
航法メッセージは 50 bps の速度の 0 or 1 の信号です。そのフォーマットについては長くなるためここでは割愛します。興味のある方は GPS 衛星と受信機間などのインターフェイスを定義している Interface Control Documents(ICD)の IS-GPS-200 を参照してください。
C/A コードは 1.023 Mcps(chips per second)の速度の 0 or 1 の信号です。1023 chips(1 ms)周期で同じパターンを繰り返しています。衛星ごとに異なる C/A コードが定義されており、各衛星の C/A コードは直交する(相関しない)ように決められています。また、同じ C/A コードであってもその位相(タイミング)が 1 chip でもずれている場合は、その相関は低くなります。この C/A コードによって、受信機は同じ周波数帯で送信されている各衛星の信号を識別できます。この技術は CDMA とも呼ばれています。各衛星に割り振られた C/A コードの生成方法は IS-GPS-200 を参照してください。
搬送波は 1575.42 MHz の正弦波です。SDR 機器を使用する場合、ソフトウェア側で受け取るデジタル信号は SDR 機器の周波数変換回路によって中間周波数に変換されているため、直接この周波数の信号を扱うことはありません。
以下に GPS の送信する電波のイメージを示します。
シミュレーション信号の作成
今回は指定したある地点を指すような L1 信号をシミュレートしてみます。ここで作成するシミュレーション信号を SDR デバイスから送信することで、その信号を受信したスマートフォンなどの GPS 機器を指定した地点にいると誤認識させることができます。
シミュレーション信号を生成するツールとして、「gps-sdr-sim」を使用します。ビルド方法についてはリンク先を参照してください。
シミュレーション信号の作成には衛星の軌道情報ファイルが必要になります。GPS 衛星の 1 日分の軌道情報ファイルを NASA が公開していますので、以下の URL からダウンロードして展開します(要登録)。
https://cddis.nasa.gov/archive/gnss/data/daily/<西暦 4 桁>/brdc/brdc<日付 3 桁>0.<西暦下 2 桁>n.Z
<西暦 4 桁>及び<西暦下 2 桁>はそれぞれ「2020」、「20」のように指定してください。
<日付 3 桁>はその年の 1 月 1 日を 1 として目的の日付までの日数を 0 埋め 3 桁で指定します。
2020 年 10 月 22 日であれば以下のようになります。
https://cddis.nasa.gov/archive/gnss/data/daily/2020/brdc/brdc2960.20n.Z
次に以下のコマンドを実行してシミュレーション信号を作成します。
./gps-sdr-sim -e brdc2960.20n -l 35.681726,139.765120,10.0 -s 2500000
「brdc2960.20n」の部分はダウンロードした軌道情報ファイルに応じて変更してください。
「35.681726,139.765120,10.0」は誤認識させたい地点の緯度・経度・高度を指定します。この例では東京駅前の地点を指定しています。
上記のコマンドを実行することで gpssim.bin という名前のファイルが生成されます。
GPS信号の復調
作成したシミュレーション信号ファイルを使用して、GPS 信号の復調(受信方法)についても簡単に紹介します。
まずは作成した信号を gnuradio-companion を使用して確認してみます。
このように GPS の信号はそのままではノイズのようにしか見えません。これは各衛星の信号が C/A コードによって xor されており、更に複数の衛星の信号が合成されているためです。
ここでは説明のために、1 つの衛星の信号だけを抜き出して説明します。gps-sdr-sim のソースコード修正し、1 つの衛星の信号だけを抜き出したものを以下に示します。
上記の信号には航法メッセージと C/A コード、そしてドップラー周波数の正弦波(ドップラー効果によって周波数がずれた搬送波を周波数変換することであらわれる波)が含まれています。C/A コードが xor されたことによる縞のような模様が見えます。
この信号に対して、位相(タイミング)を合わせた C/A コードを再度 xor(正確には C/A コードを 1 or -1 に直した信号を乗算)することで C/A コードを除去し、航法メッセージ(およびドップラー周波数の波)を抜き出すことができます。以下に C/A コードを除去した信号を示します。
本来は他の GPS 衛星の信号も含まれるため、上記の画像のようなきれいな信号にはならず、ノイズ(とノイズのように見える他の衛星の信号)が乗ったものになります。ですが、適切にフィルタリングすることでこの C/A コードに対応した衛星の航法メッセージのみを抜き出すことができます。また、C/A コードの周期もドップラー効果の影響で 1 ms 周期からずれる可能性があるため、実際には C/A コードの位相を同期し続ける操作などが必要ですが、長くなるためここでは割愛します。
シミュレーション信号の送信
次にシミュレーション信号をスマートフォンに受信させ、Google Map 上で現在位置が変わることを確認してみます。
まずはじめに、正常な GPS 信号を受信したスマートフォンの Google Map のスクリーンショットを以下に示します。
次に SDR 機器を PC に接続した上で以下のコマンドを実行することで生成したシミュレーション信号を電波として送信します。
./gps-sdr-sim-uhd.py -t gpssim.bin -s 2500000 -x 0
上記のコマンドは使用する SDR デバイスの種類によって異なりますので、他の SDR デバイスを使用する場合は前述の「gps-sdr-sim」のリンク先を参照してください。 送信されたシミュレーション信号を受信したスマートフォンの Google Map のスクリーンショットを以下に示します。
おわりに
GPS の spoofing について紹介しました。 gps-sdr-sim は、今回紹介したようなある 1 地点にとどまるようなシミュレーション信号だけでなく指定したルートを動くようなシミュレーション信号も作成可能です。 また、このようなシミュレーション信号を作成せずとも Meaconing(実際の GPS 電波を受信・記録し、それを増幅して再送する攻撃)することでも GPS 受信機を誤認識させることが可能です。
エンジニア募集
弊社ではハードウェアを使ったセキュリティの研究なども行っています。興味のある方は採用ページをご参照ください。