ファジングテストは畳していk襪任呂△蠅泙擦鵝2師な秘薦や嚠豚しない秘薦でg廾をテストしていなければ、及美宀がシステムをg佩するだけで樋泣を喘できる辛嬬來があります。ファジングテスト┐泙燭魯侫.献鵐娃を佩うことで、捻壓議なセキュリティ貧の諒籾がk需されるとともに、システムの畠悶議な釈昔來が鯢呂垢覲〆呂發△蠅泙后
Synopsys Defensics?は、プロトコルのなモデルに児づいてテストケ`スを恬撹するジェネレ`ショナルファザ`です。Defensicsには、匯違議なネットワ`クプロトコルおよびファイルプロトコルのファジングテスト?ソリュ`ションとしてすぐに聞える、250を階える並念更廏gみのテストスイ`トが喜墮されています。テストスイ`トのレ袈なリストに根まれていないプロトコルのg廾は芦畠であるとはいえません。
恷除のアプリケ`ションは、宥械、1つのシステムとして銭亊して強恬するさまざまなコ`ドベ`スで更撹されています。たとえば、1つのアプリケ`ションに怏みzみの鴛看意コ`ド、モバイルアプリ?コ`ド、サ`バ`迦の粥永鴛とシステムが根まれる魁栽があり、これらすべてが吭のあるアクタ`にとってレ袈なアタックサ`フェスとなります。吭のあるアクタ`が鴛看意ボ`ド貧のセンサ`のはんだを茅肇して塘澆掘▲札鵐稀`宥佚プロトコルをファジングすることで、音屎な秘薦によってホスト?プロセッサ貧でコ`ドをg佩できるかどうかを距べ、音屎な侘塀のデ`タでサ`バ`迦の粥永鴛が柵び竃されるかどうかを鳩範する辛嬬來があります。
Defensics SDKを聞喘すると、匯違議でない、カスタマイズした、または鏡徭_kのプロトコルおよびファイル侘塀パ`サ`喘のテストスイ`トを_kできます。Defensics SDKで恬撹されたテストスイ`トは、すべてのビルドgみテストスイ`トと揖にDefensics GUIに燕幣されます。駅勣な恬Iはデ`タモデルの峺協だけです。デ`タモデルは、プロトコルをC亠でiみ函り辛嬬な侘で燕Fしたものです。Defensicsはデ`タモデルを聞喘して僕佚メッセ`ジを恬撹し、鞭佚メッセ`ジを盾裂します。そのため、すべてのテストケ`スはデ`タモデルとメッセ`ジシ`ケンスに児づき、Defensicsのジェネレ`ショナル?テストケ`ス?エンジンによって徭喇撹されます。
Defensics SDKのセットアップ圭隈およびデ`タモデルの恬撹に宴旋なSDK PCAPウィザ`ドの聞い圭のについては、にvするチュ`トリアルをごEください。
Defensics SDKのC嬬にvする肝の並も歌深にしてください。
インジェクタは、テストタ`ゲットにテストケ`スを塘佚する叨護を惚たします。インジェクタは、塘佚チャネルの兜豚晒をg佩し、チャネルからのデ`タを僕鞭佚し、テストケ`スの嶮阻扮に塘佚チャネルを液じます。
Defensics SDKには、ファイルをエクスポ`トするためのTCP/IP、HTTP、TLS、UDP、SCTP、WebSocket、イ`サネット、GATT、RFCOMM喘インジェクタがMみzまれています。そのため、プロトコルがTCP/IP俊Aでg佩されている栽は、MみzみのTCP/IPインジェクタを聞喘できるように撹するだけでgみます。
肝の箭は、怏みzみの意遺永インジェクタを兜豚晒してテストシ`ケンスで聞喘する圭隈を幣しています。
Injector io = tools.injector().tcp(^127.0.0.1 ̄, 1234);
tools.setSequence(
io.send(myProtocolReq),
io.receive(myProtocolResp));
TCPインジェクタの恷兜のパラメ`タはテスト鵑離曠好肇▲疋譽垢如2桑朕のパラメ`タはテスト鵑離櫞`トです。インジェクタは、TCPソケットからメッセ`ジを僕鞭佚するために聞喘されます。また、Defensics SDKはTCPソケットを初して宥佚する蒙歩なプロトコル喘に、MみzみインジェクタをカスタマイズできるカスタムTCPインジェクタチャネルを笋┐討い泙后
テスト鵑Defensics SDKのMみzみインジェクタをサポ`トしていない栽、肝の2つのxk岔があります。
2桑朕の僉k岔の箭として、この芝並ではシリアルポ`トインジェクタを聞喘してプロトコル?テストスイ`トを恬撹する圭隈を府初します。
MみzみC匂では、オンボ`ドチップgまたはホストPCとボ`ドgの宥佚の匯違議なインタ`フェイスはUART/SPI/I2Cです。Defensicsテストスイ`トをg佩するPCでは、Mみzみシステムソフトウェア_kの匯違議なデバッグツ`ルであるUSB UARTケ`ブルUSBシリアルケ`ブルとも柵ばれるを聞喘できます。ケ`ブルがPCに俊Aされている栽、オペレ`ティングシステムのシリアルポ`トとして燕幣されます。
Defensics SDKの麼なプログラミング冱ZはJavaです。インジェクタメソッドをg廾するJavaライブラリがある栽は、ライブラリをテストスイ`トにバンドルするだけです。シリアルポ`トの栽、JavaライブラリのjSerialComm┌でプラットフォ`ムに卆贋しないシリアルポ`トへのアクセスが辛嬬になります。艶の冱囂で慕かれたインジェクタライブラリがある魁栽は、テストスイ`トの干温厩温コ`ドとネイティブ?コ`ド寂の干温厩温のネイティブ?インタ`フェイス?マッピングも恬撹する駅勣があります。
プロジェクトは、ホストPC貧でWindows 10をg佩し、USB UARTケ`ブルで俊AされたRaspberry Piコンソ`ルをテストするようにセットアップしています。この箭では、テストスイ`トはシリアル宥佚徭悶ではなく、シリアル俊Aの嘘瘁にあるプロトコルをファジングしています。
Defensics SDKの恬Ih廠とプロジェクトは、SDK塘下パッケ`ジにある_k宀ガイドに惄辰瀞O協されています。このパッケ`ジには、このサンプルプロジェクトの頼畠なソ`スコ`ドと麿のSDKのサンプルも根まれています。
翌何ライブラリを聞喘する魁栽は、恷兜にテストスイ`ト?プロジェクトにライブラリを弖紗します。.逮温姻ファイルをコピ`して壊糸一.逮温姻と揖じレベルにある&鉛岳;プロジェクトフォルダ`&乙岳;/鉛庄恢フォルダ`塘和に薮り原け、乙姻温糸鉛艶の卆贋vSを厚仟してライブラリを弖紗します。蝕k宀モ`ドでテストランナ`を聞喘する魁栽は、テストスイ`トのiみzみ扮に峺協されたクラスパス篳にライブラリを弖紗する駅勣があります。それ參翌の魁栽、テストランナ`は弖紗されたライブラリのクラスを吭紛しません。
1鎖k宀モ`ドのテストランナ`で翌何ライブラリを聞喘するように干温厩温クラスパスを嫖する
弖紗したライブラリ┐海栽はjSerialCommのAPIがプロジェクトで聞喘辛嬬な栽、テストのg佩を_兵する念に、聞喘するインジェクタをO協できます。Defensics SDKを聞喘すれば仟しいインジェクタO協の弖紗はgで、協xされたO協は徭啜弔縫灰泪鵐疋薀ぅ鵑Defensicsモニタ`GUIのI圭で聞喘できるようになります。
デフォルトでは、O協、Defensics GUIで筝されると、テストスイ`トのデ`タモデルが壅iみzみされます。このC嬬は、O協、砲茲辰謄謄好肇羽`スの坪否が筝され、デ`タモデルに唹を嚥える栽に駅勣です。インジェクタのO協がデ`タモデルに唹しない栽は、參和のコ`ドに幣すように、no-reload壅iみzみなしのO協を協xできます。no-reloadのO協、魯皀妊襪淋掖iみzみなしで筝できます。
tools.settings()
.addChoiceSetting(^Cdata-bits ̄,
^Number of data bits ̄,
tools.settings().createChoice(^7 ̄, ^7 bit ̄),
tools.settings().createChoice(^8 ̄, ^8 bit ̄).setDefault())
.setGroup(GROUP_SERIAL_PORT)
.noReload();
肝の箭では、デ`タビットxkのO協を恬撹しています。GUIには、 ̄serial port ̄という兆念の鏡徭のO協グル`プの和に2つのオプション7ビットモ`ドまたは8ビットモ`ドを根むドロップダウンリストの侘塀で燕幣されます。デフォルトは8ビットモ`ドです。コマンドラインから、Cdata-bits 7パラメ`タ`を聞喘してデフォルト、筝できます。
2: 恬撹したO協は徭啜弔Defensics GUIに燕幣される
この箭を需れば、堀業やフロ`崙囮など、あらゆる匯違議なシリアルポ`ト更撹パラメ`タ`にvする譜協が恬撹されていることがわかります。ホスト永遺貧で聞喘辛嬬なシリアルポ`トのリストを恬撹する魁栽、聞喘するライブラリは逮皆艶姻庄温鉛遺看馨馨のみです。
SerialPort[] ports = SerialPort.getCommPorts();
これらのポ`トは僉k岔の譜協にマッピングされます。
ArrayList<FuzzSettingChoice> portChoices = new ArrayList<>(ports.length);
for (SerialPort port : ports) {
portChoices.add(
tools.settings().createChoice(
port.getSystemPortName().replace(^. ̄, ^-^),
port.getDescriptivePortName()));
}
岳看看鉛壊.壊艶岳岳庄稼乙壊().温糸糸遺鞄看庄界艶皆艶岳岳庄稼乙(^C界看馨-沿看姻岳 ̄,
^Port ̄,
portChoices.toArray(new FuzzSettingChoice[0]))
.setGroup(GROUP_SERIAL_PORT)
.noReload();
インジェクタに駅勣なすべての譜協を協吶すれば、塘佚チャネルを恬撹できます。
カスタムインジェクタは怏みzみインジェクタと揖に強恬します。カスタムインジェクタを恬撹するには、皆禽悪で協吶された遺顎壊岳看馨遺鞄温稼稼艶鉛インタ`フェイスをg廾します。インタ`フェイスはg歓です。
void close?(InjectorEngine engine) // チャネルを]じる
void open?(InjectorEngine engine) // チャネルを_く
void receive?(InjectorEngine engine, Message message) // チャネルからメッセ`ジを鞭佚する
void send?(InjectorEngine engine, Message message) // チャネルにメッセ`ジを僕佚する
これらのメソッドはすべて、テストのg佩嶄に徭強議に柵び竃されます。
看沿艶稼()メソッドでユ`ザ`譜協をiみzんでインジェクタを譜協します。たとえば、糸温岳温-恢庄岳壊の譜協をiみ函って壊艶姻庄温鉛永看姻岳オブジェクトに護り輝てることができます。
String value = getEngine().settings().getSettingValue(^!data-bits ̄);
serialPort.setNumDataBits(Integer.parseInt(value));
譜協が頼阻したら、シリアルポ`ト俊Aを蝕くことができます。
Public void open(InjectorEngine engine) throws IOException {
inBuffer = new ByteArrayOutputStream(INPUT_BUFFER_DEFAULT_SIZE_BYTES);
initWithUserSettings(engine.getSdkEngine());
initWithControlSettings(engine);
if (serialPort != null) {
if (serialPort.isOpen()) {
throw new EngineException(
^Serial Port ( ^ + serialPort.getSystemPortName() + ^ ) already in use! ̄);
}
serialPort.openPort();
}
}
テストケ`スが嶮阻した朔、肝の看沿艶稼()の柵び竃しをI尖できる彜蓑にすことによって、シリアルポ`トを液じることができます。
Public void close(InjectorEngine engine) {
inBuffer.reset();
if (serialPort != null) {
serialPort.closePort();
}
serialPort = null;
}
看沿艶稼()メソッドと界鉛看壊艶()メソッドは、テストのg佩を蝕兵するときだけでなく、テストケ`スごとに柵び竃されます。壊艶稼糸()と姻艶界艶庄厩艶()の柵び竃しは、シ`ケンスファイルの&鉛岳;壊艶稼糸&乙岳;と&鉛岳;姻艶界厩&乙岳;の協吶と11鬉靴泙后
壊艶稼糸()メソッドで、メッセ`ジからのデ`タをインジェクタ?チャネルに譜協する駅勣があります。デ`タはテストケ`スから函誼し、アノマリや寄楚のオ`バ`フロ`またはアンダ`フロ`が贋壓する辛嬬來があるため、坪否にvする念戻を譜けずにデ`タをチャネルに僕佚する駅勣があります。デ`タサイズを崙泙垢覬慴がある魁栽は、ここでI尖するのではなく、モデルを更撹して崙泙鯢莇┐靴討ださい。意艶壊岳遺温壊艶遺看稼韓庄乙の箭をごEください。
public void send(InjectorEngine engine, Message message) throws IOException {
MessageElement element = message.getRoot();
byte[] bytes = element.encode();
if (serialPort.isOpen()) {
serialPort.writeBytes(bytes, bytes.length);
if (transmitEnds.length > 0) {
serialPort.writeBytes(transmitEnds, transmitEnds.length);
}
}
}
デ`タ鞭佚のI尖はもう富し鹸jです。プロトコルによっては、匯協のバイト方または蒙歩な僕佚嶮阻マ`クが鞭佚されるまで、デ`タのiみ函りをタイムアウトまたは掲ブロッキングiみ函りでブロックしておくことが辛嬬です。鞭佚したデ`タは、シ`ケンスファイルの姻艶界厩タグの侏として協吶された珂艶壊壊温乙艶掘鉛艶馨艶稼岳と頼畠に匯崑する駅勣があります。デ`タが侏と匯崑しない魁栽、嚠豚しないメッセ`ジのハンドラが徭強議に柵び竃されます。嚠豚しないメッセ`ジのハンドラは、乏音揖で鞭佚できるプロトコル坪の匯違議なメッセ`ジをI尖します。
シリアルポ`トの箭では、デ`タの恷兜のバイトのブロッキング棋字とタイムアウトが峺協されています。恷兜のバイトが鞭佚された朔、ユ`ザ`協吶の佩挑猟忖が鞭佚されるまでデ`タがiみ函られます。
public void receive(InjectorEngine engine, Message message) throws IOException {
engine.getSdkEngine().log().out(^CustomChannel receive() ̄);
int numRead;
int endMark = -1;
byte[] readBuffer = new byte[INPUT_BUFFER_DEFAULT_SIZE_BYTES];
// 峺協の佩挑猟忖を鞭佚するまで、またはiみ函りタイムアウトになるまでiみ函る
do {
numRead = serialPort.readBytes(readBuffer, readBuffer.length);
if (numRead > 0) {
inBuffer.write(readBuffer, 0, numRead);
if (receiveEnds.length > 0) {
endMark = indexOf(inBuffer.toByteArray(), receiveEnds);
}
}
} while (numRead > 0 && endMark == -1);
// 鞭佚デ`タなし
if (inBuffer.size() == 0) {
throw new EngineException(^Timeout! No data received. ̄);
}
// 鞭佚したデ`タをI尖する
byte[] data = inBuffer.toByteArray();
inBuffer.reset();
// 僕佚K阻マ`クがつかった栽
if (endMark > 0) {
message.getRoot().assignData(Arrays.copyOfRange(data, 0, endMark));
// 鞭佚したデ`タをK阻マ`クの瘁に隠隔する
if (data.length > (endMark + receiveEnds.length + 1)) {
inBuffer.write(Arrays.copyOfRange(data, endMark + receiveEnds.length, data.length));
}
} else {
// K阻マ`クなし。すべてのデ`タをI尖する
message.getRoot().assignData(data);
}
}
すべてのテストスイ`トのg佩は、赫雨鴛またはコマンドラインからテストスイ`トをiみzむときに恢顎庄鉛糸()で蝕兵します。シリアルポ`トの箭では、メソッド柵び竃しの嶄で、念に幣した譜協とカスタム?インジェクタを恬撹します。
public void build(BuilderTools tools) throws Exception {
// デ`タモデルをiみ函る
tools.factory().readTypes(tools.resources().getPathToResource(^model.bnf ̄));
// O協を恬撹する
SerialPortSettings serialSettings = new SerialPortSettings(tools);
// メッセ`ジを恬撹する
createMessages(tools);
// ioを恬撹する
CustomInjector io = tools.injector().custom(new SerialPortInjector());
// テストシ`ケンスを恬撹する
tools.buildSequence(io)
.createSequencesFrom(
tools.resources().getPathToResource(serialSettings.getSequenceFile().getValue()));
// 嚠豚しないメッセ`ジのハンドラを恬撹およびO協する
MessageElement unexpected = tools.buildSequence(io)
.messagesFromFile(tools.resources()
.getPathToResource(serialSettings.getUnexpectedSequenceFile().getValue()));
io.setUnexpectedMessageHandler(unexpected)
.maxReadMessages(100)
.debug(true);
// 。囃嫌が崙泙気譴討い襪燭瓠恷寄オ`バ`フロ`を崙泙垢
tools.testCaseConfig().maximumOverflowLength(512); // バイト方
}
テストスイ`トが赫雨鴛に燕幣されるようになったので、ユ`ザ`は赫雨鴛の譜協からインジェクタ`を更撹できます。屎しい譜協が僉kされていれば、テストスイ`トとタ`ゲットデバイスの犹ピ睦弛圓鬟謄好箸任ます。犹ピ睦弛圓蓮▲粂`ケンスファイルでテストシ`ケンスとして協吶した嗤燭淵謄好肇羽`スで編^されます。
シリアルポ`トの箭では、テストケ`スのg佩ログを鳩範すれば、カスタムチャネル?メソッドがどのように柵び竃されるかが蛍かります。
3采燭淵羽`スとしては、Raspberry Piのシリアルコンソ`ルにechoコマンドを僕佚して、その坪否を畈するという圭隈が深えられます。
この嗤燭淵羽`スの箭で僕佚されるデ`タは ̄echo Hello World! ̄ コマンドです。このデ`タモデルでは、コマンドに3つの哈方があります。
アノマリは、この更夛に児づいて徭強議に伏撹されます。匯箭として、恷兜のコマンド哈方を$永粥意堰桟廠篳に崔き算えています。
嗤燭淵羽`スの鬴陲蕨覿┐匹り ^Hello World! ̄です。
このサンプルのアノマリにする鬴陲蓮晦庄稼顎恰ユ`ザ`にとっては要輝でも、プロトコルユ`ザ`にとっては覿翌である辛嬬來があります。
禽艶韓艶稼壊庄界壊はプロトコルのファジングテストに恷癖な互來嬬ツ`ルです。カスタムプロトコルのg廾にして兜めて禽艶韓艶稼壊庄界壊をg佩したときは、コ`ド坪に需つかったエラ`に妾かれることでしょう。禽艶韓艶稼壊庄界壊で芝峰されたカスタム?プロトコル?テストスイ`トはエラ`のk需を屶址し、シ`ケンスエディタ`を聞喘すれば、犹ピ睦弛團謄好箸里燭瓩林燭淵謄好肇羽`スを返Xに恬撹できます。
シノプシスのDefensics SDKでは、カスタム塘佚チャネルを聞喘している栽でもカスタム?プロトコルのファジングテストが辛嬬です。シリアルポ`トの箭をれば、カスタムインジェクタをテストスイ`トに弖紗することは}jな恬Iではないことがお蛍かりでしょう。