セキュリティ方針 — 写丸君

最終更新: 2026年9月5日

この文書は、写丸君の署名鍵の扱いと、脆弱性への対応方法を定めたものです。 C2PA 適合プログラムの「Generator Product Security Requirements」(v0.1)の Assurance Level 1 の要件に 対応するように書いており、適合申請時のセキュリティ設計書(Security Architecture Document)の元にもなります。

1. 構成(Implementation Class: 公式の証明書で署名するときは Distributed、それ以外は Edge)

写丸君は、撮影・マニフェスト生成・ハッシュ計算を端末の中で行います。署名は 2 通りあります。

署名のしかたどこで署名するかC2PA の分類いつ
① 端末の鍵で署名端末の中(Android Keystore / Secure Enclave)Edge既定。設定「公式の証明書で署名する」がオフのとき、または通信できないとき
② 公式の証明書で署名会社の署名サーバー(claim のハッシュ 32 バイトだけを送る)Distributed設定をオンにして通信できるとき。Android 0.1.10 以降(Android 10 以降)。iPhone 版は②を使用していません(iPhone 版の適合が済むまで。設定をオンにしても①で署名します)

C2PA 適合プログラムに申告しているのは②の形です。1 つのファイルに付く署名はどちらか 1 つで、重ねません。 iPhone 版も 1.1.0 から①②の両方の設定がありますが、②は使用していません(iPhone 版の適合が済むまで。設定をオンにしても①で署名します)。既定ではどちらの設定もオフで、通信しません(設定「会社の証明書で署名する」「会社のサーバーで署名する」をオンにしたときだけ通信します)。

部品役割
CameraX撮影。JPEG / MP4 を一時ファイルに書く
ImageConvert / FastPng必要なときだけ PNG に変換
c2pa-android(c2pa-rs を含む)マニフェストの組み立て、ハッシュ計算、署名の埋め込み、検証
DeviceKey署名鍵と証明書の管理(Android Keystore。iPhone 版は Secure Enclave)
ServerSign②のとき、claim のハッシュを会社の署名サーバーに送って署名を受け取る。端末の鍵で「本物の写丸君である」証明を付ける
Tls会社のサーバーとの通信を TLS 1.3 だけに絞る(Android 10 以降)
LocationTracker位置情報(同意制)
MediaStorageギャラリーへの保存

2. 署名鍵の保護(要件 O.2 / 6.2.1 Level 1)

3. 脆弱性への対応(要件 O.3 / 6.3.1 Level 1)

3.1 依存ライブラリのスキャン(SCA / SBOM)

3.2 修正期限

3.3 同梱ライブラリの更新

3.4 ビルドと配布

4. 資産とアサーションの保護(要件 O.4)

5. 通信(要件 O.5 / O.6)

端末と外部の通信は、利用者が設定でオンにしたものだけです(README「外部通信について」)。 すべて既定はオフで、全部オフなら通信しません。

TLS。 会社のサーバー(1 と 3)との通信は、Android 10 以降では TLS 1.3 だけに絞っています (Tls.kt。要件 O.5「部分システム間の通信は TLS 1.3 以上」)。サーバー側は Google 管理で TLS 1.2 も 受け付けますが、端末が 1.3 未満を拒むので、この端末が使う通信路は必ず 1.3 になります。 Android 9 には TLS 1.3 が無いため、②は Android 9 では使えません(①は使えます)。

会社の認証局(shamaru-ca)

署名そのものは端末の中で行います。署名鍵はどの経路でも端末の外に出ません。 サーバーがするのは「この公開鍵は本物の写丸君が動く改造されていない端末の中で作られた」ことを 確かめて、証明書を出すことだけです。

会社の署名サーバー(shamaru-ca の /v1/shamaru/sign。②のとき)

②では、claim への署名を会社のサーバーの鍵で行います。鍵は Cloud KMS の中にあり、取り出せません (中間 CA の鍵とも別の鍵)。

6. 脆弱性の報告

写丸君の脆弱性を見つけたときは、公開の場に書く前に info@callirrhoe.jp へ連絡してください。 受け取りから 7 日以内に返事をし、上記の期限で修正します。

7. 要件との対応表

C2PA 要件対応
6.1 O.1 自動登録時の認証実装済み(Android 0.1.6 以降)。チャレンジ + Android Key Attestation で端末を認証してから発行します。アプリに CA の認証情報は一切埋め込んでいません。第 5 章
6.2.1 鍵の暗号化保管・最小権限・ローテーション第 2 章
6.3.1 SCA / SBOM と 90 日以内の修正第 3 章
6.4 生成時の改ざん防止第 4 章
6.5 / 6.6 通信・ホスティング環境第 5 章。証明書の受け取りは TLS 1.3。署名サーバーは持たず、認証局は Google Cloud Run の上で動き、中間 CA の秘密鍵は Cloud KMS から取り出せません