アカウントとUnicode文字のハッキング

Spotifayaテクニカルブログは、ユーザー入力の正規化の機能を使用したサービスアカウントのハッキングに関する興味深い研究を公開しました 。 これは、Spotifaevsが誇りに思っていること、つまり完全にユニコードでログインできることのおかげで可能になりました。 たとえば、必要に応じて、ユーザーは簡単に雪だるまをアカウント名として持つことができます。 ただし、これを最初から実装すると、不便が生じました。



数年前のグッドフライデーに、サービスのアカウントをハッキングする可能性についてのメッセージが技術サポートフォーラムに投稿されました。 会社の代表者は、自分のアカウントを例としてこれをデモンストレーションするように依頼し、数分後に新しいパスワードが与えられ、新しいプレイリストが作成されました。 これはすぐに、「穴」を塞ぐためにイースターを過ごすことを余儀なくされた数人の従業員の注意を引きました。 この脆弱性の性質により、新しいアカウントの登録は一時的に閉鎖されました。



ハッカーは次のように行動しました:たとえば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に更新したときにのみ現れました。これは標準ライブラリの変更が原因でした。



このような場合は、ユーザー入力を検証し、ユーザーと従業員間の否定的なコミュニケーションを避ける必要性を再度強調します。 この脆弱性を発見したハッカーは、数か月間の無料プレミアムサブスクリプションを受賞しました。これは、キャラクター処理機能に関する問題の最初で最後のケースではありませんでした。 また、更新は常にバグを取り除くことを約束するものではなく、時々新しいバグが発生することも忘れないでください。



All Articles