情シスがデータベース用のパスワードを作り、コピーしてターミナルへ貼る。この数十秒のあいだ、同じ文字列は生成ページ、システムのクリップボード、次にフォーカスが当たる入力欄の三つに同時に存在する。前半だけ確かめる人は多い。生成のときに平文がブラウザを出ていないか。その手順はNetwork で平文が上がっていないことをその場で確かめるに書いた。後半は飛ばされやすい。コピーが成功したあと、そのバッファをまだ読めるのは誰か。
本稿は、強いパスワードや読みやすいパスフレーズの作り方ではない。「コピー」を製品の機能一覧にもしない。問いは一つだけだ。パスワードがクリップボードに入ったあと、どの種類のプログラムがそれを読めるか。MyPassGen のコピーボタンは navigator.clipboard.writeText を呼び、文字列をシステムのクリップボードへ書く。サイト内にパスワード保管庫は無い。タブを閉じても、サーバーにその一本は残らない。クリップボードは OS の共有領域であり、ページを閉じても残る。仕様、設定画面、その場で踏める手順で経路を分ける。
先に振り分ける
パスワードマネージャの自動入力に任せられるなら、コピーしない。コピーせざるを得ないときは、実アカウントに使わないテスト用の文字列だけで下の確認をする。貼り付けに成功したら、意味のない1文字ですぐ上書きする。遠隔の同僚へ渡すならワンタイムへ移し、平文をクリップボードやグループチャットに長く残さない。
コピーが終わった時点で、秘密はページの外に出ている
生成ページの入力欄は、今開いているタブに属する。クリップボードは、どのタブにも属さない。MDN は Clipboard API を「システムのクリップボードを非同期で読み書きする」と書く。書き込みが成功したあと、メモ帳、ターミナル、チャット、リモートデスクトップは、それぞれの規則で読める。HTTPS が守るのは、生成ページからサーバーまでの経路だけだ。手元のこのバッファは守らない。
古い document.execCommand('copy') は非推奨であり、実装も揃っていない。新しいページは navigator.clipboard.writeText を使う。この書き込み自体は、通常「読み取りを許可しますか」を出さない。Chromium は clipboard-write を自動付与できる書き込み権限として扱う。Firefox と Safari は、直近にユーザー操作(ボタン、キー)があること、仕様でいう瞬間的な活性化を求める。あなたが「コピー」を押したことは、その操作に当たる。スクリプトが裏で黙って書くと、Safari では失敗しやすい。「なぜこのページは一度押さないとコピーできないのか」は、サイトが意地を張っているわけではない。
MyPassGen のパスワード生成、ワンタイムのリンク、洗浄結果のコピーは、どれも同じ writeText を通る。開いてすぐ使える。登録は要らない。コピー成功は、文字列がシステムのクリップボードに入ったことだけを示す。数秒後に誰が読むかは示さない。Win+V の履歴に出ないことも示さない。「コピーしました」の四字を安全の終点にすると、後ろの経路が落ちる。
Webページの読み取り:権限とペースト
ページが自分からクリップボードを読むときは、navigator.clipboard.readText() か read() を使う。仕様は安全なコンテキスト(HTTPS または localhost)を求め、読み取りはユーザーが直前にそのページを操作したあとに起きることを望む。ブラウザの実装は揃っていない。だからその場で試せる。
Chromium:clipboard-read 権限
Chrome や Edge は、文書にフォーカスがある一方で読み取りが仕様どおりでないとき、Permissions API の clipboard-read を求める。「許可」を押すと、権限は残る。同じオリジンのスクリプトは、次回から毎回ダイアログを出さずに読める。サイトの設定で「クリップボード」を確認でき、取り消しもできる。他人のページに埋め込まれた iframe は、さらに Permissions-Policy の clipboard-read / clipboard-write を通る。親が通していなければ、子の呼び出しは失敗する。開発者ツールの Application → Permissions で確かめられる事実であり、スローガンではない。
Firefox と Safari:短い貼り付けメニュー
Firefox と Safari は、この永続権限を実装するつもりがない。読み取りが仕様どおりでなく、それでも瞬間的な活性化があるときは、短いコンテキストメニューが出る。項目は「ペースト」一つで、約1秒後に押せるようになる。同一オリジンならこの一段を飛ばせることもある。オリジンを跨ぐ内容は、たいてい飛ばせない。その項目を押さなければ、スクリプトはテキストを取れない。Chromium の「一度許可すれば、あとからも読める」とは別の模型だ。
自分で貼ったとき:今のページは必ず読める
Ctrl+V / Cmd+V を押すか、入力欄の「ペースト」を押すと、paste イベントが起きる。処理関数は clipboardData からテキストを取り出せる。あなたが今のページへ渡したのであり、裏での盗み読みではない。危険は、フォーカスが Slack、問い合わせの返信欄、間違ったブラウザ設定ページにあるときに、目より手が早いことだ。クリップボードは「今からパスワードを貼りますか」と聞かない。
スマホにはもう一層ある。iOS 14 以降、アプリがバックグラウンドでクリップボードを読むと、画面上部にバナーが一瞬出る。iOS 16 以降、システムのペーストメニュー、ショートカット、UIPasteControl を使わず UIPasteboard を直接読むアプリは、先に「ペーストを許可しますか」と聞かれる。バナーとダイアログは「誰かが読んでいる」ことを示す。「誰も読んでいない」ことは示さない。見えなかったのは、今回トリガーが無かったか、以前に許可したかだ。
コピーしたばかりのパスワードを、原文を上げる検査ページへ貼らない
「パスワード漏洩確認」のなかには、原文を POST するものがある。クリップボードの漏れは手元の経路だ。上げるサイトへ貼るのは、別の出方向の経路だ。差は端末の漏洩名簿と Have I Been Pwned では、証明できることが違うに書いた。端末の照合は公開された弱いパスワード名簿をダウンロードし、調べるパスワードは入力欄に残す。生成も照合も、開いてすぐ使える。登録は要らない。
システムの履歴とクラウド同期
Webページの権限が覆うのは、「今のタブのスクリプト」までだ。OS は自分で履歴を持ち、別の端末へ同期することがある。この二本は clipboard-read のダイアログを通らない。
Windows 10 / 11 でクリップボードの履歴をオンにすると、Win+V で最近コピーした項目が見える。Microsoft の説明では、最大25件。ピン留めしていない項目は再起動で消える。ピン留めした項目は残る。設定では「デバイス間で同期」も開け、同じ Microsoft アカウントで入っている PC 同士でテキストが同期される。パスワードが履歴に入ると、この PC の前に座った人と、同期先の端末にいる人が、パネルで平文を見られる。ピン留めは特に危ない。再起動しても消えない。
Apple のユニバーサルクリップボードは Handoff を使う。端末が近く、同じ Apple Account、Bluetooth と Wi-Fi がオン、Handoff がオン(初期値はオン)。一方でコピーすると、近くのもう一台へ貼れる。内容は短い時間だけ、またはどちらかが新しい内容をコピーするまで残る。Apple のセキュリティガイドは、もう一段はっきり書く。アプリは、ユーザーがまだ貼っていない段階でクリップボードのデータへアクセスできる。ユニバーサルクリップボードを開いたあと、そのアクセスは同じ iCloud アカウントの他の端末へ延びる。暗号化は Handoff と同じ経路(BLE 4.2 のペアリング、256ビットの AES 鍵、広告は AES-256-GCM)だ。防ぐのは通りすがりの盗聴であり、「隣の、すでにログイン済みの iPhone は読めない」ではない。
パスワードマネージャは、クリップボードを短い露出の窓だと認めている。1Password は、初期値で約90秒後にコピー内容を消し、セキュリティ設定でオフにできる。Bitwarden は、デスクトップ、モバイル、ブラウザ拡張で「クリップボードを消去」を出し、間隔は約10秒から5分、またはしない、を選べる。ブラウザの生成ページは、たいていこれを代行しない。MyPassGen は、コピー成功のあとカウントダウンで空にしない。上書きは、自分で別のものをコピーするか、システムのパネルで消す。
リモートデスクトップ、拡張機能、誤貼り付け
リモートデスクトップ、VNC、多くの会議ソフトは、初期値でクリップボードを双方向にリダイレクトする。遠隔セッションでコピーすると手元でも貼れる。手元でコピーすると対向でも貼れる。パスワードは、二台のバッファに同時に出る。画面共有中は、ターミナルへ貼ったばかりの文字が、会議の録画やスクリーンショットに残ることもある。「ページが上げたか」とは別の層だ。Network パネルには見えない。
ブラウザ拡張が clipboardRead / clipboardWrite(または Chromium の対応するホスト権限)を申請していると、ページスクリプトの権限模型の外でクリップボードを読み書きできる。ストアの権限一覧で確かめられる。「クリップボード強化」「端末を跨いで貼る」系を入れたなら、同期の経路をもう一本開いたことになる。生成ページが上げていないかだけを見ず、拡張の一覧も見る。
いちばん多く、その場で再現しやすいのは、誤貼り付けだ。フォーカスが Slack、メール本文、問い合わせの返信にあるときに、指がペーストを押す。チャット履歴、メール保管、チケットシステムは平文を残し、保存期間はクリップボードの90秒より長い。遠隔の同僚へ一度だけ渡すときはワンタイムへ移す。鍵は URL の # の後ろに置く。閲覧ページにログインは要らない。同じ平文をクリップボードへコピーし、さらにグループへ貼らない。
対照表:5本の漏れ経路
いまコピーしたテスト用のパスワードは、少なくとも五本に分けられる。差はアルゴリズムの名前ではない。誰が読めるか、その場で見えるかだ。
| 経路 | 誰が読めるか | その場でどう見えるか |
|---|---|---|
Web の readText() |
読み取り権限を得た、または貼り付けメニューを通したオリジン | Chromium の許可ダイアログ。Firefox / Safari のペースト項目 |
| 自分の貼り付け | いまフォーカスがあるページまたはアプリ | 入力欄に平文が出る。paste イベント |
| システムの履歴 / クラウド同期 | この端末の利用者。同期先の端末 | Win+V。別の Apple 端末での貼り付け |
| リモートデスクトップ / 会議 | 両端のセッション、録画、スクリーンショット | 対向のメモ帳へ貼れるか。会議の再生 |
| 拡張機能とマネージャ | クリップボード権限を宣言した拡張 | 拡張の権限ページ。マネージャが N 秒後に空にするか |
生成ページが Web Crypto で乱数列を作り、Network にパスワード本文が無いことは、「上げる」一本を閉じただけだ。上表の残り四本は開いたままになる。マネージャの自動入力に任せられるなら、クリップボードを通さない。手入力やコピーが避けられないときは、露出の窓を「貼ったらすぐ上書き」まで縮める。
その場で確かめる
下の手順は、どのブランドの約束にも依存しない。実アカウントに使わないパスワードで行う。生成の初期値である16文字のランダム列で足りる。いま使っているマスターパスワードでは練習しない。
- 生成ページを開き、テスト用のパスワードを作り、コピーする。ログインには使わない。開発者ツールの Network を開き、「ログを保持」を入れる。コピーのあと、リクエスト本文と解析イベントにこの文字列が無いことを確かめる。上げていないことを見る手順はブラウザで暗号化したとき、平文が送られていないことをその場で確かめるにある。
- メモ帳か任意のテキスト欄を開き、一度貼る。クリップボードの中身が、いまの文字列であることを確認する。続けて1文字
xをコピーし、もう一度貼る。xになれば、上書きは効いている。 - Windows でクリップボードの履歴がオンなら、Win+V を押す。履歴にテスト用のパスワードが見えるはずだ。上書き済みなら、最新は
xで、パスワードは下の方に残ることがある。ピン留めは押さない。「すべてクリア」か、意味のないテキストをコピーし続け、一覧からパスワードが見えなくなるまで続ける。 - 空のタブのコンソールで
navigator.clipboard.readText().then(console.log, console.error)を実行する。Chromium は読み取り許可を出すか、失敗する。Firefox / Safari はペースト項目を出すか、拒否する。「デバッグが楽だから」と「許可」を押さない。許可は、そのオリジンへ永続の読み取り権を残す。 - 同じ Apple Account または Microsoft アカウントで入り、同期がオンの二台目があるなら、そちらで貼る。テスト用のパスワードが出たら、クラウド同期かユニバーサルクリップボードが平文を送っている。同期を切る、Handoff を切る、またはタイムアウトを待ってもう一度試す。
- 入れてある拡張の権限一覧を見、クリップボードの読み書きが無いかを確認する。リモートデスクトップが開いているなら、対向のメモ帳で一度貼り、リダイレクトがオンかを確かめる。
MyPassGen のパスワード生成は、この境界で動く。ランダム文字は6–128、初期値16、8未満は弱いと警告する。二つのモードとも、今開いているタブで getRandomValues を使う。コピーは writeText を通る。開いてすぐ使える。アカウントもパスワード保管庫も無い。確かめるのは許可ダイアログ、Win+V、もう一台での貼り付けであり、画面の「コピーしました」ではない。
貼り付けたあとの片付け
今日コピーせざるを得ない一本は、この順で片付ける。フォーカスが正しいパスワード欄にあることを先に確認してから貼る。すぐ意味のない1文字をコピーするか、システムのパネルで履歴を消す。他人へ渡すならワンタイムへ移し、鍵は # の後ろへ置く。平文をクリップボードに「控え」として残さない。マネージャの自動入力に変えられる口座は、コピーを手順から外す。
共用 PC、デモ機、リモートデスクトップが開いた踏み台は、初期値で「クリップボードは二人目が読む」とみなす。こうした環境でマスターパスワードをコピーしない。手入力が避けられないときは、打ち間違いを減らすために長いパスフレーズを使い、使い終わったら替える。100語の表の4語は約27ビットで、マスターパスワードには足りない。対照はランダムパスワードとパスフレーズの選び方:4単語は自動的に強くないにある。
「貼ったら上書き」と「読み取りを許可しない」まで終えると、本稿の問いに答えられる。コピーしたあと誰がまだ読めるかは、Webページの権限、システムの履歴、クラウド同期、遠隔セッション、自分の次の貼り付けで決まる。生成ページが上げないことは、サーバーログにこの文字列が無いことだけを示す。OS がすでに出した一分は、回収しない。
よくある質問
HTTPS なら、コピーしたあとのパスワードは守られているか。
守られていない。HTTPS が守るのは、ブラウザからサーバーまでの伝送だ。クリップボードは手元にあり、その TLS を通らない。ページへのアップロード、システムの履歴、ユニバーサルクリップボード、誤貼り付けは、アドレスバーの鍵マークを見ない。
「クリップボードの読み取りを許可」を押したあと、取り消せるか。
Chromium では取り消せる。サイトの設定 → 権限 → クリップボードを、ブロックへ変える。Firefox と Safari は、今回の読み取りを永続権限にしないことが多く、次回もペースト項目を通す。一度押さなくて済むからといって、信頼していないオリジンへ読み取りを開けない。
パスワード生成に登録は要るか。コピーは上がるか。
登録は要らない。生成とコピーは、今開いているタブに残るべきだ。コピーは文字列をシステムのクリップボードへ書くのであり、サーバーへ POST するのではない。Network を開く。コピーのあと、リクエスト本文と解析イベントにそのパスワードが載ってはいけない。同僚へ残すならワンタイムを使う。クリップボードを伝送路にしない。
パスワードマネージャの自動入力は、コピーより安全か。
「システムのクリップボードへ一度出さない」という意味では、そうだ。自動入力はパスワードを今のフォームへ送り、Win+V の履歴を通さない。マネージャがなお「コピー」を出すなら、その一回は生成ページのコピーと同じバッファを使い、上書きが要る。自動入力を選べるなら、コピーしない。