なりすまし = 他人 (人・端末・サービス) を装って通信や認証を行う攻撃。フィッシング、IP / MAC / DNS spoofing、SIM スワップ、ディープフェイクなど形態は多様。
用語集 → セキュリティ → なりすまし (Impersonation / Spoofing)。認証・アクセス管理・電子署名 と表裏一体です。
統計・データ解析コンペでは、SSDSE-B-2026 の都道府県分布を「正規ユーザの所在地分布」とみなし、ログイン履歴に都道府県外れ値が出現したらアラートを出すという 異常検知のおもちゃモデル を作ります。実運用では Web アプリの監査ログを SSDSE で正規化した期待分布と突き合わせるだけで、初期スクリーニングとして十分有効です。
電子署名は「本人だけが鍵を持つ」前提でなりすましを防ぎますが、その鍵自体が盗まれると元も子もありません。なりすましは「鍵やパスワードや属性そのものを盗む」攻撃側面なので、署名と表裏一体で学ぶ必要があります。
「他人の顔・声・身分証で本人になりすます」のデジタル版です。窓口で他人の保険証を出して診察を受けるのと同じことを、ネット上ではパスワード・Cookie・トークン・SIM カード・MAC アドレスなどを使って行います。
なりすましの種類:
| レイヤー | 攻撃名 | 説明 |
|---|---|---|
| 物理 | MAC spoofing | NIC のアドレスを偽る |
| ネットワーク | IP / ARP / DNS spoofing | 発信元 IP・名前解決を偽装 |
| アプリ | フィッシング / 偽サイト | UI ごと別サービスを装う |
| メール | メールスプーフィング / BEC | From を改ざんし上司を装う |
| 音声/映像 | ディープフェイク | AI で本人そっくりの音声・映像を生成 |
| SIM | SIM スワップ | 電話番号を他人の SIM に移管 |
| Cookie / トークン | セッションハイジャック | 奪った認証情報で本人を演じる |
なりすましの 3 ステップ: ① 真の利用者を特定する偵察、② 認証情報を奪う or 偽装する、③ 取得した属性でシステムに侵入し操作する。本ページでは ③ の段階でログから検出する側に立ちます。
定義 (なりすまし攻撃): 認証システム $\mathcal{A}$ に対し、攻撃者 $E$ が真の利用者 $U$ の認証情報 $c_U$ を持たないにも関わらず、$\mathcal{A}$ から $U$ として認められる確率。
$$ \mathrm{Pr}_{\mathrm{impersonate}} = \Pr\bigl[ \mathcal{A}(E) \to \mathrm{accept~as~} U \mid E \neq U \bigr] $$
多要素認証によるリスク低減:
$$ \Pr_{\mathrm{MFA}} = \prod_{i=1}^{K} \Pr_i $$
各要素が独立に突破される確率 $\Pr_i$ の積。$K=2$ で「パスワード+ TOTP」、$K=3$ で「+ FIDO2」。要素が独立であることが鍵。
ベイズ的な異常スコア (リスクベース認証):
$$ \mathrm{score}(x) = \log \frac{p(x \mid \mathrm{legit})}{p(x \mid \mathrm{attack})} $$
$x$ は IP / 端末指紋 / 時刻 / 都道府県などの特徴量。スコアが閾値を下回ると追加認証を要求。
FAR / FRR (生体認証):
$$ \mathrm{FAR} = \Pr[\mathrm{accept} \mid \text{他人}], \quad \mathrm{FRR} = \Pr[\mathrm{reject} \mid \text{本人}], \quad \mathrm{EER}: \mathrm{FAR} = \mathrm{FRR} $$
なりすましの成功率はそのまま FAR。EER (等エラー率) が指標として使われる。
カイ二乗適合度検定 (都道府県分布の異常検知):
$$ \chi^{2} = \sum_{i=1}^{47} \frac{(O_{i} - E_{i})^{2}}{E_{i}} $$
$O_i$ は都道府県 $i$ からの観測ログイン数、$E_i$ は SSDSE 人口比から期待される件数。$\chi^2$ が大きく $p$ 値が小さければ、分布逸脱 (= なりすましの可能性) を示唆。
| 記号 | 読み方 | 意味・例 |
|---|---|---|
| $U, E$ | user / enemy | 真の利用者と攻撃者 |
| $c_U$ | credential | パスワード / 鍵 / 指紋など |
| $\mathcal{A}$ | authenticator | 認証システム本体 |
| $x$ | feature | IP・端末・時刻・都道府県など |
| $\Pr_i$ | factor breach prob. | 第 $i$ 要素の突破確率 |
| FAR / FRR | false accept/reject rate | 他人受入率/本人拒否率 |
| $O_i, E_i$ | observed / expected | 観測値と期待値 (都道府県別ログイン数) |
「あるサービスの正規ユーザは概ね SSDSE-B-2026 の人口分布に従って各都道府県から来る」と仮定し、それを逸脱するログインをなりすまし候補として扱います。
| 都道府県 | 人口 (千人) | 期待アクセス比率 | 実測 (24h) | 判定 |
|---|---|---|---|---|
| 東京 | 13,920 | 11.1% | 10.8% | 正常 |
| 大阪 | 8,809 | 7.0% | 7.2% | 正常 |
| 愛知 | 7,542 | 6.0% | 5.9% | 正常 |
| 鳥取 | 553 | 0.44% | 8.5% | ★異常 |
| 島根 | 671 | 0.54% | 6.1% | ★異常 |
→ 「人口比 0.44%」の鳥取から「全体の 8.5%」のログインがあるのは異常。VPN や踏み台経由のなりすまし攻撃の可能性が高い、と判断できます。
MFA リスク低減の実値:
| 認証要素 | 単独突破確率 | 累積 |
|---|---|---|
| パスワードのみ | 10⁻¹ | 10⁻¹ |
| + TOTP | 10⁻² | 10⁻³ |
| + FIDO2 | 10⁻⁴ | 10⁻⁷ |
① 期待分布を SSDSE から作る
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
pop = df.groupby('Prefecture')['Total_population'].mean()
expected = pop / pop.sum() # 都道府県別の期待比率
print(expected.sort_values(ascending=False).head(10))
② カイ二乗適合度検定で全体の乖離を見る
from scipy import stats
observed = pd.Series({'東京都': 1080, '大阪府': 720, '愛知県': 590, '神奈川県': 880,
'鳥取県': 850, '島根県': 610}, name='count')
N = observed.sum()
exp = expected.reindex(observed.index).fillna(1e-4) * N
chi2, p = stats.chisquare(observed, exp)
print(f'カイ二乗 = {chi2:.1f}, p = {p:.2e}')
# p が極小 → 都道府県分布が SSDSE 想定と乖離 → 攻撃の疑い
③ ユーザ単位の異常スコア (都道府県+時刻+ジャンプ)
import math
def login_risk(pref, hour, prev_pref):
base = -math.log(expected.get(pref, 1e-4))
night = 1.5 if hour < 5 or hour > 23 else 0
geo_jump = 3.0 if prev_pref and prev_pref != pref else 0
return base + night + geo_jump
# 普段は東京、 深夜 3 時に島根からログイン
print('リスク:', login_risk('島根県', 3, '東京都'))
④ IsolationForest でログ全体を学習
from sklearn.ensemble import IsolationForest
prof = df.groupby('Prefecture').agg(
pop=('Total_population','mean'),
inc=('Income_per_capita','mean'),
age=('Aging_rate','mean')).dropna()
clf = IsolationForest(contamination=0.05, random_state=0).fit(prof)
prof['anomaly'] = clf.predict(prof)
print(prof[prof['anomaly'] == -1]) # 通常分布から外れる「目立つ」県
⑤ MFA 効果のシミュレーション
p_password = 0.10
p_totp = 0.01
p_fido2 = 1e-4
print(f'パスワードのみ: {p_password:.4f}')
print(f'+ TOTP : {p_password * p_totp:.6f}')
print(f'+ FIDO2 : {p_password * p_totp * p_fido2:.10f}')
⑥ メール From のスプーフィング検査 (DMARC 簡易ロジック)
def header_check(msg_from, envelope_from, dkim_d, spf_pass):
from_domain = msg_from.split('@')[-1].lower()
return (from_domain == envelope_from.split('@')[-1].lower()
and from_domain == dkim_d.lower()
and spf_pass)
print(header_check('ceo@example.co.jp', 'attacker@badnet.ru',
'badnet.ru', spf_pass=True)) # False → なりすまし
なりすまし (Impersonation) ★
├─ 対象別
│ ├─ 人 → フィッシング・BEC・ディープフェイク
│ ├─ 端末 → MAC / ARP / DHCP spoofing
│ ├─ ネット → IP / DNS spoofing
│ └─ サービス → 偽サイト・偽証明書
├─ 突破される認証要素
│ ├─ 知識 (パスワード) → 漏洩・推測
│ ├─ 所持 (端末・SIM) → 盗難・SIM スワップ
│ └─ 生体 (顔・指紋) → 写真・ゲルキャスト
└─ 対策
├─ MFA / FIDO2 / WebAuthn
├─ 電子署名 / TLS / mTLS
├─ DMARC / SPF / DKIM
└─ リスクベース認証 / 異常検知
| 年 | 事例 | 手口 | 教訓 |
|---|---|---|---|
| 2016 | バングラデシュ中央銀行不正送金 | SWIFT 端末乗っ取り、メッセージなりすまし | $81M。承認フローの多重化が必要 |
| 2019 | ディープフェイク CEO 詐欺 (英) | AI 音声で社長になりすまし送金指示 | $243K。電話だけの承認は危険 |
| 2020 | Twitter 大規模アカウント乗っ取り | ソーシャルエンジニアリングで管理ツール侵入 | 内部ツールへの MFA / 監査必須 |
| 2022 | Uber 内部 VPN 突破 | MFA 疲労攻撃で社員を承認させた | プッシュ通知より物理キー |
| 2023 | 日本国内のフィッシング SMS 急増 | 宅配・自治体・銀行を装う | SMS リンクは踏まない・URL を直入 |
Q1. 一般家庭ユーザは何から始めればよい?
A. ① 主要アカウント (Google/Apple/銀行) に MFA。② パスワードマネージャ導入。③ メール宛先・URL を毎回確認。④ 古い携帯番号での認証はやめる。
Q2. なりすましと不正アクセスの違いは?
A. なりすましは「他人を装う行為そのもの」、不正アクセスは「権限なくシステムに入る行為」。なりすましは不正アクセスの主要な手段。
Q3. 統計データ解析でなりすましをテーマにするとき何を可視化する?
A. (1) ログイン都道府県分布の経時変化、(2) IP→地理→端末指紋の遷移、(3) 失敗回数の急増、(4) 異常スコア分布のヒストグラム。SSDSE-B-2026 の人口分布を「正規ベースライン」として重ねるとプロが書く図になります。
Q4. ディープフェイクを技術的に防ぐには?
A. (a) C2PA など来歴メタデータ、(b) AI 検知モデル、(c) 通話に共有秘密合言葉、(d) 動画なら liveness 検出 + チャレンジレスポンス。
Q5. 認証ログが個人情報なのでは?
A. はい。IP・端末ID・地理位置は個人情報になり得るので、機密性 (Confidentiality) と両立する設計が必要。 機密性 ページも参照。