## 概要(mobile 固有 / セキュリティ) モバイルアプリはアプリロック(PIN / 生体)を**コールドスタート時に一度だけ**要求し、以後 `unlocked` 状態がプロセス寿命の間ずっと保持される。バックグラウンド遷移・復帰・アイドル経過で**再ロックされない**。パスワードマネージャとしては、アンロック済みの端末を第三者が手に取れば全パスワードボックスに到達できる(自動ロック不在)。 ## 根拠(ファイル:行) - `apps/mobile/src/App.tsx:17` — `const [unlocked, setUnlocked] = useState(false);` - `apps/mobile/src/App.tsx:41` — `<AppLockScreen onUnlocked={() => setUnlocked(true)} />` - `unlocked` を false に戻す経路が App 全体に存在しない(`setUnlocked(true)` のみ)。 - `apps/mobile/src/components/AppLockScreen.tsx:33-58` — `unlockWithBiometric()` / `handlePinUnlock()` はどちらも成功時に `onUnlocked()` を一度呼ぶだけ。ロック画面は初回マウント時のみレンダリングされる。 - `visibilitychange` / `blur` / `pause` / アイドルタイマー等の再ロック処理は mobile 配下に一切なし(grep 済み)。 - 仕様側にも自動ロック要件が未記載: `documents/spec/biometric-unlock.md` / `mobile-ui.md` に「自動ロック / タイムアウト / 再ロック / バックグラウンド」の記述なし(= 仕様欠落かつ未実装)。 ## 影響 / 失敗シナリオ 1. ユーザーが PIN/生体でアンロック → アプリをバックグラウンド化 → 端末を置き忘れ/紛失。第三者が復帰させるとロック画面なしで全 vault の item(`ItemsPanel`)に到達、パスワードもコピー可能。 2. アイドル放置でも再ロックが掛からない。競合(1Password / Bitwarden 等)はいずれもバックグラウンド遷移・アイドルで再ロックするのが標準。 ## 推奨 - App レベルで再ロックをトリガする: - `document.visibilitychange`(hidden)/`blur`/(Tauri mobile なら該当ライフサイクル)で `setUnlocked(false)` にリセット。 - 設定可能なアイドルタイムアウト(既定例: 60〜300 秒)を追加し、経過で `setUnlocked(false)`。 - `documents/spec/biometric-unlock.md`(または `mobile-ui.md`)に自動ロック要件を SSOT として明文化。 - 併せてクリップボード自動クリア(既存 `copyTextWithAutoClear` の in-page タイマー)は WebView 破棄で発火しない既知の穴(#401 と同型)があるため、再ロック実装時にクリップボードクリアも合わせて評価すると良い。 ## 重大度 Medium(端末物理アクセス前提だが、パスワードマネージャの中核防御である自動ロックが不在。ストアリリース前に対処が望ましい)。
Activity