Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

STRIDE 脅威モデル

本文書は、SS 711:2025 防御の厳格性(Rigour in Defence) および IMDA IoT サイバーセキュリティガイドの脅威モデリングチェックリストに基づき、シンガポール CLS Level 3 評価向けに作成した正式な脅威モデリング成果物です。API・通信チャネル・ストレージのすべての攻撃面を対象とします。

手法: STRIDE(Microsoft) スコープ: edgesentry-rs ライブラリおよび edgesentry-bridge FFI クレート — デバイス側署名、クラウド側インジェスト、HTTP トランスポート、オペレーションログ、監査台帳 評価者参照: SS 711:2025 §4.2 防御の厳格性; IMDA IoT サイバーセキュリティガイド §3 脅威モデリングチェックリスト


システム概要

┌─────────────────────────────────────────────────────────────────┐
│  フィールドデバイス(エッジ)                                         │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │  build_signed_record()                                     │ │
│  │  payload → BLAKE3 ハッシュ → Ed25519 署名 → AuditRecord   │ │
│  └────────────────────────────────────────────────────────────┘ │
└────────────────────────────┬────────────────────────────────────┘
                             │ POST /api/v1/ingest(HTTPS 上の JSON)
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  クラウドインジェスト層                                              │
│  ┌────────────────┐  ┌─────────────────┐  ┌─────────────────┐  │
│  │ NetworkPolicy  │  │ IntegrityPolicy │  │ AsyncIngest     │  │
│  │ IP/CIDR ゲート │→ │ Gate            │→ │ Service         │  │
│  │ (拒否デフォ)  │  │ (署名+チェーン │  │ (ハッシュチェーン│  │
│  └────────────────┘  │  検証)         │  │  +シーケンス)  │  │
│                      └─────────────────┘  └────────┬────────┘  │
│                                                     │           │
│            ┌────────────────────────────────────────┤           │
│            ▼                          ▼             ▼           │
│  ┌──────────────────┐  ┌─────────────────────┐  ┌──────────┐   │
│  │  Raw Data Store  │  │  Audit Ledger       │  │ Op. Log  │   │
│  │  (S3 / メモリ)   │  │  (Postgres / メモリ) │  │          │   │
│  └──────────────────┘  └─────────────────────┘  └──────────┘   │
└─────────────────────────────────────────────────────────────────┘

STRIDE 脅威分析

S — なりすまし(Spoofing)— デバイス ID

脅威: 攻撃者が device_id フィールドを偽装するか、侵害された鍵で署名したレコードをリプレイすることで、正規のフィールドデバイスになりすます。

攻撃面: POST /api/v1/ingestAuditRecord.device_id および AuditRecord.signature フィールド。

サブ脅威説明
S-1有効な device_id を持つが未登録の Ed25519 鍵でレコードを送信する
S-2正当に署名された過去のレコードをリプレイする
S-3署名鍵と一致しない偽造 device_id でレコードを送信する

緩和策:

ID緩和策コード位置
M-S-1デバイスの公開鍵はクラウド側で事前登録される。登録済み鍵で検証できない署名は IngestError::UnknownDevice として拒否されるingest/policy.rs IntegrityPolicyGate::enforce()
M-S-2単調増加するシーケンス番号と prev_record_hash チェーン継続性を強制;リプレイされたレコードは重複シーケンスとして検出されるingest/verify.rs check_sequence()
M-S-3Ed25519 署名はペイロードハッシュを秘密鍵に結びつける;偽造 device_id は署名検証で失敗するidentity.rs verify_payload_signature()

残留リスク: デバイスの秘密鍵が物理的に抽出された場合、有効な署名でレコードを偽造できる。ハードウェアバックアップ鍵ストレージ(TPM/SE)はデバイス層の管理策であり、本ライブラリのスコープ外。ロードマップに記載。


T — 改ざん(Tampering)— 監査レコード

脅威: 攻撃者が転送中または保存中の監査レコードあるいは生ペイロードを改ざんする。

攻撃面: ワイヤフォーマット(JSON ボディ)、Raw データストア(S3 オブジェクト)、監査台帳(DBレコード)。

サブ脅威説明
T-1HTTP リクエストボディの raw_payload_hex を改ざんする
T-2異なるペイロードに合わせて AuditRecord.payload_hash を改ざんする
T-3受理後に保存 S3 オブジェクトのバイトを反転させる
T-4チェーンを断ち切るまたはリダイレクトするために prev_record_hash を改ざんする

緩和策:

ID緩和策コード位置
M-T-1インジェスト毎にクラウドが BLAKE3(raw_payload) を再計算し record.payload_hash と比較;不一致は PayloadHashMismatch として拒否されるingest/storage.rs IngestService::ingest()
M-T-2payload_hash は Ed25519 署名で保護される;ハッシュが変更されると署名検証が失敗するidentity.rs verify_payload_signature()
M-T-3保存後の改ざんは、台帳のハッシュとオブジェクト内容を再検証することで検出可能;運用ランブックに記載の運用的管理策
M-T-4prev_record_hash は直前の受理済みレコードの hash() と照合される;継続性が断たれると以後のすべてのレコードが拒否されるingest/verify.rs check_chain_link()

残留リスク: 受理後の保存オブジェクト改ざんはストレージ層の問題。S3 Object Lock(WORM)やDB行レベルチェックサムをデプロイ層で有効化することで排除できる。


R — 否認(Repudiation)— オペレーションログ

脅威: デバイスまたはオペレーターが特定のインジェストイベントの発生を否定する、またはレコードが送信されなかった・拒否されたと主張する。

攻撃面: インジェスト中に書き込まれる OperationLog エントリ;監査台帳への追記操作。

サブ脅威説明
R-1デバイスがレコードを送信していないと主張する
R-2オペレーターがレコードが受理された(または拒否された)事実を否定する
R-3オペレーションログエントリを事後に削除または改ざんする

緩和策:

ID緩和策コード位置
M-R-1受理・拒否を問わず、すべてのインジェスト試行に対して device_idsequencedecisionmessage を含む OperationLogEntry が書き込まれるingest/storage.rs log_acceptance() / log_rejection()
M-R-2IngestDecision::Accepted / Rejected は決定と同時に操作ログに永続化される;レコードの署名済みハッシュが送信の暗号学的証明となるingest/storage.rs OperationLogEntry
M-R-3追記専用のオペレーションログ(Postgres は INSERT のみ;ログ行への DELETE/UPDATE なし)により事後改ざんを防止するingest/storage.rs PostgresOperationLog;DB ユーザー権限で強制

残留リスク: ライブラリはログデータを提供する;特権インサイダーによる削除からそのデータを守るには、DB 層の管理策(ロール分離、DB 層での監査ログ)が必要。


I — 情報漏えい(Information Disclosure)— ペイロードストレージ

脅威: 機密性の高い検査ペイロードデータが不正な第三者に露出する。

攻撃面: HTTP リクエストボディ(raw_payload_hex)、Raw データストア(S3)、監査台帳、オペレーションログ。

サブ脅威説明
I-1HTTP 通信チャネルへの盗聴
I-2S3 オブジェクトまたは Postgres 行への不正読み取りアクセス
I-3エラーメッセージやログにペイロードバイトが現れる

緩和策:

ID緩和策コード位置
M-I-1HTTP トランスポートは TLS ターミネーション(ロードバランサー / Nginx / Cloudflare)の後ろで動作するよう設計されている;生ペイロードは JSON ボディ内で hex エンコードされ HTTPS で転送される必要があるtransport/http.rs — TLS はデプロイ層の管理策;運用ランブックに記載
M-I-2生ペイロードは呼び出し元が指定したキーで object_ref により保存される;アクセス制御はストレージ層(S3 バケットポリシー、Postgres GRANT)で強制;ライブラリは非認証の呼び出し元に読み取り API を公開しないingest/storage.rs RawDataStore::put()
M-I-3エラーメッセージには device_idsequence が含まれるが生ペイロードバイトは含まれない;tracing スパンはペイロードバイト長のみを記録するingest/storage.rs #[instrument(skip(raw_payload))]

残留リスク: S3 オブジェクトと Postgres 行の保存時暗号化はデプロイ層の管理策(S3 SSE-KMS、Postgres pgcrypto または TDE)。インジェスト HTTP エンドポイントの TLS 1.3 はロードマップ(issue #73)で対応予定。


D — サービス拒否(Denial of Service)— ネットワークポリシー

脅威: 攻撃者がインジェストエンドポイントを大量のリクエストで溢れさせ、正規デバイスのレコード送信を妨害する。

攻撃面: POST /api/v1/ingest HTTP エンドポイント;NetworkPolicy チェック;AsyncIngestService tokio タスクプール。

サブ脅威説明
D-1信頼できない IP からの大量リクエストがハンドラーを圧倒する
D-2大きな raw_payload_hex 値がメモリを枯渇させる
D-3不正な JSON ボディが解析時間を消費する

緩和策:

ID緩和策コード位置
M-D-1NetworkPolicy 拒否デフォルト:明示的に許可リストに登録されていない限り、すべての IP と CIDR 範囲をブロック;未承認の送信元 IP は暗号処理が実行される前に 403 Forbidden を受け取るingest/network_policy.rs NetworkPolicy::check()transport/http.rs ハンドラー
M-D-2Axum のデフォルトリクエストボディサイズ制限(2 MB)がペイロードサイズを上限化するtransport/http.rs — axum デフォルトボディ制限
M-D-3JSON デシリアライズエラーは即座に 400 Bad Request を返す;後段の処理は実行されないtransport/http.rs — axum Json エクストラクター

残留リスク: ソース IP ごと・デバイスごとのレート制限はライブラリ層では未実装;本番デプロイではリバースプロキシまたは API ゲートウェイ層で追加すべき。issue #73(TLS、P2)が計画中のフォローアップマイルストーン。


E — 特権昇格(Elevation of Privilege)— インジェストゲート

脅威: 攻撃者がインジェスト検証ゲートを回避し、任意のレコードを台帳または Raw データストアに書き込む。

攻撃面: IntegrityPolicyGateingest_handler、サービス登録 API(register_device)。

サブ脅威説明
E-1攻撃者が未登録デバイスのレコードで ingest を呼び出し成功させる
E-2攻撃者が制御していないデバイスの有効なシーケンス/チェーンを持つレコードを送信する
E-3攻撃者が register_device を直接呼び出すことで悪意のあるデバイスを登録する

緩和策:

ID緩和策コード位置
M-E-1IntegrityPolicyGate::enforce() はストレージ書き込みの前に無条件で呼び出される;未知のデバイスは IngestError::UnknownDevice で失敗するingest/policy.rs
M-E-2署名検証は device_id に対して登録済みの公開鍵を使用する;デバイスの秘密鍵なしに有効なチェーンは偽造できないidentity.rs verify_payload_signature()
M-E-3register_device は起動時にアプリケーション層のみが呼び出す特権操作;HTTP インジェストハンドラーはデバイス登録をネットワーク経由で公開しないtransport/http.rs — 登録エンドポイントなし;ingest/storage.rs AsyncIngestService::register_device()

残留リスク: register_device を呼び出すアプリケーション層が侵害された場合、任意のデバイスを登録できる。これは運用セキュリティの管理策:登録は強力な認証を持つ別の特権 API の背後に置くべき。


バイナリ解析エビデンス

cargo audit — アドバイザリデータベーススキャン

コマンドと出力(アドバイザリデータベースコミット:最新):

cargo audit

結果: 検出されたアドバイザリはすべて deny.toml で事前承認済み(下表参照):

アドバイザリクレートバージョンステータス理由
RUSTSEC-2026-0049rustls-webpki0.101.7無視(#125aws-smithy-http-client のレガシー hyper-rustls 0.24rustls 0.21 チェーンに固定されている;0.101.x パッチは存在しない。0.103.x インスタンスは 0.103.10 に更新済み。
RUSTSEC-2026-0049rustls-webpki0.102.8無視(#166rumqttc 0.25rustls 0.22 チェーンに固定されている;rustls 0.23+ を採用した rumqttc のリリースが必要。コードベース内に CRL 失効 API 呼び出しは存在しない。

その他のスキャン済みクレート依存関係: 既知の CVE なし

再現手順:

cargo install cargo-audit --locked
cargo audit

cargo deny check — ポリシー強制

コマンド:

cargo deny check

結果: advisories ok, bans ok, licenses ok, sources ok

deny.toml ポリシーの強制内容:

  • アドバイザリ: 文書化された理由を持つ明示的な無視エントリを除き、すべての脆弱性をデフォルトで拒否
  • バン: 複数クレートバージョンを警告;ワイルドカード依存を警告
  • ライセンス: MIT・Apache-2.0・BSD-2-Clause・BSD-3-Clause・Unicode-3.0・CC0-1.0・Zlib のみ許可;例外 1 件: cbindgen(MPL-2.0、ビルド専用ヘッダー生成ツール — コピーレフトは生成物やソースコードに及ばない)
  • ソース: crates.io および信頼済み git ソースのみ

再現手順:

cargo install cargo-deny --locked
cargo deny check

脅威と緩和策のトレーサビリティ要約

STRIDE カテゴリ脅威 ID緩和策 IDソースファイルステータス
なりすましS-1M-S-1ingest/policy.rs
なりすましS-2M-S-2ingest/verify.rs
なりすましS-3M-S-3identity.rs
改ざんT-1M-T-1ingest/storage.rs
改ざんT-2M-T-2identity.rs
改ざんT-3M-T-3運用的管理策⚠️ デプロイ
改ざんT-4M-T-4ingest/verify.rs
否認R-1M-R-1ingest/storage.rs
否認R-2M-R-2ingest/storage.rs
否認R-3M-R-3DB 権限層⚠️ デプロイ
情報漏えいI-1M-I-1デプロイ(TLS)⚠️ #73
情報漏えいI-2M-I-2ストレージアクセス制御⚠️ デプロイ
情報漏えいI-3M-I-3ingest/storage.rs
サービス拒否D-1M-D-1ingest/network_policy.rstransport/http.rs
サービス拒否D-2M-D-2transport/http.rs(axum ボディ制限)
サービス拒否D-3M-D-3transport/http.rs
特権昇格E-1M-E-1ingest/policy.rs
特権昇格E-2M-E-2identity.rs
特権昇格E-3M-E-3transport/http.rs

凡例: ✅ ライブラリコードに実装済み — ⚠️ デプロイ層の管理策(ライブラリスコープ外)