ファジングは、ソフトウェアテストに使用される非常に一般的な場所の手法になり、セキュリティの問題を見つけるために頻繁に使用されています。大規模で複雑なソフトウェアシステムをファジングするために調整された多くのフレームワーク( sully、 Peach Fuzzerなど)があります。小さくて単純な組み込みシステム(通常、OSを実行できないほど小さくて単純なもの)のファジングに関する情報はあまり見つかりませんでした。
これらの小さなシステムはどこにでもあります-RFIDカードリーダー、盗難警報システム、キーレスエントリーシステム、エンジンコントロールユニット、HVACコントロールなど。多くの場合、入力と出力は非常に限られています(ボタン、キーパッド、小さな文字ディスプレイ、LED、ブザー、RF通信)。複雑なネットワーク(イーサネット、TCP / IP)、シリアルポートなどはまれです。
セキュリティの問題を見つけてシステムがどのように動作するかを確認するために、ファジングのような手法を採用することに成功しました。現在、これは主に、本物のパケットの観察に基づいて、システムに送信されるパケットのフォーマットをファジングすることで構成されています。いくつかの例:
- ファジングを使用してパケットの構造を決定する-おおよそのパケット形式を知っている場合もありますが、IDビットやチェックサムなどがあります。本物のデバイスやサンプリングされた送信の数が少ないかどうかは、必ずしも確実ではありません。
- パケットが予想よりも長い場合のパケットデコードの問題の発見-可変パケット長を予想よりも長く設定するなどの簡単なこと。
- 許容可能な送信の制限の発見-再送信などは1つで一般的です-方法RFシステム。正しい送信として登録されるパケットの最小数はいくつですか?ボーレートをどのくらい変更できますか(つまり、レシーバーのクロックリカバリは良好ですか)。
- 妨害検出の限界を見つける。妨害が検出される前に、システムをどこまで押すことができますか?文書化されていない機能の検索-たとえば、00がアーム、01がアーム解除、10がパートアームの場合、11は何をしますか?
私が見つけた最大の課題の1つは、システムの状態を検出する方法です。これは一般的に、LED、LCDバスなどから取得された出力の寄せ集めになりました。私は入力と出力にArduinoとArduinoのようなボードを使用しています(通常は Teensy2.0)。また、クラッシュが発生した場合にシステムの電源を入れ直す方法を含める必要があることもよくあります。
私が驚いたのは、この分野で仕事や研究を行っている他の人があまりいないことです。
つまり、質問は次のとおりです。
- これらの方針に沿ってリソースはありますか?
- このアプリケーションに複雑なファジングフレームワークを使用できますか?
(余談ですが、これはグーグルの失敗ではないと思います。同様の概念「グリッチ」と「フォールトインジェクション」が含まれますが、これは明確であると思います)
このトレーニングが利用可能であることを確認しました: https://www.blackhat.com/us-13/training /peach-fuzzer-embedded-edition.html