【実務・中級編】 IMSIからSUPI/SUCIへの移行とプライバシー保護(空中線暗号化) – 家庭用ネットワーク・IoT・モバイル通信実践ガイド

4Gの「丸裸」な時代は終わった:5Gで実現するSUPI/SUCIによるプライバシー革命

エンジニアの皆さん、こんにちは。現場でパケットを追いかけていると、ふと「この通信、本当に安全なのか?」と背筋が寒くなる瞬間はありませんか?

特にモバイル通信の世界では、長らく4G(LTE)以前の仕様が抱えていた「プライバシーの脆弱性」がエンジニア界隈の頭痛の種でした。今日は、5Gで導入された「SUPI/SUCI」という仕組みが、いかにして私たちのデジタルな身分証を守っているのか、その泥臭い仕組みを深掘りしていきましょう。

—

なぜ4GのIMSIは「危険」だったのか?

4G以前、端末がネットワークに接続する際、加入者を特定するためのIDとして IMSI(International Mobile Subscriber Identity)が使われていました。問題は、この IMSI がネットワーク側からの要求に対して「平文(プレインテキスト)」で返されることがあった点です。

悪意のある攻撃者が「IMSIキャッチャー」と呼ばれる偽の基地局を設置すれば、通信エリア内の端末から IMSI を吸い上げ、位置追跡やプロファイリングが容易にできてしまいました。これは、Web APIで言えば「認証トークンなしで個人情報を全開示するエンドポイントを公開している」ようなものです。

—

5Gが導入した「SUCI」という防波堤

5G(3GPP TS 33.501)では、この問題を解決するために加入者識別子を二つに分けました。

1. SUPI (Subscription Permanent Identifier): いわゆる「真のID」。ネットワーク内部でのみ扱われ、決して空中に平文で流れることはありません。
2. SUCI (Subscription Concealed Identifier): 空中に流れる「暗号化されたID」。ホームネットワーク側が持つ公開鍵で暗号化されています。

通信フローの簡略図

端末(UE)がネットワークに接続する際の流れは以下のようになります。

1. UE がホームネットワークの公開鍵を使って SUPI を暗号化し、SUCI を生成する。
2. UE は基地局を経由して、この SUCI を認証サーバー(AUSF/UDM)へ送る。
3. UDM が持つ秘密鍵で SUCI を復号し、元の SUPI を取り出す。

これによって、途中の基地局やパケットを傍受する攻撃者には「ランダムなバイト列」しか見えないため、誰が接続しようとしているのか特定できなくなりました。

—

実務視点:SUCI生成のロジックを読み解く

もし皆さんがプライベート5G環境や、シミュレーター環境でこの仕組みを扱う場合、SUCI の生成には「ECIES(Elliptic Curve Integrated Encryption Scheme)」という方式が使われていることを理解しておく必要があります。

Pythonで概念的なシミュレーションを行うなら、以下のようなイメージです。

# 概念的なSUCI生成プロセスのイメージ
# 実際には3GPPが規定する特定の楕円曲線とパディング規則に従います
from cryptography.hazmat.primitives.asymmetric import ec

def generate_suci(supi, public_key):
    # 1. 乱数を生成(毎回異なるSUCIを作るためのソルト)
    ephemeral_key = ec.generate_private_key(ec.SECP256R1())
    
    # 2. 秘密鍵と公開鍵で共有シークレットを生成
    # 3. 共有シークレットを用いてSUPIをAES等で暗号化
    suci = encrypt_data(supi, ephemeral_key)
    
    # 4. 最終的にBase64エンコードして送信
    return suci

# ポイント: 毎回ephemeral_keyが変わるため、
# 同じ端末でも接続ごとにSUCIの値が変わる(追跡不能性の担保)

—

デバッグと運用における注意点

インフラエンジニアとして現場に立つ際、SUCI がうまく認証されないケースに遭遇することがあります。その多くは、以下のいずれかが原因です。

  • 公開鍵の不一致: 端末(USIM/USIMアプリ)に書き込まれている公開鍵IDと、ネットワーク側(UDM)のプロビジョニングデータが食い違っている。
  • パケットキャプチャの落とし穴: Wireshark等で NAS (Non-Access Stratum) メッセージを解析する際、暗号化されているため中身が見えません。UDM 側のログで復号エラーが出ていないか確認するのが鉄則です。

また、Web APIの開発と同様、鍵管理(Key Management) が全てです。curl でモックサーバーへリクエストを送るような単純な世界ではありませんが、設定ファイルを扱う際は以下の点に注意してください。

# 5Gコアネットワーク設定例(イメージ)
security_policy:
  suci_protection: true
  # 端末が送信するSUCIの暗号化方式を強制
  encryption_algorithm: "ECIES-X25519"
  # 公開鍵の有効期限設定(定期的なローテーションが必須)
  key_rotation_interval_days: 90

—

まとめ:ネットワークは「見えない」のがデフォルト

5Gの SUCI 導入は、モバイル通信における「プライバシー・バイ・デザイン」の究極形です。これまで「空中に流れる情報は盗聴されるのが前提」だった世界が、「暗号化して初めて通信が成立する」世界へとシフトしました。

もし皆さんが今後、5Gコアネットワークに関わるプロダクトや、セキュアなIoTエッジデバイスの設計に携わるなら、この「SUCIの生成フロー」を技術仕様書の片隅に置くことを強くお勧めします。

パケットは嘘をつきません。正しく設計された暗号化は、どんな熟練したハッカーの追跡も拒絶します。皆さんのネットワークが、今日も安全にパケットを運んでいることを願っています。

それでは、また次回の深い技術談義でお会いしましょう。

コメント

タイトルとURLをコピーしました