みなさんこんにちは。
カットの下には、ジェフ・アトウッドによる記事の翻訳があります。そこでは、
Common Weakness Enumerationからの最も危険なプログラミングエラーの25を彼のコメントとともにリストしています。
すぐに言いたいです。 そこにリストされている間違いのほとんどはよく知られており、多くの人の口を埋めました。 それにもかかわらず、私たちは何度も何度も同じレーキを踏んでいます。 そして私も含めて。
あらゆる能力で開発している場合は、少なくともこのリストを斜めに読んでください。 何かに不慣れな場合や興味を引く場合は、リンクをクリックして詳細な説明をご覧になることをお勧めします(英語)
- 入力検証が不十分です
入力が正しいことを確認してください。 数字が必要な場合は、文字を使用しないでください。 同様に新しい車の価格はドルに等しくすることはできません。 不正な入力検証は、攻撃者が予期しない方法で入力を変更する可能性がある脆弱性につながる可能性があります。 今日知られている最も一般的な脆弱性の多くは、回避するか、少なくとも厳密な入力検証によって減らすことができます。
- 出力の不適切なエンコードまたはシールド
不十分な出力コーディングは、ほとんどのインジェクションベースの攻撃の根本にあります。 攻撃者は、他のコンポーネントに送信する必要のあるコマンドを変更できます。これにより、アプリケーションが完全に侵害される可能性があります。攻撃者が直接実行できない他のコンポーネントでエクスプロイトを実行することについては話していません。 プログラムがクエリなどの構造化されたメッセージの形式で他のコンポーネントの出力を生成するとき、管理情報とメタデータがデータ自体から分離されていることを確認してください。
- SQLクエリの構造違反(別名「SQLインジェクション」)
攻撃者がデータベースに送信するSQLに影響を与えることができる場合、クエリを変更して、データベース内のデータを盗んだり、破損したり、変更したりできます。 SQLクエリを使用してセキュリティ(認証など)を管理する場合、攻撃者はこれらのクエリのロジックを変更し、保護をバイパスできます。
- Webページの構造違反(別名「クロスサイトスクリプティング」、「XSS」)
クロスサイトスクリプティング(XSS)はHTTP結合の結果であり、その性質上、状態、HTMLのデータとスクリプトの混合、Webサイト間で転送される大量のデータ、多様なコーディングスキーム、および多機能Webブラウザーは保持されません。 十分に注意しないと、攻撃者はアプリケーションが生成するページにJavascriptまたはその他のブラウザー実行可能コードを挿入できます。 次に、あなたのページは、ブラウザがこの詐欺的なスクリプトをあなたから来たように実行する他のユーザーによって訪問されます-結局、それは本当にあなたから来たからです! 予想外に、あなたのウェブサイトはあなたが書いていないコードを提供します。 攻撃者は、さまざまなトリックを使用してそのようなコードをサーバーに直接注入したり、疑いを持たない被害者を仲介者として使用したりできます。
- OSコマンドの構造違反(別名「OSコマンドの注入」)
プログラムは、ネットワーク上の部外者とオペレーティングシステムの内部との間の橋のように機能します。 オペレーティングシステムで別のプログラムを実行し、疑わしいパラメーターをコマンドラインに転送できるようにする場合、攻撃者をオペレーティングシステムに招待します。
- クリアテキストメッセージング
ネットワークを介して送信される情報は、最終的な目標に至るまでに多くの異なるノードを通過します。 プログラムが重要な個人情報または認証情報を送信する場合、注意してください。攻撃者は途中でそれを傍受することができます。 必要なのは、最終的な目的地に向かう途中のノードの1つ、中継ノードの同じサブネット内のノード、またはアクセス可能なインターフェイスに接続することです。 Base64またはURLエンコーディングでトラフィックを難読化しても、保護は提供されません。
- クロスサイトリクエストフォージェリ(XSRF)
クロスサイトリクエストフォージェリとは、だれからもパッケージを受け取る方法です。ただし、攻撃者はユーザーにサイトへのHTTPリクエストをアクティブ化するように強制します。 ユーザーは、リクエストが送信されたことに気付かない場合もありますが、サーバーに到達すると、攻撃者ではなくユーザーが送信されたように見えます。 攻撃者は正当なユーザーになりすまして、ユーザーが持つすべての可能な権利を受け取ります。 これは、ユーザーが管理者権限を持ち、アプリケーションの機能を完全に損なう場合に特に効果的です。
- 競合状態
競合状態は、攻撃者がそのうちの1つを完全に制御できる複数のプロセスを意味します。 攻撃者はこのプロセスを使用して、カオス、衝突、またはエラーを作成します。 影響は、レースの状態(変数の状態やセキュリティロジックなど)に影響を与えるものに応じて、ローカルまたはグローバルに発生する可能性があり、複数のスレッド、プロセス、またはシステム間でも発生します。
- エラーメッセージによる情報漏洩
過度に「おしゃべりな」エラーメッセージは、プログラムを悪用する攻撃者に秘密を明かす可能性があります。 これらの秘密は、個人情報、認証データ、サーバー構成など、広範囲の機密データをカバーできます。 このデータは、プログラムをインストールするための完全なパスなど、ユーザーや管理者にとって便利な無実の秘密のように見えるかもしれませんが、これらの小さな秘密でさえ、より計画的な攻撃を簡素化できます。
- メモリバッファの境界での操作の制御違反
何十年にもわたるCアプリケーションの惨事、バッファオーバーフローは絶滅に対して非常に抵抗力があります。 攻撃と検出の方法は改善され続けており、今日のバッファオーバーフロー方法は一見しただけでは明らかではありません。 Cよりも高レベルの言語でコードを記述するため、バッファオーバーフローから完全に保護されていると想定できます。しかし、お気に入りの「安全な」言語のインタプリタは何で書かれていますか? あなたが呼ぶネイティブコードはどうですか? オペレーティングシステムAPIはどの言語で書かれていますか? インターネットインフラストラクチャを提供するプログラムについてはどうですか?
- 重要なステータスデータの外部監視
攻撃者が変更できる場所にユーザー状態データを保存すると、侵害されやすくなります。 データは、構成ファイル、.profiles、cookie、非表示フォームフィールド、環境変数、レジストリキー、または攻撃者が変更できる他の場所に保存できます。 HTTPなどのステートレスプロトコルでは、いくつかの形式のユーザー状態情報が各要求で傍受される可能性があります。つまり、攻撃者に不必要に開かれています。 このデータに基づいてセキュリティクリティカルな操作を実行すると、誰かがこのデータを変更してアプリケーションを裏切る可能性があります。
- ファイル名またはパスの外部制御
入力されたデータを使用してファイル名を作成すると、結果のパスが意図しないフォルダーを指す場合があります。 攻撃者は、いくつかの「..」または同様のシーケンスを組み合わせて、制限されたディレクトリから逃れることができます。 他のファイル関連の攻撃は、シンボリックリンクのクリックなど、ファイル名の外部制御によって簡素化されます。これにより、攻撃者が直接アクセスできないファイルをアプリケーションが読み取りまたは変更することになります。 アプリケーションが昇格された特権で実行され、入力としてファイル名を受け入れる場合にも同じことが当てはまります。 同様のルールがURLアドレスに適用され、部外者が任意のアドレスを指定できるようにします。
- 信頼できない検索パス
アプリケーションは、コードライブラリや構成ファイルなどの重要なリソースの検索パス(または作業パス)を提供するという点で、ユーザーまたは環境に依存します。 検索パスが攻撃者の制御下にある場合、攻撃者が選択したリソースを指すように検索パスを変更できます。
- 制御されていないコード生成(コードインジェクション)
動的に生成されたコードのセクシュアリティを否定することは間違いなく困難ですが、攻撃者はそれがそれほど魅力的でないことを発見します。 外部入力データが実行されるコードに影響する場合、またはこのデータがコード自体に直接挿入される場合、不正な参加者がコードを直接呼び出すことができる場合、深刻な脆弱性が発生します。
- 整合性チェックなしのコードのダウンロード
コードをダウンロードして実行すると、このコードのソースは不正ではないと考えられます。 しかし、攻撃者は、このコードが届く前に変更できます。 ダウンロード元のサイトをハッキングしたり、DNSスプーフィングやキャッシュポイズニングでシミュレートしたり、別のサイトにリダイレクトするようにシステムを説得したり、ネットワークの途中でコードを変更したりできます。 このシナリオは、独自の製品が更新をダウンロードおよびインストールする場合でも適用されます。
- リソースの不適切な閉鎖または解放
システムリソースが「寿命の終わり」に達すると、メモリ、ファイル、Cookie、データ構造、セッション、通信チャネルなどのリソースがなくなります。 すでにそれらを削除したと考えている場合、攻撃者は間違ったクロージャーを使用してこれらのリソースの制御を維持できます。 攻撃者は重要なデータを探すためにそれらをふるいにかけることができます。 また、これらのリソースを理論的に再利用することもできます。
- 誤った初期化
データと変数を正しく初期化しないと、攻撃者がそれらを初期化したり、過去のセッションから残っている重要な情報を取得したりする可能性があります。 これらの変数が、認証の決定など、セキュリティが重要な操作で使用される場合、保護をバイパスするように変更できます。 これが、奇妙なエラーや条件の下でコードが突然初期化をスキップする最も可能性の高い理由です。
- 誤った計算
攻撃者が数値計算の入力を制御すると、数学的エラーがセキュリティに影響する可能性があります。 必要以上に多くのリソースを割り当てたり、大幅に少ないリソースを割り当てたりすることができます。 これらは、ビジネスロジック(負の価格を返す計算)に違反するか、サービス拒否(ゼロによる除算、プログラムのクラッシュにつながる)を引き起こす可能性があります。
- 不適切なアクセス制御(承認)
アプリケーションのユーザーが許可されていることだけを実行していることを確認しないと、攻撃者は間違った認証を使用し、不正な機能を使用しようとします。
- ハッキングまたは危険な暗号化アルゴリズムを使用する
自作の暗号化は、攻撃者への招待です。 暗号化は複雑です。 独創的な数学者やコンピューターの専門家が彼女にフレットを与えることができなければ-そして彼らは定期的に彼ら自身の方法を時代遅れだと認識し-あなたは成功しないでしょう。
- ハードコードされたパスワード
アプリケーションのコードに秘密のアカウントとパスワードを書くことは非常に便利です-熟練したアナリストにとって。 すべてのアプリケーションでパスワードが同じである場合、そのパスワードが必然的に知られるようになると、各クライアントは脆弱になります。 また、コードにハードコードされているため、修正するのは大きな頭痛の種です。
- 重要なリソースへの安全でないアクセス許可の割り当て
デフォルトでは、重要なプログラム、データウェアハウス、読み取り可能なアクセス許可を持つ構成データに注意してください。 この問題は、実装または開発中に考慮されない場合がありますが、考慮する必要があります。 あなたの顧客にあなたのアプリケーションを安全にすることを要求しないでください! すぐにデフォルトのセキュリティを提供するようにしてください。
- 不十分なランダム値の使用
たとえば、セッション識別子や一時ファイル名を生成するときなど、気付いていないときでもチャンスに頼ることができます。 擬似乱数ジェネレータ(PRNG)はどこでも使用されますが、多くのことがうまくいかない可能性があります。 攻撃者は、使用されているアルゴリズムを特定できると、比較的少ない試行回数で攻撃を成功させるのに十分な頻度で次の乱数を推測できます。
- 不要な権限で実行
特定の操作を実行するには、プログラムに特別な特権が必要な場合があります。 必要以上にこれらの特権を所有することは危険です。 追加の特権で作業する場合、アプリケーションは、アプリケーションのユーザーが直接使用できないリソースにアクセスできます。 昇格した特権で個別のプログラムを実行するたびに、攻撃者は理論的にこれらの特権を使用する可能性があります。
- クライアント側サーバーのセキュリティ
サーバーに代わってクライアントがセキュリティチェックを実行することを信頼しないでください。 攻撃者はアプリケーションを分析し、独自のクライアントを作成できます。 結果は、セキュリティチェックが何を保護するかによって異なりますが、主な目標は認証、承認、および入力検証です。
もちろん、ここには本当に新しいものは何もありません。 私は、ほぼ2年前にSins of Software Securityの同じコアリストを真剣に歩きました。 Webアプリケーションがメインスレッドで優勢になり始めるため、違いは相対的な優先順位のみです。
アプリケーションセキュリティエラーリストは、McConnellの従来の開発エラーリストと同じ目的を果たします。意識を高めます。 成功の驚くほど大きな部分は、最も一般的なエラーと障害状態を認識することにあります。 したがって、少なくとも理論上は、プロジェクトがそれらの1つに向かっていることを認識できます。 無知は、ソフトウェアプロジェクトの最悪の殺人者です。
翻訳とタイポグラフィで私を助けました:
彼らに感謝します。