認証の不備と安全でないデシリアライゼーション
脆弱なセッション管理、クレデンシャルスタッフィング、安全でないデシリアライゼーションの脆弱性によって、攻撃者がアカウントを乗っ取りコードを実行できる仕組みを学びます。
「認証の不備と安全でないデシリアライゼーション」はCoddyKit上の無料Security+ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSecurity+ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Security+ Academyコースには全4レッスンが含まれています。
認証の不備とは
認証の不備とは、アプリケーションがユーザーの身元を確認し、セッションを管理する方法に存在する弱点を指します。認証が適切に機能していない場合、攻撃者はパスワード、鍵、セッショントークンを侵害して、他のユーザーになりすますことができます。このOWASP Top 10のカテゴリには、弱い認証情報、不適切なセッション管理、MFAの欠如、安全でない認証情報の保存など、幅広い脆弱性が含まれます。
認証情報スタッフィングとパスワードスプレー
認証情報スタッフィングは、過去のデータ侵害で流出したユーザー名とパスワードの組み合わせを大量に使い、パスワードの使い回しを悪用して他のサイトでも試行します。パスワードスプレーは反対に、少数のよく使われるパスワード(例:Password1!)を多数のアカウントに対して試し、アカウントロックアウトのしきい値に達するのを避けます。どちらの攻撃も、弱いパスワードポリシーとMFAの欠如を原因として成功します。
# Password spraying concept (defensive awareness)
# Attacker tries 'Password1!' against 10,000 accounts
# rather than trying 10,000 passwords against 1 account
# This avoids triggering lockout policies (e.g., 5 attempts/account)
# Defense: MFA + adaptive authentication + rate limiting脆弱なセッション管理
セッションは、認証済みユーザーとアプリケーションの状態を結び付けます。脆弱なセッション管理の問題には、予測可能なセッショントークン値(攻撃者が推測できる連番ID)、有効期限のないトークン、HTTPSではなくHTTP経由で送信されるトークン、ログアウト時にトークンを無効化しないことなどがあります。有効なセッショントークンを入手した攻撃者は、パスワードを知らなくてもユーザーになりすますことができます。
# Signs of weak session management:
# /login response sets:
# Set-Cookie: session=1042 (predictable, sequential)
# Missing: Secure; HttpOnly; SameSite flags
# Missing: session expiry / Max-Age
# Logout does NOT invalidate server-side sessionセッション固定攻撃とセッションハイジャック
セッション固定攻撃は、攻撃者が選んだセッションIDを被害者に使用させます。たとえば攻撃者が、あらかじめ設定したセッションCookie付きのリンクを送信し、被害者が認証した後、同じセッションIDを使ってアカウントにアクセスします。セッションハイジャックは、XSS、ネットワークスニッフィング(暗号化されていない接続上)、または盗まれたCookieによって既存のセッショントークンを窃取します。対策は、ログイン後にセッションIDを再生成し、あらゆる通信でHTTPSを使用することです。
安全でないパスワード保存
パスワードを平文や弱いハッシュ(MD5、SHA-1)で保存することは、重大な認証上の不備です。データベースが侵害されると、平文のパスワードや弱いハッシュは直ちに悪用できます。安全なパスワード保存には、パスワード専用に設計された適応型ハッシュアルゴリズム、つまり、ユーザーごとにランダムなソルトを使用するbcrypt、Argon2、またはPBKDF2が必要です。これらのアルゴリズムは意図的に処理速度が遅く設計されており、オフラインでのクラックに大きな計算コストをかけさせます。
# Python example — secure password hashing with bcrypt
import bcrypt
# Hash a password (includes random salt automatically)
password = b'UserSuperSecret123'
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))
# Verify
bcrypt.checkpw(password, hashed) # returns True安全でないデシリアライゼーションとは
シリアライゼーションは、保存や送信のためにオブジェクトの状態を形式(JSON、XML、バイナリ)へ変換します。デシリアライゼーションは、その形式からオブジェクトを再構築します。安全でないデシリアライゼーションは、アプリケーションが攻撃者に制御されたデータを検証せずにデシリアライズすると発生します。攻撃者はシリアライズされたオブジェクトを改変して、アプリケーションロジックの操作、権限昇格、サーバー上での任意コード実行を可能にします。
デシリアライゼーション攻撃の例
一般的な攻撃パターンでは、シリアライズされたオブジェクトがCookieやAPIパラメーターを通じて渡されます。たとえば、Javaアプリケーションが信頼できないデータに対してObjectInputStream.readObject()を使用すると、一般的なライブラリ(Apache Commons Collections)のガジェットチェーンを通じてリモートコード実行(RCE)を引き起こす可能性があります。攻撃者は悪意のあるシリアライズ済みペイロードを作成してアプリケーションに送信し、デシリアライゼーション中にコードを実行させます。多くの場合、これは認証チェックが実行される前に起こります。
# Insecure deserializing pattern (Python pickle — dangerous)
import pickle
# Attacker-controlled payload
class Exploit:
def __reduce__(self):
import os
return (os.system, ('id',)) # executes 'id' on server
payload = pickle.dumps(Exploit())
pickle.loads(payload) # RCE! Never deserialize untrusted data with pickle安全でないデシリアライゼーションの防止
安全でないデシリアライゼーションへの対策には、JavaのネイティブシリアライゼーションやPythonのpickleなどの危険な形式で信頼できないデータを決してデシリアライズしないことが含まれます。バイナリシリアライゼーションよりも、データのみを扱う形式(JSON、XML)を優先してください。デシリアライゼーションが必要な場合は、完全性チェック(シリアライズされたオブジェクトへのHMAC署名など)を実装し、デシリアライズ可能なクラスを制限する許可リストを使用し、デシリアライゼーションのコードを隔離された低権限環境で実行してください。
# Safe approach: sign serialized data before transmitting
import hmac, hashlib, json
def serialize_safe(data, secret):
payload = json.dumps(data) # use JSON, not pickle
sig = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
return payload + '.' + sig制御策としての多要素認証
多要素認証(MFA)は、認証の不備に対する単一の制御策として最も大きな効果があります。フィッシング、認証情報スタッフィング、データベース侵害などによって認証情報が漏えいしても、2つ目の要素を持たない攻撃者は認証できません。Microsoftの報告によると、MFAは自動化されたアカウント侵害攻撃の99.9%超をブロックします。特権アカウントではMFAを必須とし、すべてのユーザーに利用を推奨する必要があります。
アカウントロックアウトとレート制限
アカウントロックアウトポリシーは、ログインに一定回数失敗するとアカウントを一時的に無効化し、ブルートフォース攻撃を遅らせます。ただし、ロックアウトによって正規ユーザーに対するサービス拒否が可能になる場合があります。攻撃者が意図的にロックアウトを発生させ、アクセスを妨害できるためです。レート制限(失敗が繰り返された場合に指数バックオフを使用して応答を遅くすること)やCAPTCHAチャレンジを使うと、DoSのリスクを抑えながらブルートフォース攻撃を軽減できます。
OWASP Top 10における認証の不備
OWASPは、認証の欠陥が一般的で影響も大きいことから、認証の不備を重大なリスクとして挙げています。認証の不備を示す主な兆候には、クレデンシャルスタッフィングなどの自動化攻撃を許していること、ブルートフォース攻撃やその他の自動化攻撃を許していること、デフォルト・脆弱・広く知られたパスワードを許していること、脆弱な認証情報回復プロセスを使用していること、平文または脆弱なハッシュ化パスワードを使用していること、多要素認証がない、または有効に機能していないことが含まれます。
クイックチェック
このレッスンで扱ったCompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、認証の不備には脆弱なセッション、クレデンシャルスタッフィング、安全でないパスワード保存が含まれること、安全でないデシリアライゼーションにより、悪意のあるシリアライズ済みオブジェクトを介したRemote Code Executionにつながる可能性があること、そしてMFA、bcryptによるパスワードハッシュ化、ログイン後のセッション再生成、署名付きシリアライズデータが重要な防御策であることを学びました。次は、安全なSDLC、SAST、DASTツールについて学びます。
よくある質問
「認証の不備と安全でないデシリアライゼーション」レッスンは無料ですか?
はい。「認証の不備と安全でないデシリアライゼーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Security+ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Security+ Academyコースには全4レッスンが含まれています。
「認証の不備と安全でないデシリアライゼーション」で何を学びますか?
脆弱なセッション管理、クレデンシャルスタッフィング、安全でないデシリアライゼーションの脆弱性によって、攻撃者がアカウントを乗っ取りコードを実行できる仕組みを学びます。 ブラウザで直接実行するハンズオンコードでSecurity+ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Security+ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSecurity+ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「認証の不備と安全でないデシリアライゼーション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSecurity+ Academyレッスンでコードを書いて実行できますか?
はい。すべてのSecurity+ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SQLインジェクションとコマンドインジェクション
- クロスサイトスクリプティング(XSS)とCSRF
- 認証の不備と安全でないデシリアライゼーション
- セキュアSDLC、SAST、DASTツール