脆弱性と弱点の違い:アプリケーションセキュリティの基本を理解する
2023年11月17日
0 分で読めますシステムやデータの安全を確保するには、脆弱性と弱点を明確に理解することが欠かせません。ソフトウェアやテクノロジーに潜む脆弱性は、重大なリスクをもたらす可能性があります。脆弱性は、悪意ある攻撃者が侵入するための経路になり得ます。では、脆弱性とは何でしょうか。また、弱点とはどのように異なるのでしょうか。
機密性の高いユーザーデータを保護するために、強力な暗号化アルゴリズムを使用するウェブアプリケーションを想像してみてください。しかし、コーディングミスによって暗号鍵がアプリケーションのソースコードにハードコードされていると、コードを調べる人なら誰でも簡単に鍵へアクセスできてしまいます。
あるいは、同様のアプリケーションで、古く安全でないMD5のような脆弱な暗号化アルゴリズムを使用しているとします。この場合、攻撃者はMD5で暗号化されたパスワードを時間をかけて解読できる可能性があり、パスワード関連の侵害に対するシステムの脆弱性が高まります。
どちらのケースにもセキュリティ上の問題があります。ただし、1つ目はコードに即時に悪用可能な欠陥があるため脆弱性にあたり(ヒント:シナリオ1)、2つ目は安全でない暗号化アルゴリズムの使用に起因する弱点で、将来の攻撃を受けやすくします(ヒント:シナリオ2)。
アプリケーションセキュリティにおいて、脆弱性と弱点の違いを理解することは極めて重要です。この違いを把握すれば、開発者は弱点を特定して悪用される前に対処し、潜在的な脆弱性を未然に防いで、より安全なアプリケーションを実現できます。一方、脆弱性を理解することで、既知の問題に修正を適用し、今後の悪用を事後的に防ぐことができます。
脆弱性を理解する
セキュリティ脆弱性とは、ソフトウェアコードの欠陥や、Log4Shellのようなシステムの設定ミスを指します。攻撃者がこれを利用すると、システムやネットワークに不正に直接アクセスできる可能性があります。
脆弱性とは、システムの設計、実装、運用、内部統制に存在し、システムのセキュリティポリシーに反する行為に悪用される可能性がある欠陥や弱点です。ソフトウェア開発では、通常、悪意ある攻撃者に悪用される可能性のあるコーディングミスや記述漏れが脆弱性の原因となります。
たとえば、ウェブアプリケーションでよく見られる脆弱性にSQLインジェクションがあります。これは、適切な検証やエスケープ処理を行わずにユーザー入力をSQLクエリに含めることで発生し、攻撃者によるクエリの改ざんを可能にします。
上記のPythonコードスニペットでは、攻撃者が`userName`変数にSQLコマンドを挿入し、不正アクセスやデータ損失を引き起こす可能性があります。
脆弱性はどのように悪用されるのか?
脆弱性は、悪意ある攻撃者によってさまざまな方法で悪用されます。
たとえば、よくある方法の1つがコードインジェクションです。これは、ユーザー入力を適切に検証またはフィルタリングしないシステムに、攻撃者が悪意あるコードを入力する手法です。その結果、SQLインジェクション攻撃、バッファオーバーフロー、クロスサイトスクリプティング(XSS)攻撃などが発生し、攻撃者がシステムの機能やデータを操作、侵害する可能性があります。
さらに攻撃者は、脆弱な認証情報や初期設定の認証情報を利用したり、パッチ未適用のソフトウェアを悪用したり、ソーシャルエンジニアリングの手法を用いたりして、システムに不正アクセスすることもあります。
こうした手口を理解することは、脆弱性の悪用からシステムを守るうえで不可欠です。
Snykでゼロデイ脆弱性に備える
Snykを活用して開発者がゼロデイ脆弱性をより迅速に修正し、リスクと攻撃にさらされる範囲を低減する方法をご覧ください。
脆弱性とアプリケーションセキュリティ
アプリケーションセキュリティにおける脆弱性の役割を理解することは、ソフトウェアアプリケーションに潜むリスクや脅威を把握するうえで非常に重要です。脆弱性にはさまざまな形があり、攻撃者がアプリケーション内のデータのセキュリティ、完全性、機密性を侵害するための侵入口となります。アプリケーションのセキュリティを強化するには、攻撃者に悪用される一般的な脆弱性を特定し、防御することが不可欠です。
Snykでは、セキュリティを重視するすべての開発者がOWASP Top 10に精通すべきだと考えています。アプリケーションを悪意ある攻撃者から守るため、Snyk Learnで詳しく解説しています。セキュリティを重視する開発者を支援するため、Snyk Top 10 Open Source Vulnerabilitiesも公開しました。
(OWASPのように分類するのではなく、特定の脆弱性の種類を取り上げている点にご注意ください。)
サービス拒否: | サービス拒否(DoS)攻撃は、標的に大量のリクエストを送り、処理しきれない状態にすることで、ネットワークやサーバーへのアクセスを停止させます。GoogleやAWSも大規模なDoS攻撃を受けたことがありますが、この種の攻撃は大手クラウドプロバイダーだけが標的になるわけではありません。 |
リモートコード実行: | 攻撃者が、本来アクセスできないリモートシステムからコマンドを実行できる場合に発生する攻撃です。RCEはいくつかの方法で発生し、マルウェアの使用や、パッチ未適用の脆弱なライブラリの悪用などが含まれます。この脆弱性により、攻撃者は自身のコードをサーバーやアプリケーション上で実行し、これらを悪用できるようになります。 |
信頼できないデータのデシリアライズ: | アプリケーションが信頼できないデータをデシリアライズする際に、生成されるデータの妥当性を十分に検証しないと、攻撃者が実行状態や実行フローを制御できる可能性があります。Javaのデシリアライズ脆弱性は、悪意あるユーザーが改ざんしたシリアライズ済みオブジェクトをシステムに挿入し、システムやデータを侵害しようとしたときに発生します。 |
SQLインジェクション: | アプリケーションがユーザー入力を検証せずに受け取り、データベースに渡して処理させることで発生する脆弱性です。攻撃者は、信頼できないデータをデータベースクエリに追加できるようになります。たとえば、ウェブフォームへの入力を通じたSQLインジェクションにより、攻撃者は価値あるデータの窃取、認証の回避、レコードの改ざんを目的とした入力を作成できます。 |
プロトタイプ汚染: | この脆弱性はJavaScriptに影響し、オブジェクトなどの既存のJavaScript言語構造やプロトタイプにプロパティを挿入できることを指します。JavaScriptでは、すべてのObject属性を変更できます。攻撃者は別の値を挿入して属性を操作し、ベースオブジェクトのプロトタイプを上書きして、JavaScriptアプリケーションのオブジェクトを汚染します。 |
安全でない一時ファイル | 安全でない一時ファイルとは、文字どおり安全でない一時ファイルのことです。この種の脆弱性では、機密情報を含む一時ファイルが不適切な権限で作成されたり、適切な権限設定のないフォルダーに保存されたりします。これは、OWASPが「アクセス制御の不備」と呼ぶ脆弱性に分類されます。 |
ディレクトリ/パストラバーサル | ディレクトリトラバーサル(パストラバーサルとも呼ばれます)攻撃は、本来の対象フォルダー外に保存されたファイルやディレクトリへのアクセスを狙います。「dot-dot-slash(../)」の文字列やそのバリエーションを使ってファイルを操作したり、絶対パスを指定したりすることで、アプリケーションのソースコード、設定ファイル、その他の重要なシステムファイルを含む、ファイルシステム上の任意のファイルやディレクトリにアクセスされる可能性があります。 |
正規表現によるサービス拒否(ReDoS): | 正規表現によるサービス拒否(ReDoS)脆弱性は、DoS攻撃の一種です。正規表現(regex)は非常に強力ですが、直感的に扱いにくく、攻撃者がサイトを停止させやすくなることがあります。この攻撃では、無効な正規表現を大量に処理させ、標的サーバーの動作を遅延させます。 |
権限昇格: | 権限昇格は、アクセス制御の不備による脆弱性です。攻撃者がアクセス制御を回避し、リソースに対する権限を引き上げます。 |
NULLポインタ参照: | 最後に、NULLポインタ参照は、Snykのスキャンで見つかった重大度の高い、または重大な脆弱性のうち、発見頻度が10番目に高いものでした。また、Goで最も多く見つかった重大度の高い、または重大な脆弱性であり、CおよびC++でも特によく見られる脆弱性の1つです。この脆弱性は、アプリケーションが有効な値を期待してポインタを参照しようとした際に、代わりにnull値が見つかることで発生し、クラッシュを引き起こします。このクラッシュがサービス拒否の問題につながります。 |
こうした一般的な脆弱性とソフトウェア開発における発生状況を理解することで、開発者や組織はセキュリティ対策やベストプラクティスを先回りして導入し、潜在的な脆弱性や脅威からアプリケーションを保護できます。
弱点を理解する
弱点とは、実際に悪用された事例が特定されていなくても、システムのセキュリティを低下させる具体的な問題です。つまり、弱点は潜在的な脆弱性を表します。
弱点の典型例は、パスワード保護に脆弱または安全でない暗号化アルゴリズムを使用することです。これが直ちに悪用につながるわけではありませんが、アプリケーションはブルートフォース攻撃やパスワード解読攻撃を受けやすくなります。
上記のJavaコードでは、パスワードのハッシュ化にMD5を使用しています。MD5は脆弱で古いハッシュアルゴリズムであり、簡単に解読できるため、これは弱点とみなされます。
弱点はどのように悪用されるのか?
脆弱性と弱点は異なる概念ですが、どちらも悪用され得るという点で密接に関連しています。システムに弱点があっても、それが脆弱性に分類されるとは限りません。しかし、攻撃者がその弱点を悪用する方法を見つけると、脆弱性になります。
弱点とアプリケーションセキュリティ
アプリケーションセキュリティは、ソフトウェア開発に欠かせない要素です。ソフトウェアアプリケーションと、そこで処理されるデータをさまざまな脅威や脆弱性から守ることを指します。セキュリティ対策を強化するには、潜在的な弱点を理解することが重要です。
安全なソフトウェアやアプリケーションを提供するには、アプリケーションセキュリティ評価が欠かせません。アプリケーションの現在のセキュリティ状況を把握していなければ、組織のどこに弱点があるのか、将来の攻撃に対してどこが脆弱なのかを判断することは困難です。
脆弱性と弱点の違いとは?
弱点も脆弱性も、セキュリティリスクがあることを示す状態です。
アプリケーションの弱点とは、悪意ある行為につながる攻撃に悪用され、脆弱性を引き起こす可能性のあるエラーやバグです。弱点と脆弱性を分けるのは、実際に悪用可能にする特定のペイロードが存在するかどうかです。悪用方法が確認されると、脆弱性が確定し、アプリケーションのセキュリティリスクが高まります。弱点が緊急性の高い脆弱性になる前に対処することがベストプラクティスです。
脆弱性と弱点の特定・修正
追跡すべき脆弱性が数多くあり、新たな脆弱性も絶えず生まれる中、組織は問題が手に負えなくなる前に対処できる適切な手順とプロセスを整えておく必要があります。その重要な要素が脆弱性評価です。
脆弱性評価とは、システムに存在するセキュリティ上の弱点や欠陥を継続的に評価することです。このプロセスでは、弱点や既知の潜在的な脆弱性、それらの関連性、システムや環境への影響を確認します。
たとえば、次のような方法があります。
静的アプリケーションセキュリティテスト(SAST)は、ソースコードにアクセスできるホワイトボックステスト手法です。脆弱性につながる可能性のある弱点を特定し、レポートを作成できます。
ペネトレーションテストは、外部からシステムに侵入する倫理的なテストです。攻撃者がシステムや組織を侵害しようとする手口をシミュレーションし、セキュリティ上の弱点や脆弱性を特定します。
セキュアなコードレビューは、コードの空白や命名の誤りをチェックし、既知の標準関数と照合する自動化ツールです。一方、手動レビューではコードのスタイルや意図、機能上の出力を評価します。セキュリティコードレビューでは、開発者のコードが堅牢なセキュリティを備えているかを確認します。セキュアなコードレビューを行えば、弱点が脆弱性になる前に特定できます。
朗報です。静的アプリケーション・セキュリティ・テスト(SAST)ツール(Snyk Codeなど)を活用すれば、コードレビューに入る前に弱点や脆弱性を検出できます。
Snykで脆弱性や弱点に先手を打つ
セキュアな製品を開発するには、脆弱性を継続的に評価することが不可欠です。
脆弱性評価ツールを活用すれば、脆弱性の評価プロセスを効率化し、コードの脆弱性を修正できます。適切なツールを選ぶことで、悪意ある攻撃者に一歩先んじることができます。
Snykを使えば、開発ライフサイクル全体を通じて、コードやオープンソースの依存関係に潜む脆弱性を自動的に検出・優先順位付けし、修正できます。
開発者で、さらに学びたい方はSnyk Learnをご覧ください。さまざまな言語やエコシステムにおける脆弱性を扱うインタラクティブなレッスンを通じて、安全な開発方法を学べます。
たとえば、次の学習モジュールをご覧ください。
開発を加速するアプリケーションセキュリティ
Snykのアプリケーションセキュリティソリューションについて詳しく知るか、開発者向けセキュリティツールのバイヤーズガイドをご覧ください。