どのようにすることができます確保のたセキュアコーディングテスト駆動開発?
-
27-10-2019 - |
質問
って来るまでの速度の最新動向と開発の実務経験(TDD).の開発いはCまたはC++.で襲いがあることも明らかな紛争という共通テスト駆動開発の実践と共通セキュアコーディングです。でも、心TDD伝えすることなくコードもいらっしゃらない失敗を試験します。私は、そんな安全コードの場合を除いてユニット試験が私のコードを安全に行うことができます。
いる二つの問題:
どのようにしたいという書単位試験の試験のためのバッファが溢れる、スタックの超過、ヒープ超過,配列インデックスエラー、フォーマット文字列バANSI vs Unicode対MBCS文字列のサイズmistmatches、安全で文字列処理からハワードおよびLeBlancの"文書のドメイン")?
どの時点での標準テスト駆動開発の実践これらの実験から多くの安全保障があります。
驚くのは、なんでも研究論TDDできます。もう来ているテスト駆動開発のた論文も非常に高いレベルにあるTDDます"をコードを確保しております。"
かメールでお問への回答の問題、他の研究属す(っていなく、任意の場所るTDDグライブで行けをノックエンド(仮)および問い合わせてくださいいいえる。
よろしく!
編集:
話題のファジングをくれると思うのはあのキャラクターにこの問題(一般).この質問:はファジングに適合テスト駆動開発?でのテスト駆動開発の過程ではファジングズ?
パラメータ化された単体テスト(自動)にも渡ると思う。これをわかりやすく伝えるためのファジング-のような結果は以前の試験の流れになります。なんなのかを正確うTDDます。
編集2:
リオデジャネイロ答えることができました。この点、私は非常に興味があるのか、またレバレッジのパラメータ化された試験としての擬似fuzzersてます。が、どのようにしてそれを試験を書くための試験?ときにどのように必ずしも十分カバーを攻撃す。
でよく知られている問題のソフトウェアセキュリティその場合に保護する5つの攻撃シナリオの脆弱性がありますので、ご使用には、6攻撃ができます。非常に難しいネットワークマウスのゲームです。なTDDく変更に対す。
解決
はい、テスト駆動開発ツール/手法を確実に入手可能にするセキュアコーディング.
しかしこ産業:とで新しい撮影をお楽しみください。
未知の脅威
しかし編集2:"おに保護する5つの攻撃シナリオの脆弱性がありますので、ご使用には、6攻撃"がありまTDDは ない 今からお客様を保護する目的で未知の脅威です。もともと、知りたいのかを試験するための試験。
いう脅威に6が発見された(hopefulyな違反ではなく内部に別のツール/手法ようとする潜在的なパロアルトネットワークス).
TDDすることが可能となっており、以下の
- 試験できる記述を検証する脅威であった。
- 解決策を実装することによりブロック、脅威、素早く確認できます。
- より重要なのは、他のすべての試験にもパスすることができることを確認:
- その他の全てのセキュリティ対策も行う。
- その他の全ての機能が動作します。
- 基本的にテスト駆動開発を支援でき、短納期からの脅威を発見した時の解決策が実現するものと期待されます。
- TDDも高い信頼の新しいバージョンの動作を修正。
テストコード
しているTDDはしばしば誤解を招くおそれの試験の方法論がこのときのデザイン方法論TDDのデザイン的なヘルプオーサリング-ツールとなり、 テスト容易化.
専門試験
重要な機能の試験の場合はその能力がないたしました。できることを実験は、任意の順序を任意の数倍かに失敗します。その結果、他の多くの側面システムのしやすくな試験純粋にその結果、testability.例えば:性能、メモリの利用.
この試験は、通常実施するという特殊な検査全体の試験スイートのことなく直接に影響を与えるスイートです。
同様の安全保障実験モジュールがオーバーレイテストスイートを探知られる安全保障上の懸念などの安全データをメモリにバッファまたは新たな攻撃ベクトルとなることが知られている。などのオーバーレイしての信頼でチェックしたすべての 既知の機能性 のシステム。
デザイン
の主要な設計の改善に生じる副作用のTDDは 明示的な依存関係.多くのシステムなの重みに暗黙的または派生した依存関係.このよう実験事実上不可能である。その結果TDDのデザインのあるモジュール 右所.安全保障上の観点から作成することはできないようなもの:
- テストコンポーネントを受け取るネットワークデータを実際に送信できます。
- ることのできる模擬出物の行動を予期しない/'非現実的なあり方などが引き起こされる攻撃シナリオ.
- テストコンポーネントです。
- または任意のミックスの生産ます。
ユニット試験
一つのことに留意すべきであるTDDの好性の高いローカルな単位試験の結果としてでき試験:
SecureZeroMemory()
が正しくパスワードを消去からのアプリです。- または
GetSafeSQLParam()
ばくを防SQLインジェクション
しかし、難しくなることがありますことを確認ーに使用して正しい方法であらゆるところです。
を確認するための試験の新しいSQL関連の特徴いることを確認機能の作品とはうっての"安全"と"安全でない'バージョンのGetSQLParam.
であり続けているのは、この理由を怠るべきではないその他のツールは使用できる"をセキュアコーディング".
- 符号化規格
- コードレビュー
- 試験
他のヒント
最初にあなたの2番目の質問をします。はい、TDD作業は非機能要件を使用できます。実際、そのようによく使用されます。改善されたモジュラー設計の最も一般的な利点は、機能していませんが、TDDを実践するすべての人に見られます。 TDDを使用して検証した他の例:クロスプラットフォーム、クロスダタベース、パフォーマンス。
すべてのテストでは、テスト可能になるようにコードを再構築する必要がある場合があります。これはTDDの最大の効果の1つです。これは、コードの構築方法を実際に変更します。最初はこれがデザインを乱しているように思われますが、すぐにテスト可能なデザインが優れていることに気付くようになります。ともかく...
文字列解釈バグ(Unicode vs. ANSI)は、TDDでテストするのが特に優れています。通常、悪いと良いインプットを列挙し、彼らの解釈について主張するのは簡単です。 「テスト可能にする」ためにコードを少し再構築する必要があることがわかります。これにより、文字列固有のコードを分離するメソッドを抽出することを意味します。
バッファオーバーランの場合、与えられたデータが与えられた場合、ルーチンが適切に応答することを確認することも、テストするのに非常に簡単です。テストを書いて、それらをあまりにも多くのデータ送信してください。彼らがあなたが期待したことをしたことを主張します。しかし、一部のバッファオーバーフローとスタックオーバーフローは少し難しいです。あなたはこれらを起こさせる必要がありますが、あなたも理解する必要があります それらが起こったかどうかを検出する方法. 。これは、バッファーを追加のバイトで割り当てるのと同じくらい簡単な場合があり、それらのバイトがテスト中に変更されないことを確認してください...または、他の創造的なテクニックがある場合があります。
しかし、簡単な答えがあるかどうかはわかりません。テストでは、創造性、規律、コミットメントが必要ですが、通常は価値があります。
- テストする必要がある動作を分離します
- 問題を検出できることを確認してください
- エラーケースのためにあなたが何をしたいかを知っている
- テストを書いて、失敗します
お役に立てれば
TDDは、安全なシステムを構築するための最良の方法です。 Microsoftによって開発されたすべてのソフトウェアは曖昧であり、これは間違いなく脆弱性の劇的な減少の最大の理由です。を使用することを強くお勧めします 桃のフレームワーク この目的のために。私は個人的にピーチを使用して、バッファーオーバーフローを見つけることに大きな成功を収めました。
ピーチピットファイルは、アプリケーションで使用されるデータを説明する方法を提供します。テストが必要なインターフェイスを選択できます。アプリケーションはファイルを読みますか?オープンポートはありますか?ピーチに入力がどのように見えるか、アプリケーションと通信する方法を伝えた後、あなたはそれを緩めることができ、私はあなたのアプリケーションを自己全体に吐き出すためにすべての厄介な入力を知っています。
すべてを実行するために、ピーチには素晴らしいものがあります testing harness
, 、アプリケーションがクラッシュした場合、ピーチはデバッガーが添付されているため、知るでしょう。アプリケーションがクラッシュすると、ピーチはそれを再起動し、テストを続けます。ピーチは、すべてのクラッシュを分類し、アプリケーションのクラッシュに使用した入力とコアダンプを一致させることができます。
パラメーター化されたテスト
私の仕事でバッファオーバーランテストを行っていませんが、テンプレートテストの概念があります。これらのテストは、テストする場合の特定のデータが必要になるようにパラメーター化されています。次に、メタプログラムを使用して、各ケースのパラメーターをテンプレートに適用することにより、実際のテストを動的に作成します。これには決定論的であるという利点があり、自動化されたテストスイートの一部として実行されます。
私のTDDの練習
私たちは私の仕事で受け入れテスト駆動型開発をしています。私たちのテストのほとんどは、たまたまフルスタック機能テストに近いことです。その理由は、ユーザー主導のアクションの動作をテストして保証する方が価値があることがわかったからです。パラメーター化されたテストからの動的テスト生成などの手法を使用して、最小限の作業でより多くのカバレッジを提供します。これをASCII対UTF8、API規則、およびよく知られているバリアントテストで行います。
ファジングのトピックが登場しました。これは、この問題に対する素晴らしいアプローチだと思います(一般的に)。これにより、質問が提起されます。ファジングはTDDに適合しますか? TDDプロセスのどこでファジングは適合しますか?
私はそれが非常によく合うかもしれないと信じています!好きなファッツァーがあります アメリカのファジーロップ それをスクリプト化し、独自にI/O形式の変更に適応させることができます。この特定のケースでは、できます Travis CIと統合します, 、使用した入力テストケースを保存し、それらに対して回帰テストを実行します。
コメントの詳細については、この回答を拡張する場合があります。