Railsのセキュリティの脅威:認証
このシリーズのパート1、インジェクションアタックについて説明しました
OWASPトップ10Webアプリケーションセキュリティリスクに関するシリーズの2番目の記事では、認証の失敗とデータ漏洩の脅威の世界に飛び込みます。
具体的には、ハッカーが作成したコードをだまして攻撃を実行し、ユーザーのデータを取得するのがいかに簡単かについて説明します。
- ユーザー列挙 :データベースに存在するかどうかを確認するためだけに、可能性のあるユーザーのリストをブルートフォーステストしてログインページを悪用した場合。
- 弱いパスワード :システムで弱いパスワードが許可されている場合、ハッカーはブルートフォース攻撃を実行してユーザーのパスワードを推測する可能性があります。
- 無制限のCookie :システムが適切なセキュリティ設定なしで機密データをCookieに保存すると、ハッカーはXSS攻撃を通じて情報を盗む可能性があります。
また、十分に保護されていない機密データについても詳しく説明し、次のような脆弱性の余地を残します。
- 安全でない機密ストレージ :機密データがMD5などの弱いアルゴリズムで暗号化されている場合。
- 機密データの公開 :たとえば、開発者が意図せずに暗号化されていない機密データをURLや非表示フィールドに公開した場合。
シリーズの最初の記事と同様に、RailsGoatを使用して、これらの脅威のそれぞれを実際に調査します。ここが初めての場合は、前の記事を参照してアプリをセットアップして実行してください。
さっそく始めましょう!
認証なしでは生きていけません。バックエンドAPIにあるかフロントエンドフォームにあるかにかかわらず、セキュリティ対策の境界限界を強調するため、アプリケーション開発における最も重要なステップの1つです。
認証自体だけでなく、次に来るもの、つまりセッション管理のためにも。パスワードとトークンはどこに保存しますか?それらは適切に暗号化されていますか?信頼できるアルゴリズムを使用していますか?パスワードは十分に複雑ですか?
注目すべき多くの質問があります。それらを少し分解して、Railsアプリケーション内の認証とセッション管理に関連するいくつかの一般的な攻撃を理解しましょう。
ユーザー列挙は、攻撃者が(ブルートフォースを使用して)特定のデータがシステム内に存在するかどうかを確認するために使用する有名な手法です。
この攻撃の最も悪名高い例の1つは、現在のFacebookログインページで発生します。下の画像に示すような無効でランダムな資格情報を入力すると、Facebookはリクエストを処理し、データベース内にユーザーが存在するかどうかを確認します。
Facebookのログインページ。
ログインをクリックすると ボタンをクリックすると、Facebookはユーザー名(電子メールまたは電話番号のいずれか)が無効であることを示すエラーメッセージを返します。
無効なユーザー名メッセージ。
したがって、攻撃者は、アプリケーションがユーザーが登録されているかどうかを通知することを知っています。無料です。
攻撃者が電子メールのリストを持っている場合(それらがランダムに生成されたか、どこかで購入されたかにかかわらず)、パスワードが正しいかどうかをアプリケーションに尋ねることもできます:
無効なパスワードメッセージ。
攻撃者は、システムが各検証に個別にどのように応答するかを知ったら、possible users
のリストを作成できます。 および一般的な/弱いパスワード。その後、アクセスが取得されるまで、ブルートフォーステストをシステムに対して繰り返し実行できます。
もちろん、Facebook開発者はこれを知っており、特定のIPアドレスからのリクエスト数に対する非表示のキャプチャや検証などの追加の保護を実装したのはそのためです。
ユーザーの列挙を回避するためにできることの1つは、ユーザー名とパスワードの両方を一緒に検証し、一般的なメッセージを返すことです。このアプローチの実際を見てみましょう!
RailsGoatアプリで、 user.rbを開きます app / modelsのファイル フォルダを作成し、authenticate
を見つけます 方法。その中に、次のコードスニペットがあります:
raise "#{email} doesn't exist!" if !(user)
if user.password == Digest::MD5.hexdigest(password)
auth = user
else
raise "Incorrect Password!"
end
丁度!メッセージは、攻撃者がユーザーが存在しないか、パスワードが間違っているかを知ることができるように設定されています。
それをテストします。 RailsGoatのログインページに移動し、ランダムな電子メールとパスワードを入力します。次のエラーメッセージが表示される場合があります。
ユーザーは存在しません。
それ以外の場合、ユーザーが存在する場合( [email protected] 、たとえば)しかし、パスワードが間違っていると、次のメッセージが表示されます。
パスワードが正しくありません。
アプリでは強力なパスワードしか許可されていないため、攻撃者は有効なクライアントメールのリストを作成し、フィッシングメールを標的にして、悪意のあるアクションを要求しているという印象を与える可能性があります。
安全性を高めるために実行できる最も迅速なアクションは、メッセージを変更してハッカーの生活を複雑にすることです。
sessions_controller.rb
内 (app/controllers
フォルダ)、create
を見つけます メソッドを使用して、次のコードスニペットを変更します
flash[:error] = e.message
次のように:
flash[:error] = "Your credentials aren't valid."
これで、ユーザーが間違ったユーザー名またはパスワードを入力するたびに、それが受信するメッセージになります。
無効な資格情報。
これを行う別の方法は、 users.rb内の2つのメッセージを変更することです。 モデル。
これを十分に強調することはできません。ユーザーに強力なパスワードの入力を要求する 検証コードを作成して、強力なパスワードの基準を満たしているかどうかを確認してください。
これは、ユーザーの列挙を防ぐための最も重要な手順の1つです。
RailsGoatで、 user.rbを開きます ファイルを作成し、クラス定義の直前のコードの最初の行を見つけます:
validates :password,
presence: true,
confirmation: true,
length: {
within: 6..40
},
...
これは、パスワードの長さのみがチェックされるため、パスワードが弱く検証されていることの明確な例です。
解決策は非常に簡単です。次のようないくつかのより強力な要件に対してパスワードを検証します。
- 少なくとも1つの小文字と1つの大文字
- 少なくとも1桁
- 少なくとも10文字。
追加する要件が多いほど、パスワードはより安全になります。押しすぎないように注意してください。プッシュしすぎると、使いやすさとパスワードの回復フローが複雑になる可能性があります。
RailsGoat内でこれを解決するには、lengthプロパティを次のように置き換えるだけです。
:format => {:with => /\A.*(?=.*[a-zA-Z])(?=.*[0-9])(?=.{10,}).*\z/},
次に、サインアップページに移動し、フィールドに入力して、弱いパスワードを入力します。送信すると、次のエラーメッセージが表示されます:
パスワードが無効です。
前回の記事では、XSS攻撃がどのように発生するかを理解することに時間を費やしました。これらは攻撃者が悪意のあるスクリプトを実行できるようにすることで発生するため、document.cookie
などの属性へのアクセスを妨げない限り、セッションCookieから重要な情報が盗まれる可能性があります。 JavaScriptコードで。
WebストレージとCookieの間の論争は、コミュニティ内でしばしば議論されることを忘れないでください。 Webストレージの方が実用的ですが、攻撃者はXSSの脅威から適切に保護しなくても、そこに保存されているオブジェクトに完全にアクセスできます。
次に、HttpOnly
を設定するなど、Cookieを作成するための適切な手順を実行すると、Cookieは少し安全になります。 フラグ。
つまり、セッション情報を保持し、HttpOnly
で設定されるCookie JavaScriptのDocument.cookie
からフラグにアクセスできません API。このように、サーバーのみがそれを受け取ります。
または、Secure
もあります 属性。これにより、リクエストがHTTPS内で発生した場合(HTTP内では発生しない場合)にのみCookieがサーバーに送信されます。これにより、誰かが中間者としてリクエストを盗聴した場合に、リクエストがより安全になります。 。
Railsは、HttpOnly
を使用してすべてのCookieを自動的に設定することにより、一歩を踏み出します。 国旗。これは、知らない開発者がアプリをハッキングするのを防ぐのに役立つため、すばらしいことです。
この例をテストするには、RailsGoatがsession_store.rb
内で明示的に行ったこの機能を無効にする必要があります。 config/initializers
にあるファイル フォルダ。ぜひチェックしてください!
次に、もう一度登録ページに移動し、フィールドに適切に入力して、次の内容を名前に入力します。 フィールド:
<script>
alert(document.cookie);
</script>
フォームを送信すると、次のアラートメッセージとともにユーザーが作成されます。
RailsGoatセッションCookieを公開するアラートメッセージ。
この場合、それは非常に簡単です。HttpOnly
を無効にしないように注意してください。 Railsアプリにフラグを立てます。
したがって、httponly: false
を削除します サーバーを設定して再起動します。同じ操作を実行しようとすると、次のアラートメッセージが表示されます。
空のアラートメッセージ。
公共図書館のコンピューターやLANの家など、安全ではないコンピューターからWebアプリケーションにアクセスしていると想像してみてください。指定された非アクティブ期間の後にアプリケーションが適切にログアウトするように構成されていない場合、セッションは引き続き存在します。
ブラウザのタブを閉じるだけでは、アプリケーションからログアウトするのに十分ではありません。
開発者のコードに共通するもう1つの問題は、フロントエンドであらゆる種類のIDを公開する場合です。ユーザーのIDを非表示の入力またはURLに保持することで、ユーザーがサーバーにさらに何かを要求したときに、作業が楽になるシナリオを考えるのはそれほど難しいことではありません。
ただし、これは盗み攻撃の途中です。
このトピックは、機密情報のセキュリティを確保するために十分な努力を払うという点で、おそらく最も過小評価されているトピックの1つです。
データが常時転送されているか静止しているかにかかわらず、通常のデータを機密データから分離することは非常に重要です。機密データには、クレジットカード番号とコード、パスワード、個人ID番号、またはコンプライアンス法やプライバシー法に関連するもの(EUのGDPRやPCIなど)が含まれます。
それ以外に、アプリケーションが実行されている特定のビジネスエリアに応じて、他のコンプライアンスルールも適用されるかどうかを判断するために地域の法律を参照することが重要です。
この脆弱性の明確な例を次に示します。
- データは何らかの形で暗号化されていますか、それともWebを介してプレーンテキストとして転送されていますか?
- データを暗号化する場合、どのアルゴリズムを使用していますか?最新のタイプの暗号攻撃に対して強力で信頼性がありますか?
- 提供されていない場合、デフォルトの暗号化キーを使用しますか?
- HTTPリクエストが適切なセキュリティヘッダーによって適用されているかどうかを確認しましたか?
最も一般的なシナリオのいくつかを分析してみましょう。
Webアプリケーションをしばらく使用している場合は、MD5メッセージダイジェストアルゴリズムについて聞いたことがある(または使用されている可能性があります)可能性があります。パスワードのハッシュにはまだ広く使用されていますが、非常に弱いことが証明されています。
ここでは、情報のハッシュと暗号化の違いを理解することが重要です。暗号化は、ある種のキーを使用してデータを復号化するときに発生するはずです。ハッシュとは、変換の方法を指します。データをハッシュに変換することはできますが、その逆はできません。
これはあらゆる種類の機密情報に当てはまりますが、MD5はパスワードハッシュで使用されることがほとんど知られています。たとえば、アプリケーションがユーザーの社会保障番号(SSN)を保持している場合は、それらをデータベース内に安全に保存するだけでなく、データがアプリを介して他のデータベース、特にブラウザにどのように送信されるかを確認してください。
これまで見てきたように、RailsGoatはユーザーのパスワードをMD5ハッシュとして意図的に保存します。これはuser.rb内で確認できます モデル:
def hash_password
if self.password.present?
self.password = Digest::MD5.hexdigest(password)
end
end
ユーザーがログインするたびに、アプリは提供されたパスワードをハッシュし、結果が等しいかどうかを確認します。そうしないと、パスワードが一致しないため、エラーがスローされます。
この問題に取り組む方法はたくさんありますが、おそらく最も有名なものの1つは、BCryptが提供するようなソルトハッシュを使用することです。
RailsにはBcryptを処理するためのデフォルトの機能が付属していますが、この目的のために悪名高いlibが広く使用されています:bcrypt-ruby:
gem install bcrypt
モデルをモデルにマッピングすると、パスワードの設定方法とデータベースからの取得方法が定義されます。 libは他のすべてを自動的に適応させます:
require 'bcrypt'
class User < ActiveRecord
include BCrypt
def password
@password ||= Password.new(password_hash)
end
def password=(new_password)
@password = Password.create(new_password)
self.password_hash = @password
end
end
ただし、フローには追加の文字列列(password_hash
)が必要です。 )テーブルでBCryptアルゴリズムのパスワードハッシュを保存します。
このようにして、パスワード値をモデルオブジェクトに直接設定することができ、BCryptがそれを安全にハッシュします。ユーザーの入力と比較するためにパスワードを取得するときにも同じことが起こります。
たとえば、REST APIを使用している場合でも、GraphQLエンドポイントを使用している場合でも、クライアントを機能させるために必要なものだけを返すようにしてください。
JavaScriptクライアントがAPIに情報を要求し、その一部のみを使用する場合、攻撃者がエンドポイントを取得してもう一度呼び出して応答全体を取得したり、プロキシツールでスニッフィングしたりするのを妨げることはありません。
>APIを常に確認して、返される機密情報に関係なく、適切な暗号化と適切な場所でのみ行われることを証明してください。
ユーザーのデータに関しては、機密情報が漏洩しないようにするための安全なメカニズムを作成することが重要です。
users_controller.rb
を開きます api/v1
内のファイル フォルダ。そこで、次の方法が見つかります:
def show
respond_with @user.as_json
end
単純なことですが、Webクライアントからアクセスすると、このエンドポイントは、パスワードを含め、応答内に入力されたすべてのユーザーのフィールドを返します。
user
だけでなく モデルだけでなく、機密情報を保持する他のモデルにも、APIに表示される属性を選択する方法が必要です。
幸いなことに、Railsはそれに対処するための非常に簡単な方法を提供します。 as_json
をオーバーライドしてみましょう 次の方法:
def as_json
super(only: [:id, :email])
end
現在、デフォルトですべてを公開するのではなく、必要なデータのみで応答しています。モデルごとに、必ず重要なフィールドを選択し、同じ経験則を適用してください。
今日、私たちは認証の破綻と機密データの漏洩の水域をナビゲートしました。これらのルールに従うことで、ユーザーとクライアントにとってはるかに安全なアプリケーションを確実に保証できます。
さらに、公式のRubyonRailsセキュリティドキュメントを確認することの重要性は強調しすぎることはありません。そこでは、セッションハイジャック、ストレージメカニズム、および可能な限り最善の方法でデータを暗号化するための戦略に関する詳細情報を見つけることができます。
次の停車駅でお会いしましょう!
-
データに対するマルウェアやセキュリティの脅威から PC を保護
マルウェアと ID の盗難は、PC ユーザーに不安な夜を与えてきた最も重要な問題の 1 つです。一部のユーザーは、PC の使用を完全に停止することに決めたほど恐怖に陥っています。ただし、コンピューターを使用しないことやオフラインのままでいることは解決策ではなく、むしろ問題を回避することになるため、お勧めできません。これらの問題を詳細に理解し、マルウェアからの保護と、PC 上のデータや情報に対する脅威を克服する方法について学びましょう。 マルウェアとは 悪意を持って開発されたソフトウェアはすべてマルウェアです。ウイルス、トロイの木馬、ランサムウェア、スパイウェアなど、実行するように設計され
-
DU ウイルス対策セキュリティ アプリがユーザー データを盗む
DUウイルス対策セキュリティが Play ストアに戻ってきました! Google Play ストアから削除されましたが、復元された理由は何ですか? 疑問に思う前に、全体について説明しましょう。 DU Antivirus Security アプリは、最も人気のあるモバイル アンチウイルス アプリの 1 つです。アプリがハンドラーのスマートフォンからデバイス データを密かに蓄積していたことをセキュリティ会社 Check Point が明らかにした後、アプリ ストアから削除されました。 DU Antivirus Security アプリは DU Group によって作成されました。 Play ス