トップページに戻る
tokix.netはネットワーク・セキュリティ周辺から半径rな雑文を垂れ流す不定期更新個人サイト>>このサイトについて

パスワード盗難防止ガイド

<<トップカテゴリー「NetChildren」に戻る

パスワード盗難防止ガイド(1) (>>この記事のみを表示)

「パスワード」というモノは、PCの世界において唯一の「本人証明」となる代物です。で、あるからして

  • 他人に推測されにくいパスワードを作ろう。

これは、まぁ全ての人間が共通して言うことでしょう。具体的には

  • 大文字小文字数字を含むランダムな長いパスワードにしよう。

で、作ったパスワードをどのように保存するべきなのか。ここで人によって言うことが変わってくる。

  • マシンに覚えさせるのは危険。付箋紙やノートを使って保存すべし。
  • その付箋紙やノートを覗かれることを考えればマシンに覚えさせるのが安全。

まぁ大体上記二通りの主張が、いわゆる「初心者向けセキュリティ解説サイト」で繰り広げられていると思います。

あらかじめ書いておきますが、「安全」「危険」というキーワードが含まれるあらゆる問いに関して、「明確な答え」「完璧な答え」なんてものは存在しません。「これで100%の安全が確保される」「こうすれば危険性は0になる」なんて主張は、はっきり言えば嘘です。そういう場所にこそ、一定以上のスキルと悪意を持った人間にとって「糸口」となるモノが生まれる。現実世界においてと同じように、PC・インターネットの世界に「完璧な安全」等というモノは存在しない(プロの泥棒さんからすれば「ウチはセコム入れてるから安全」という家は狙いやすいに違いない)。


・・・と、いう、言い訳をした上で、「パスワード管理」という話において何が「論点」となるのかを書きます。「明確な答え」は出しません。というか出せません。ここで述べる「論点」を踏まえ、一人一人が自分にとってベストと思える方法でパスワードを管理して下さい。「論点」を知っていれば、つまりその「ベストと思える方法」が持つ脆弱性を踏まえてさえいれば、「これで安全です」と結果のみを与えられた場合よりは「安全性」が上がるはずです。

パスワード盗難防止ガイド(2)

パスワード盗難防止ガイド(3)

パスワード盗難防止ガイド(4)

パスワード盗難防止ガイド(5)

パスワード盗難防止ガイド(6)

パスワード盗難防止ガイド(7)

パスワード盗難防止ガイド(2) (>>この記事のみを表示)

パスワード盗難防止ガイド(1)
この連載では「FFFTPでアクセスしているFTPサーバーのパスワード」を例とします。で、パスワードをサーバーに送信する段階までを取り上げます。実際にはFTPパスワードは(基本的に)平文でユーザーマシンからサーバーマシンに送られるので、この最中に(パケットキャプチャ等により)通信を覗くというのも「パスワード盗難」の一つの方法であったりする訳ですが、その段階には触れません。自分自身のローカルマシン上での盗難を防ぐことのみを考えます。内容自体はパスワードクラック概論とある程度かぶると思うので読んでない方は先に読んでおいてもらえると助かります。
「FFFTPで〜」と言っても別にコレは他のFTPクライアントであれメーラーであれIEでアクセスしている会員制サイトのパスワードであれ特に話は変わらないので「俺NextFTP使ってるし」とか「そもそもFTP使わないし」という方もどうぞ。

FFFTPで「ホストの設定」にパスワードを打ち込む。

このまま「OK」を押してホストを登録すれば、次回起動時もそのホストは「登録済み」となっている訳です。まぁFFFTPに限らず他のFTPクライアントでも似たようなモノですし、全く別のアプリ(例えばメーラー)でも似たようなモノですよね。
次回起動時もそのホストは「登録済み」となっている
と、いうことは、そのホストに関する情報はローカルマシン(要はユーザーが普段使っているマシン)のHDDないしレジストリ内に記録されている。
・・・「当たり前だ」と思うかもしれませんが、「次回起動時も」という語句がなければ上記は確定しません。Windowsアプリというモノは
  1. exeファイルのダブルクリック等により起動される
  2. HDD内からプログラム本体が読み込まれる
  3. HDD内の設定ファイルやレジストリ内の設定項目がメモリーに読み込まれる
  4. 設定変更時にメモリー内の情報が書き換えられる(この時に設定ファイルやレジストリを書き換えるアプリもある)
  5. 「×」を押したこと等によりアプリが終了される
  6. HDD内の設定ファイルやレジストリ内の設定項目に対し書き換えが行われる
  7. そのアプリが使用していたメモリーが解放される
と、いうような挙動を行います。故に「設定項目」というのは
  • メモリー
  • HDD
  • レジストリ
のいずれかに記録されている。「メモリー」にしかない情報はアプリを終了すれば消えます。「次回起動時も」生きている設定項目だからこそ、それがHDDかレジストリに記録されているという確信を持つことが出来る。
で、その「次回起動時も生きている」設定が具体的にどこにあるかなんですが、コレは勿論アプリ次第です。FFFTPの場合は、FFFTPプログラムと同じフォルダ内の「ffftp.ini」というファイルが「設定ファイル」となります。このファイルの中にFFFTPの設定(例えば表示フォントとか)やホスト情報・・・つまりパスワードを含む各種情報・・・が記録される訳です。

一般化して書くと
  • readmeに「アンインストール方法」が明示されている(「プログラムの追加と削除から消す」「アンインストーラーを使う」等)アプリはレジストリを使用している。ということは設定保存にレジストリを使っている可能性が高い。
  • 「アンインストール方法」が明示されていない、もしくは「フォルダごと消せばよい」と明示されているアプリはレジストリを使用していない。ということは設定保存にレジストリを使っていないということで、HDD内に設定ファイルがある可能性が高い。拡張子「ini」や「dat」のファイルがプログラムと同じフォルダに存在するならば、それをテキストエディタで開けば平文で設定が記述されていることが多い。
という感じですかね。まぁ、こんなのは「〜ことが多い」としか書きようがない話ですが。

さて。
FFFTPの場合は、FFFTPプログラムと同じフォルダ内の「ffftp.ini」というファイルが「設定ファイル」となります。
これが何を意味しているのか考えてみましょうか。
FFFTPプログラムと同じフォルダ内の「ffftp.ini」というファイル
即ち、FFFTPプログラムのパス(HDD内の所在地)が分かれば設定ファイルのパスが分かる。FFFTPプログラムが「C:\Program Files\FFFTP\ffftp.exe」ならば、設定ファイルのパスは「C:\Program Files\FFFTP\ffftp.ini」です。
設定ファイルのパスが分かる
「特定の手段によりローカルマシン上の(任意のパスの)ファイル読み取りが可能となる」というセキュリティホールはよくOEやIE周辺で発見されます。
参考: 他力本願堂本舗内「Web Browser ControlのNavigateメソッドがセキュリティーゾーンの制限を迂回する
パッチを当てていないIE5.*が持っていたセキュリティホールです。代表的な「ローカルマシン上の(任意のパスの)ファイル読み取りが可能」系のセキュリティホールですね。
つまり、「設定ファイルのパスが分かる」ということは「そういったセキュリティホールを利用すれば設定ファイルを抜くことが出来る」ということです。もちろん、この話はFFFTP設定ファイルのパスが分からなければ意味がない。FFFTPのインストーラーは

という質問を行います。デフォルトではFFFTPフォルダのパスが「C:\Program Files\FFFTP\」。つまり設定ファイルのパスは「C:\Program Files\FFFTP\ffftp.ini」。
  • インストールパスを聞かずに固定フォルダにプログラムをインストールするインストーラー
    →そのプログラムの設定ファイルパスは全てのユーザーに関して同じ
  • インストールパスを聞くインストーラー
    →大抵のユーザーはデフォルトパス
  • インストーラーがなく、圧縮ファイルを解凍して使用するタイプのアプリ
    →ユーザーによってパスは異なる

今回の結論:
「(パスワードを含めた)設定情報」の記録場所が分かる、ということが「穴」に繋がる場合がある。その「設定情報の記録場所」はソフトの性質や、そのソフトをどのようにインストールしたかによって決まってくる。「ソフトをデフォルトパスにインストールしたかどうか」という程度の微々たる差で、「設定ファイル盗難が簡単か難しいか」が変わってくることもあるのだ。「パスワード盗難に関する耐性」を意識するなら、設定ファイルにパスワードを記録するアプリはデフォルトパス以外でインストールした方が良い(もしくは、パスワードを記録させない方が良い)。
パスワード盗難防止ガイド(3)
パスワード盗難防止ガイド(4)
パスワード盗難防止ガイド(5)
パスワード盗難防止ガイド(6)
パスワード盗難防止ガイド(7)

パスワード盗難防止ガイド(3) (>>この記事のみを表示)

パスワード盗難防止ガイド(1)
パスワード盗難防止ガイド(2)
前回書いたように、FFFTPの設定ファイル内に記録されているパスワード情報は「平文のパスワード」ではなく、「パスワードを暗号化して得られた文字列」です。
パスワードは平文ではない(「abcde」と設定したのに「AFcBFCFBaIYZL」となっている)
つまり、ffftp.iniを覗いても「平文のパスワード」が書いてある訳ではない。
パスワードの「abcde」を「AFcBFCFBaIYZL」にしたのはFFFTPプログラムです。パスワードが平文だとセキュリティに問題があるので暗号化している訳ですね。
FFFTPがFTPサーバーにログインしようとする時、サーバーに対して送信されるパスワードは平文です(「AFcBFCFBaIYZL」ではなく「abcde」です)。つまりFFFTPというプログラムは
  1. ユーザーによって「abcde」というパスワードが登録される
  2. FFFTPは「abcde」に暗号化を施し得られた「AFcBFCFBaIYZL」を設定ファイルに記録する
  3. 次回起動時、FFFTPは設定ファイルから「AFcBFCFBaIYZL」を読み込む
  4. FFFTPは「AFcBFCFBaIYZL」を解読し得られた「abcde」をFTPサーバーに送信する
というような挙動を行っている。
「abcde」に暗号化を施し得られた「AFcBFCFBaIYZL」
それが一定の規則に基づいた「暗号化」である以上、その規則さえ分かれば
  • 「abcde」に暗号化を施し「AFcBFCFBaIYZL」を得る
  • 「AFcBFCFBaIYZL」を解読し「abcde」を得る
ことは理論上可能です。しかし
パスワードを平文以外で記録するアプリ
→設定ファイル(orレジストリ)を見られても正しいパスワードは分からない
設定ファイル(orレジストリ)を覗いて「暗号化された文字列(AFcBFCFBaIYZL)」を「平文のパスワード(abcde)」に脳内で解読できる人間というのはあまりいないでしょう。FFFTPがどのような「規則」でパスワードを暗号化しているのか。それを根気強く解析していけばいつか分かるかもしれませんが。
参考:パスワードクラック概論(2)
「暗号化されたパスワードを解読し生のパスワードを得る」というのを攻撃側からの視点で書いています。
パスワードを平文以外で記録するアプリ
→設定ファイル(orレジストリ)を見られても正しいパスワードは分からない
正確に言えば

パスワードを平文以外で記録するアプリ
→設定ファイル(orレジストリ)を見られても「暗号化されたパスワード」しか見えず、それを解読されない限り「平文のパスワード」は漏れない
→現実的には、設定ファイル(orレジストリ)を見られても正しいパスワードは分からない

なるほど。「平文のパスワードを得る」ということが「パスワード盗難」ならば、そうかもしれません。
ユーザーによって「abcde」というパスワードが登録される
FFFTPは「abcde」に暗号化を施し得られた「AFcBFCFBaIYZL」を設定ファイルに記録する
次回起動時、FFFTPは設定ファイルから「AFcBFCFBaIYZL」を読み込む
FFFTPは「AFcBFCFBaIYZL」を解読し得られた「abcde」をFTPサーバーに送信する
ユーザーが自分の脳内で「解読」を出来ないにしても、FFFTPというプログラムは「解読」を行っている。
FFFTPは「AFcBFCFBaIYZL」を解読し得られた「abcde」をFTPサーバーに送信する
そうでなければFFFTPは「abcde」をFTPサーバーに送信することが出来ないのだから(※)。

この連載の後半で書きますが、この記述にはそれなりの意味があります。ので頭の片隅にでも。
つまり。他人のFFFTP設定ファイルを抜いたクラッカーが取るべき行程は以下。
  1. 抜いた他人のFFFTP設定ファイルを自分のHDD内のFFFTPフォルダに移動させる
  2. FFFTPを起動する
  3. FFFTPは設定ファイルから「AFcBFCFBaIYZL」を読み込む
  4. FFFTPは「AFcBFCFBaIYZL」を解読し得られた「abcde」をFTPサーバーに送信する
これで、「AFcBFCFBaIYZL」を自分で解読することなく「abcde」をFTPサーバーに送信する・・・つまり「他人のFTPアカウントでログインする」・・・ことが可能になる。

たしかにFFFTPは設定ファイル書き込み時にパスワードに対する暗号化を行っています。しかし、それには実のところ、誰でもが入手できるアプリならばあまり意味がない。解読をFFFTPに任せる以上、FFFTPを持っていない「クラッカー」にとっては「解読」は難しいですが、FFFTPは手に入れようと思えばすぐに手に入るソフトです(そして、大抵のソフトはそうです)。暗号化を行っているにも関わらず「設定ファイルを盗まれる」は「アカウントを破られる」と同値である。

上記のような性質は、「新しいマシンを買った時の環境再構築の手間」という観点ではプラスとなります。
  1. 旧PC内のFFFTPの設定ファイルをFDDか何かにコピーする
  2. 新PCにFFFTPをインストールする
  3. 新PC内のFFFTPフォルダに(1でバックアップした)FFFTP設定ファイルをコピーする
これでFFFTPの設定を新PCに移行することが出来るからです。しかし、「パスワード盗難に関する耐性」という観点・・・例えば「パスワード盗難防止ガイド(2)で書いたような無差別攻撃に関する耐性」「トロイを仕掛けられた場合の耐性」という観点・・・では、弱い。
参考: 自宅サーバーを構築しよう内「トロイの木馬の種類と仕組み
「トロイ」について

今回の結論:
「パスワードを暗号化してHDD(orレジストリ)に記録するアプリ」も、その「暗号化処理によって得られた文字列」を抜かれただけでパスワードを盗ませてしまう。実のところ「アプリがパスワードを暗号化して保存するか否か」というのは「パスワード盗難を防ぐ」という話においてあまり意味を持っていない。
パスワード盗難防止ガイド(4)
パスワード盗難防止ガイド(5)
パスワード盗難防止ガイド(6)
パスワード盗難防止ガイド(7)

パスワード盗難防止ガイド(4) (>>この記事のみを表示)

パスワード盗難防止ガイド(1)
パスワード盗難防止ガイド(2)
パスワード盗難防止ガイド(3)
「パスワード盗難と関係ないじゃん」と思うかもしれませんが以下の話を。

□例
Napster以降MP3の著作権問題が新聞レベルでも盛んに取り上げられるようになり、例えば富士通デジカメのMP3再生機能には「コピーガード機能」が搭載されています。
  1. HDDから(USB接続した)デジカメのメディアに専用ソフトを使ってMP3を転送する
  2. するとデジカメでそのMP3を再生することが出来るようになる
で、この後
  1. デジカメ内のメディアをカードリーダーに差し込みエクスプローラーでアクセスする
  2. MP3ファイルをHDD内にコピー(移動)する
  3. コピー(移動)したファイルを再生しようとしても出来ない
  1. デジカメ内のメディアをカードリーダーに差し込み、別のメディアを別のカードリーダーに差し込む
  2. MP3ファイルを別のメディアにコピー(移動)する
  3. コピー(移動)先のメディアをデジカメに差し込み再生しようとしても出来ない
何故なのか。

前回まで「暗号化」という言葉を極めて抽象的に使ってきました。その抽象的な暗号観しか持っていないならば、前回書いたように
実のところ「アプリがパスワードを暗号化して保存するか否か」というのは「パスワード盗難を防ぐ」という話においてあまり意味を持っていない
と言わざるを得ない。

□例に関する解説
MP3ファイル転送用の専用ソフトは、ファイルに対して暗号化を施しながらMP3をHDDからメディアにコピーしています。この暗号化には「メディアが一枚一枚固有に持っているナンバー」が使用される。つまり、あるMP3ファイルを転送するにしても
  • そのMP3ファイルをメディアAにコピーする場合
  • そのMP3ファイルをメディアBにコピーする場合
では「メディア内の(暗号化された)ファイル」の内容は異なる。
  1. 「メディアAの番号」を使用し暗号化されたMP3ファイルがメディアAに書き込まれる
  2. デジカメ内のMP3再生ソフトは現在ささっているメディア(A)の番号を利用し書き込まれたファイルを解読し再生する
このようにして「MP3再生機能」が動作している訳です。何故別のメディアにコピーしても再生できないかと言えば
  1. 「メディアAの番号」を使用し暗号化されたMP3ファイルがメディアAに書き込まれる
  2. メディアAに書き込まれたファイルがメディアBにコピーされる
  3. メディアBをデジカメにさして再生を試みる
  4. デジカメ内のMP3再生ソフトは現在ささっているメディア(B)の番号を利用し書き込まれたファイルを解読し再生する
「暗号化に使われたメディア番号(A)」と「解読に使われたメディア番号(B)」が異なるからです。

例えば「あるアルファベットをアルファベット順で1個後ろのモノにする」という「暗号」があったとしましょう。この「暗号化」では「A」は「B」に、「S」は「T」になりますね。「A」が「暗号に対する入力」で「B」が「暗号による出力」である、と。では、「あるアルファベットをアルファベット順でn個後ろのモノにする」という「暗号」ならばどうか。入力が「A」「2」ならば出力は「C」ですね。入力が二つで出力が一つ。y=f(x)=3xならば入力は一つで出力も一つだが、y=f(x,a)=axならば入力が二つで出力が一つ。

・・・と、いうように、「暗号」に対する入力は必ずしも一つではない。複数の入力から一つの出力を生成する「暗号」も存在する。そして、「暗号」とは「関数」と同じようなモノである。入力・出力が一つずつな関数は「一入力関数」、入力が複数で出力が一つな関数は「複数入力関数」と呼ばれます。
MP3ファイル転送用の専用ソフトは、ファイルに対して暗号化を施しながらMP3をHDDからメディアにコピーしています。この暗号化には「メディアが一枚一枚固有に持っているナンバー」が使用される。
「元のMPファイルの内容」と「メディアが一枚一枚固有に持っているナンバー」が入力で、「メディアに書き込まれるMP3ファイルの内容」が出力です。

さて。例えばHDD内の設定ファイルにパスワードが書き込まれる時、暗号化に「マシン固有のナンバー」が入力として使われていたらどうなるか。
  1. あるマシンでパスワードが「そのマシン固有のナンバー」を使って暗号化されHDD内設定ファイルに書き込まれる
  2. 次回起動時、プログラムは「設定ファイルに書かれている文字列」を「そのマシン固有のナンバー」によって解読し「正しいパスワード」を得る
自分で使っている分には何も問題は起きない。しかし
  1. あるマシンでパスワードが「そのマシン固有のナンバー」を使って暗号化されHDD内設定ファイルに書き込まれる
  2. その設定ファイルが(直接操作やネットワーク経由の攻撃によって)盗難される
  3. 盗難したクラッカーは自分のマシンに同じアプリをインストールして盗んだ設定ファイルを読み込ませる
  4. アプリは「クラッカーのマシン固有のナンバー」を使ってパスワード解読を試みる
他人のマシン上では、元のパスワードが解読されることがない。

FFFTPはパスワード保存時に「正しいパスワードを一入力関数に代入した値」を保存しています。
「abcde」と設定したのに「AFcBFCFBaIYZL」となっている
「abcde」が「正しいパスワード」の時、「AFcBFCFBaIYZL」が「正しいパスワードを一入力関数に代入した値」。「何故一入力関数だと分かるのか?」という理由ですが、
  1. 旧PC内のFFFTPの設定ファイルをFDDか何かにコピーする
  2. 新PCにFFFTPをインストールする
  3. 新PC内のFFFTPフォルダに(1でバックアップした)FFFTP設定ファイルをコピーする
上記の行程で、新PCを買った時に環境移行することが出来るからです。もしもFFFTPが「正しいパスワードを複数入力関数に代入した値」を設定ファイルに記録しているのならば、上記の行程で環境移行が出来る訳がない。
  1. ユーザーがパスワード「abcde」をマシンAにインストールされたFFFTPに登録する
  2. FFFTPは「abcde」と「マシンAの固有番号a」を複数変数関数に代入し得られた文字列「AFcBFCFBaIYZL」を設定ファイルに記録する
  3. ユーザーがマシンBにFFFTPをインストールし上記設定ファイルをコピーする
  4. マシンB上のFFFTPは「AFcBFCFBaIYZL」を「マシンBの固有番号b」によって解読しようと試みる
これでは「abcde」を得ることが出来ない。

基本的に、「アプリがパスワードを暗号化して記録するか否か」というのは「パスワード盗難を防ぐ」という話において何も意味を持っていません。「暗号」が一入力関数であるなら「設定ファイルを抜かれる」は「アカウントを破られる」と同値であるし、「設定ファイルを抜かれない」なら「アカウントは破られない」。その「暗号」が「複数入力関数」だからこそ、「設定ファイルを抜かれる」と「アカウントを破られる」の同値関係が揺らいでくる(こういうアプリでは「設定ファイルを抜かれる」は何のダメージにもならないのか?という話は次回扱います)。
この話は、まぁ全ての人にとって重要といえば重要なのですが、特にパスワード管理ツールを使っている人にとって大きな問題となるでしょう。「FFFTPの設定ファイルを抜かれる」は「FTPアカウントを盗まれる」にしか直結しない(もちろんそれだけでも大きな問題ですが)。しかし、パスワード管理ツールに全てのパスワードを記録させている人にとって、「パスワード管理ツールで記録しているパスワードを盗まれる」は「全てのパスワードを盗まれる」ということです。その「パスワード管理ツール」がパスワードを暗号化して記録している場合(平文で記録する「パスワード管理ツールはさすがにないとは思いますが・・・)、その「暗号」が「一入力関数」なのか「複数入力関数」なのかは大きな差です。

今回の結論:
「ソフトがパスワードを暗号化する時、正しいパスワードを一入力関数に代入しているのか複数入力関数に代入しているのか」というのは大きな差である。見かけ上はどちらも「平文ではない」のだが、「設定ファイルを抜かれる」が「アカウントを破られる」に繋がるか繋がらないかはここで決まってくるのだ。パスワードをマシンに覚えさせるなら、その設定ファイル(orレジストリ)に記録される文字列は「正しいパスワードとマシン固有の値を複数入力関数に代入して得られた文字列」であることが望ましい。
パスワード盗難防止ガイド(5)
パスワード盗難防止ガイド(6)
パスワード盗難防止ガイド(7)

パスワード盗難防止ガイド(5) (>>この記事のみを表示)

パスワード盗難防止ガイド(1)
パスワード盗難防止ガイド(2)
パスワード盗難防止ガイド(3)
パスワード盗難防止ガイド(4)
「暗号」というモノを具体的に見つめていくと、「パスワード盗難を防ぐ」という話において重要なのは「その暗号化関数に代入されているのが『正しいパスワード』だけなのかどうか」というポイントである、というのが分かると思います。
  • パスワードを平文で記録するアプリ
    →設定ファイル(orレジストリ)を見られただけでパスワードを盗まれてしまう
  • パスワードを平文以外で記録するアプリ
    →設定ファイル(orレジストリ)を見られても「暗号化されたパスワード」しか見えず、それを解読されない限り「平文のパスワード」は漏れない
    →現実的には、設定ファイル(orレジストリ)を見られても正しいパスワードは分からない
上記のような分類にはあまり意味がない、と。
「意味がある分類」というのは
  • 平文のパスワードないし一方向関数への代入結果を記録するアプリ
    →設定ファイル(orレジストリ)を抜かれただけでパスワードを盗まれてしまう
  • パスワードと固有値の複数入力関数への代入結果を記録するアプリ
    →設定ファイル(orレジストリ)を抜かれただけではパスワードを盗まれない
である、と。
設定ファイル(orレジストリ)を抜かれただけではパスワードを盗まれない
当然、それが「正しいパスワード」と「固有の値」を複数入力関数に代入した結果であったとしても、「固有の値」さえ分かれば「代入結果」から「正しいパスワード」を求めることは出来ます。
x: 正しいパスワード
a: 固有の値
y: 設定ファイル(orレジストリ)内の文字列
y=f(x,a)=ax
x=g(y,a)=y/a

この「固有の値」のように、ある文字列(=「正しいパスワード」)に対する暗号化を強固にするために用いられる補助的な入力(・・・というのもかなり乱暴な説明ですが)は「鍵」と呼ばれます。
つまり
パスワードの複数入力関数への代入結果を記録するアプリ
→設定ファイル(orレジストリ)と固有値を抜かれたらパスワードを盗まれてしまう

さて。■2から執拗に「設定ファイルを抜かれる」と「パスワードを盗まれる」の関係について書いてきました。
  • パスワードを平文で記録するアプリ
    →設定ファイル(orレジストリ)を見られただけでパスワードを盗まれてしまう
    一方向関数にパスワードを代入した結果を記録するアプリ
    →設定ファイル(orレジストリ)を抜かれただけでパスワードを盗まれてしまう
  • パスワードの複数入力関数への代入結果を記録するアプリ
    →設定ファイル(orレジストリ)と固有値を抜かれたらパスワードを盗まれてしまう
「『設定ファイルを抜かれる』が『パスワードを盗まれる』に繋がるのは仕方のないことじゃないのか?」と思いながら読んでいた人もいると思います。「複数入力関数とかを使って『設定ファイルを抜かれる』から『パスワードを盗まれる』までの工程を難しくすることは出来ても、根本的に設定ファイルを盗まれたらパスワードは盗まれるだろ」と。

上記は一定条件下で正しいです。
  1. ユーザーによって「abcde」というパスワードが登録される
  2. FFFTPは「abcde」に暗号化を施し得られた「AFcBFCFBaIYZL」を設定ファイルに記録する
  3. 次回起動時、FFFTPは設定ファイルから「AFcBFCFBaIYZL」を読み込む
  4. FFFTPは「AFcBFCFBaIYZL」を解読し得られた「abcde」をFTPサーバーに送信する
FFFTPは「AFcBFCFBaIYZL」を解読し得られた「abcde」をFTPサーバーに送信する
FFFTPといったクライアントプログラムは、どんなに複雑な暗号化処理を経ていたとしても、最終的には平文のパスワード(=「abcde」)をサーバーに送信する。「サーバーに送信する」ということは「プログラム内部で認識している」。
そうでなければFFFTPは「abcde」をFTPサーバーに送信することが出来ないのだから
まぁFFFTPに限って言えば「設定ファイル内の文字列」は「正しいパスワードを一入力関数に代入した値」な訳ですが、これが「正しいパスワードを複数入力関数に代入した値」であったとしても、その「鍵」がどんなに他人には入手困難な値であっても、その「関数」がどんなに複雑な代物であったとしても、最終的に「正しいパスワードをプログラムが得ている」ならば「必要な全ての値(『設定ファイル内の文字列』や『鍵』)を手に入れた他人は正しいパスワードを解読しうる」。

FFFTPがパスワードを送信すると、FTPサーバーは「その文字列がサーバー内部のユーザーデータファイル内に記述されたパスワードと一致するか」という判定を行います。一致していれば「ログイン成功」で不一致ならば「ログイン失敗」。「一致」「不一致」を判定する際に、FTPサーバーはどのような処理を行っているのか。
・・・コレは最早「クライアントサイドでのパスワード盗難防止」という話から外れているのでここでは扱いませんが、ここまでの話を理解していればすぐに理解できると思います。この連載で三回に渡り書いてきた内容は、実のところいわゆる「(サーバーに対する)パスワードクラック」への入り口でもあったりします。
参考:パスワードクラック概論

上記を読んだ人向けに以下の追記をしておきます。先に書いたとおり「クライアントサイドでのパスワード盗難防止」からは外れてますし、次回以降話を戻すので読み飛ばしても構いません。

「自分が抜いた設定ファイル内の文字列が『パスワードを双方向関数に代入した値』なのか『パスワードを一方向関数に代入した値』なのか」というのは大きな差です。前者なら「解読」が可能ですし、後者なら「総当たり」しかない。それを見分けるためのキーワードは、
そうでなければFFFTPは「abcde」をFTPサーバーに送信することが出来ないのだから
です。プログラムが「正しいパスワード」を認識する必要があるなら、設定ファイル内の文字列は必ず「パスワードを双方向関数に代入した値」ですし、必要がないなら「パスワードを一方向関数に代入した値」である可能性が高い。

・・・と、まぁ、せっかくここまで三回をかけて書いてきたので追記しておきます。
で、次回から二回に分け、話を戻しつつ今回のテーマに関する「まとめ」を書きます。
今回の結論:
FFFTPのようなクライアントサイドプログラムは必ず「正しいパスワードをプログラム内部で認識している」。故に、究極的には、必ず設定ファイル(orレジストリ)内の文字列は解読可能である。たとえその文字列が「複数入力関数に代入した結果」だったとしても、「設定ファイル」「鍵」の両方を抜かれればパスワードを盗まれてしまう訳で。
パスワード盗難防止ガイド(6)
パスワード盗難防止ガイド(7)

パスワード盗難防止ガイド(6) (>>この記事のみを表示)

パスワード盗難防止ガイド(1)
パスワード盗難防止ガイド(2)
パスワード盗難防止ガイド(3)
パスワード盗難防止ガイド(4)
パスワード盗難防止ガイド(5)
前回まで四回をかけて「設定ファイルを盗まれる」と「アカウントを破られる」の関係について書いてきました。「『設定ファイルを盗まれる』と『アカウントを破られる』は必ずしも同値ではない」と。クライアントサイドプログラムでは基本的に「同値」ですが、それにしても「設定ファイルを盗んだ後アカウントを破るための難しさはアプリ次第で変わる」と。
設定ファイルを盗んだ後アカウントを破るための難しさはアプリ次第で変わる
アプリがパスワードを複数入力関数に代入し設定ファイルに記録するならば、「設定ファイル内の文字列」を「パスワード」に戻すことは難しい。「不可能」ではないが「難しい」。クライアントサイドプログラムである以上、パスワードは設定され送信される課程で必ず平文となる時期がある。一つは送信時。送信時には、アプリは必ず平文のパスワードを認識している。
そうでなければFFFTPは「abcde」をFTPサーバーに送信することが出来ないのだから。
故に、「アプリがパスワードを一入力関数に代入しているか複数入力関数に代入しているか」というのは例えば「パケットモニタリングに関する耐性」という点では差がない。
※参考
CyberAcademy内「LANの通信傍受
もう一つ、「設定され送信される課程」の中で「パスワードが平文である瞬間」というのが存在します。「パスワードがユーザーによって打たれる瞬間」。キーボードで打たれる全ての文字列・・・パスワードを含む・・・は、例えばキーロガーによって盗まれうる。
※参考
Insider's Computer Dictionary内「キーロガー
この話は、主に「パスワードを複数入力関数に代入し記録するアプリを使っている人」にとって大きな意味を持つでしょう。
  • パスワードをアプリに記録させ管理する
    設定ファイルを盗まれても即アカウントを破られる訳ではない。原理的に設定ファイル内の文字列は必ず平文のパスワードに解読可能だが、その難易度は決して低くない。
    キーロガーによってパスワードを盗まれうるタイミングは、アプリにパスワードを記録させる(ために平文のパスワードを入力する)瞬間のみ。
  • パスワードをアプリに記録させず毎回入力する
    設定ファイルを盗まれてもアカウントを破られることはない。
    キーロガーによってパスワードを盗まれうるタイミングは、アプリを使う時(例えばFTPクライアントソフトの場合なら、FTPサーバーにログインする度)。
どちらの方がリスクが少ないのかを判断しなくてはいけない。

「キーロガーを仕掛ける」と言っても、クラッカーが行うべきことは「キーロガーというプログラムをターゲットマシン上で実行させること」だけではない。実行されたキーロガープログラムは、必ず何らかの方法でキーログをクラッカーの元に届けなくてはいけない。「ターゲット宅のマシン」という話で言うなら、それは多くの場合ネットワーク経由です。故に、「キーロガーを防ぐ」という場合に気を付けることは
  • 自分のマシン上でキーロガーを実行させない
  • キーロガーがクラッカーにログを届けることを遮断する
という二点。この二点を実現することが、「設定ファイルを抜かせない」よりも難しいのか簡単なのか。そこが判断の分かれ目となるでしょう。
パスワード盗難防止ガイド(7)

パスワード盗難防止ガイド(7) (>>この記事のみを表示)

パスワード盗難防止ガイド(1)

パスワード盗難防止ガイド(2)

パスワード盗難防止ガイド(3)

パスワード盗難防止ガイド(4)

パスワード盗難防止ガイド(5)

パスワード盗難防止ガイド(6)

前回までで書いてきたように、ローカルマシン上での「パスワード」は時に意味のある文字列(「抜けばアカウントを破れる文字列」)であり、時には意味のあまりない文字列(「抜いてもアカウントを必ずしも破れない文字列」)です。「パスワード盗難を防ぐ」をいう言葉は、つまり「クラッカーに『意味のある文字列』を渡さない」という意味であったりします。


最も「意味のある」文字列は、もちろん平文のパスワードです。一部ソフトは「平文のパスワード」つまり「最も意味のある文字列」をHDDなりレジストリなりに記録してしまう。当たり前ですが、それは「抜かれただけでアカウントを破られる情報」です。

また、キーボードによって打ち込まれる瞬間、打ち込まれるパスワードは確実に平文であり「最も意味のある文字列」である、と。故に、キーロガーを仕掛けられればキーボードを使ってパスワードを打つことにより、平文のパスワードは相手に届き、アカウントは破られる。

この連載では扱いませんでしたが、基本的にローカルマシンからサーバーに送信される瞬間も、パスワードは平文です。よってサーバーへの接続時にパケットキャプチャ等を使って通信を覗かれれば、平文のパスワードがバレることになりアカウントを破られてしまう。


次に「意味のある」文字列は、パスワードを一変数双方向関数に代入した値です。それは「関数」と併せられた時「平文のパスワード」となる。「関数」というのは、その暗号化・解読を行っているソフトそのものです。通常、ソフトを手に入れることは誰にでも出来るため、「パスワードを一変数双方向関数に代入した値」を手に入れたクラッカーは「そのソフト」を手に入れることで解読を行うことが出来る。つまり、アカウントを破られてしまう。FFFTPはこのタイプのソフトですね。設定ファイル内のパスワード情報は一見暗号化されているが、「設定ファイルを抜かれる」と「アカウントを破られる」は同値である。


その次に「意味のある」文字列は、パスワードを多変数双方向関数に代入した値です。この場合「平文のパスワード」を手に入れるには「関数」「他の入力」が必要になる。「関数」というのは先ほどと同じように「そのソフト」ですが、「他の入力」はそれほど簡単に手に入れられる物ではない(場合が多い)。パスワードを一変数双方向関数に代入するソフトに比べ、パスワードを多変数双方向関数に代入するソフトは「パスワードを盗難されにくいソフト」と言えるでしょう。

補足として書いておくと、最も「意味のない」文字列は、パスワードを一方向関数に代入した値です。この場合、「設定ファイルを抜かれる」と「アカウントを破られる」は基本的に同値でない。つまり設定ファイルを抜かれてもアカウントを破られることがない。設定ファイル内の文字列を平文のパスワードに解読することは不可能だからです。「『解読が不可能』な文字に何の意味があるのか?」という話ですが、「解読することは出来なくても認証に使用することは出来る」。このへんはこの連載では扱わないので「パスワードクラック概論」を参考にして下さい。「『解読が不可能』な文字列しか入手できなかった場合にどのようにアカウントを破ればよいのか」というのが、いわゆる「(サーバーに対する)パスワードクラック」の導入部となります。

この連載の最初に書いた通り、上記を知っても「ベストなパスワード管理方法」という絶対の答えを手に入れられる訳ではありません。それは上記を踏まえ一人一人が考えて下さい。その「考え」というのは、「補足」に書いた通り、いわゆる「(サーバーに対する)パスワードクラック」の導入部でもあります。「ローカルマシン上で如何にパスワード盗難を防ぐか」というテーマだけでなく、「パスワード」「暗号化」というキーワードが登場する様々な問いにおける汎用的な知識になるはずです。


・・・と、キレイにまとめておきます。

dammy

Credit

SeeAlso

OtherSubCategory

Footprint

Navigation