数年前のグッドフライデーに、サービスのアカウントをハッキングする可能性についてのメッセージが技術サポートフォーラムに投稿されました。 会社の代表者は、自分のアカウントを例としてこれをデモンストレーションするように依頼し、数分後に新しいパスワードが与えられ、新しいプレイリストが作成されました。 これはすぐに、「穴」を塞ぐためにイースターを過ごすことを余儀なくされた数人の従業員の注意を引きました。 この脆弱性の性質により、新しいアカウントの登録は一時的に閉鎖されました。
ハッカーは次のように行動しました:たとえばbigbirdという名前のアカウントをハッキングするために、彼はnameという名前のアカウントを登録しました(Pythonでは、この行は
u'\u1d2e\u1d35\u1d33\u1d2e\u1d35\u1d3f\u1d30′
)。 パスワードをリセットするためのリンクを要求した後、新しいパスワードが設定されました。これは、bigbirdアカウントに適していました。
問題は、禁止文字と同等の文字を誤って処理するユーザー名を正規化することでした。 明らかに、ユーザー名にスペースは使用できません。BigBirdとbigbirdは同じログインです。 最初のケースは禁止された文字の処理であり、2番目のケースはいくつかの文字を互いに同等に処理することです。 これは、ユーザー名を正規化することで実現されます。
ラテン文字(a〜z、A〜Z)のみが許可されている場合、それで十分です。
canonical_username = username.lower()
したがって、BigBird、Bigbird、bigbird、およびその他の派生物は同じログインになります。 BigBirdは正確なユーザー名と呼ばれ、bigbirdは標準と呼ばれます。 アカウントを作成する場合、システムで正規ログインが無料である必要があります。
小文字にはi等性の性質があります。つまり、同じ行に1回以上適用すると同じ結果が得られます。
x.lower() == x.lower().lower()
Unicode文字の解決により、さまざまな問題が始まります。 たとえば、外側ではΩとΩを区別することは困難ですが、最初の文字はオメガ文字、2番目の文字は測定単位の記号であり、Unicodeではこれらは異なる記号です。 明らかに、単に小文字では十分ではありません。 開発者にとって幸いなことに、独自の正規化システムを開発する必要はありませんでした。Twistedフレームワークには、XMPPに対しても開発された必要なメソッドがありました。
from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep def canonical_username(name): return nodeprep.prepare(name)
仕様では ency等性が約束されています 。 どうしたの? ᴮᴵᴳᴮᴵᴿᴰと入力するとどうなるか見てみましょう。
>>> canonical_username(u'\u1d2e\u1d35\u1d33\u1d2e\u1d35\u1d3f\u1d30') u'BIGBIRD' >>> canonical_username(canonical_username(u'\u1d2e\u1d35\u1d33\u1d2e\u1d35\u1d3f\u1d30')) u'bigbird'
ご覧のように、これらのシンボルのべき等性プロパティは満たされていません。 公式文書によると、Unicode 3.2の文字が考慮されており、ᴮᴵᴳᴮᴵᴿᴰの文字は含まれていません。 正規化機能を1回使用した後にアカウントを登録すると、正規名が既存のbigbirdアカウントと重複しなかったため、BIGBIRDログインが作成されました。これは許可されていました。 パスワードをリセットするリンクを含む電子メールメッセージを送信すると、ᴮᴵᴳᴮᴵᴿᴰが一度正規化されたため、ユーザーはメッセージBIGBIRDを受信しました。 しかし、リンクを使用する場合、正規化機能が再利用されたため、BIGBIRDではなくbigbirdアカウントのパスワードがリセットされました。
脆弱性は、条件
X==canonical_username(X)
の必須の履行によって最初に修正されました。 後に、実際には正規化機能のみを実行し、
old_prepare(old_prepare(name)) != old_prepare(name)
場合は登録を拒否する関数が追加されました。 Twistedの問題はバージョン11.0.0で修正され、判明したように、バグはPythonバージョンを2.4から2.5に更新したときにのみ現れました。これは標準ライブラリの変更が原因でした。
このような場合は、ユーザー入力を検証し、ユーザーと従業員間の否定的なコミュニケーションを避ける必要性を再度強調します。 この脆弱性を発見したハッカーは、数か月間の無料プレミアムサブスクリプションを受賞しました。これは、キャラクター処理機能に関する問題の最初で最後のケースではありませんでした。 また、更新は常にバグを取り除くことを約束するものではなく、時々新しいバグが発生することも忘れないでください。