Skip to content

fix(mobile): アンロック後に自動ロックが無く、バックグラウンド/アイドルでも再ロックされない #408

Open

Description

@mashfromband

概要(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 破棄で発火しない既知の穴(拡張: ポップアップが閉じるとクリップボード自動クリアのタイマーが発火しない(service worker/offscreen 経由の堅牢化) #401 と同型)があるため、再ロック実装時にクリップボードクリアも合わせて評価すると良い。

重大度

Medium(端末物理アクセス前提だが、パスワードマネージャの中核防御である自動ロックが不在。ストアリリース前に対処が望ましい)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions