secureassist rulepack configurator 利用ガイド version...
TRANSCRIPT
パッケージのダウンロードルールパックの説明
カスタムルールの作成
2016.04.01
SecureAssistRulepackConfigurator利用ガイド
Version3.0対応版
目次
*本資料について
*RulepackConfigurator概要RulepackConfiguratorとルールパックルールパックとIDEでの表示問題検出の流れ
*ルールパックの構成要素ルールパックの構成要素の一覧ソース
プロパゲーター
ルール
フィルターガイダンス
*導入と起動
パッケージのダウンロード
RulepackConfiguratorの起動
*カスタムルールパック作成作成するルールについて新規ルールパックの作成開始
ソースの編集開始ソースのデータ入力と保存ルールパックファイルへの保存ガイダンスの編集開始ガイダンスの編集画面ルールの編集開始ルールのデータ入力と保存フィルターの編集開始フィルターのデータ入力と保存ルールパックファイルへの保存(再掲)
*カスタムルールパックの動作確認
カスタムルールパックの読み込み動作例「信頼できない入力元」動作例「重大度Highの問題とガイダンス」動作確認後の配布
*お問い合わせ
2
本資料について
本資料では、SecureAssistRulepackConfiguratorに関する、以下の範囲を取り扱います。
– パッケージのダウンロードと起動
– ルールパックについての説明
– カスタムルールの作成
3
SecureAssistRulepackConfigurator概要
4
RulepackConfigurator概要RulepackConfiguratorとルールパック
RulepackConfiguratorは、SecureAssistがソースコードのスキャン時に使用するコードのパターンやその重大度、関連するガイダンスを定義するために使用するツールです。
定義した内容は、ルールパックとしてファイルに保存されます。
作成したルールパックは、EnterprisePortalを通じて、Eclipse,IntelliJIDEA,VisualStudioの各IDEに配布することができます。
EnterprisePortalへのルールパックの登録については「EnterprisePostal導入ガイド」をご参照ください。
「EnterprisePortal導入ガイド」は hGps://secureassist.jp/downloads/enterpriseportal/からダウンロードできます。
5
RulepackConfigurator概要ルールパックとIDEでの表示
6
ルールパックでの定義は、IDEでは次の場所に反映されます。
・ 「ソースコード」中の問題箇所の特定・ 「ソースコード」での重大度マークの種別(High,Medium,Low)表示・ 「IssueList」と「ProjectReview」での重大度と問題の種別の表示・ 「ガイダンス」の表示内容
「ソースコード」
「IssueList」
「ガイダンス」
RulepackConfigurator概要問題検出の流れ
7
01:packagecom.example;
02:
03:importjava.sql.Connection;
04:importjava.sql.DriverManager;
05:importjava.sql.ResultSet;
06:importjava.sql.SQLException;
07:importjava.sql.Statement;
08:importjava.util.Properties;
09:importjava.util.logging.Level;
10:importjava.util.logging.Logger;
11:importjavax.servlet.http.HttpServletRequest;
12:importcom.example.Utils;
13:
14:publicclassExample{
15:privatefinalstaticStringUPDATE_SQL="SELECTnameFROMusersWHEREid=";
16:
17:publicStringgetUserName(HttpServletRequestrequest){
18:finalPropertiesprops=Utils.loadProperties("properties.xml");
19:finalLoggerlogger=Logger.getLogger(props.getProperty("log_file"));
20:
21:StringuserName=null;
22:StringBufferquery=newStringBuffer();
23:query.append(UPDATE_SQL);
24:query.append(request.getParameter("id"));
25:
26:try(
27:Connectioncon=DriverManager.getConnection(props.getProperty("db_connection"),props);
28:Statementstmt=con.createStatement()
29:){
30:
31:ResultSetrs=stmt.executeQuery(query.toString());
32:userName=rs.getString(0);
33:
34:}catch(SQLExceptione){
35:logger.log(Level.SEVERE,e.getMessage(),e);
36:}
37:
38:returnuserName;
39:}
40:}
17行目で、メソッドgetUaerNameは引数としてHGpServletRequestを持ちますが、これはWebからの信頼できないデータとなります。これをSecureAssistでは「ソース」(Sources)と呼びます。24行目で、この信頼できないデータはStringBufferと組み合わせられます。SecureAssistはここで信頼できないデータによる汚染を取り込んだと判定して、重大度Mediumの問題として検出します。SecureAssistでは問題が発生する箇所を「シンク」(Sink)を呼びます。31行目では、StringBuffer#toStringの呼び出しが、先ほどの汚染をStringBufferからStringに伝達したと認識しています。この伝達をSecureAssistでは「プロパゲーター」(Propagator)と呼びます。この31行目ではさらに、Statement#execteQueryに引数とし
て先ほどの汚染されたStringを渡しているため、重大度Highの問題として検出します。このメソッドと引数のパターンと対応するガイダンスの定義をSecureAssitでは「ルール」(Rules)と呼びます。また、各ルールの重大度がどの段階に相当するかについての定義は「フィルター」(Filters)と呼びます。
SecureAssistRulepackConfiguratorルールパックの構成要素
8
ルールパックの構成要素ルールパックの構成要素の一覧
9
ルールパックは次の5つの要素から構成されています。ソース(Sources)
信頼できないデータの入力元を定義します。
プロパゲーター(Propagators)信頼できないデータの伝搬を定義します。
ルール(Rules)問題として指摘するコードのパターンを定義します。
フィルター(Filters) ルールごとの重大度や複数のルールからなるカテゴリを定義します。
ガイダンス(Guidances)ユーザーへのガイダンスを定義します。
ルールパックの構成要素ソース
10
ソースでは、信頼できないデータの入力元を、対応する言語(php,java,cs,vb)、信頼できないデータの入力元の種別(WEB,DB,FILE,PRIVATE)、対応するクラスやメソッドによって定義します。
<Sourcelang="java"taint="DB"><QualifiedNameextends="false"><![CDATA[java.sql.ResultSet]]></QualifiedName><Method><![CDATA[(getString|getObject)\b]]></Method></Source>
実際のデフォルトルールパックでの記述を例に説明します。
「Source」の属性である「lang="java"」はJava言語のための記述であること、「taint="DB"」はデータベースが入力元であることを定義しています。
そして「Source」の要素である「QualifiedName」と「Method」では、そのコードが具体的に、クラス「java.sql.ResultSet」のメソッド
「getString」と「getObject」であることを定義しています。
これにより、Javaのソースコードに出現する「java.sql.ResultSet」クラスの「getString」と「getObject」が返す値は、
データベースからの信頼できないデータであると、SecureAssistが認識します。
ルールパックの構成要素プロパゲーター
11
プロパゲーターでは、信頼できないデータがメソッドの呼び出しで伝搬していく状態を追跡するための情報を定義します。
<PropagamonRulelang="java"ruleID="JAVA_PROPAGATOR_007"><QualifiedName><![CDATA[\bjava.lang.String\b]]></QualifiedName><Method><![CDATA[\bsubstring\b]]></Method><Propagate><ReturnValue><Caller>true</Caller></ReturnValue></Propagate></PropagamonRule>
実際のデフォルトルールパックでの記述を例に説明します。
「PropagamonRule」の属性である「lang="java"」は、これがJava言語のための記述であることを定義しています。
そして「PropagamonRule」の要素である「QualifiedName」と「Method」では、そのコードが具体的に、
クラス「java.lang.String」のメソッド「substring」であることを定義しています。
これにより、Javaのソースコードに出現する「java.lang.String」クラスの「substring」に信頼できない文字列データを渡した場合、
その戻り値もまた信頼できないデータであると、SecureAssistが認識します。
ルールパックの構成要素ルール
12
ルールでは、問題として指摘するプログラムの呼び出しのパターンを定義します。
<Ruleid="CIGITAL-SQL-002"lang="java"><Category>QueryInjecmon</Category><Title>SQLInjecmon</Title><Descripmon>Idenmfiesdangerousmethodcallsofthejava.sql.Statementclasswheretainteddatawasusedtobuildthequerytobeexecuted.</Descripmon><Match><QualifiedName><![CDATA[java.sql.Statement]]></QualifiedName><Method><![CDATA[(executeQuery|executeUpdate|execute|addBatch)\b]]></Method><Arguments><Argument><Index>0</Index><Taint><Type>UNTRUSTED</Type></Taint></Argument></Arguments></Match><Standards><Standardfile="about-sql-injecmon.xml"><Context>J2EE</Context></Standard></Standards></Rule>
実際のデフォルトルールパックでの記述を例に説明します。
「Rule」の属性である「lang="java"」は、これがJava言語のための記述であることを定義しています。
そして「Rule」の要素である「Match」内の「QualifiedName」と「Method」での記述は、クラス「java.sql.Statement」の「executeQuery」
「executeUpdate」などのメソッド呼び出しであることを、「Arguments」による記述は引数として引数として信頼できないデータを受け取ることを定義しています。
これにより、Javaのソースコードに出現する「java.lang.Statement」クラスの「executeQuery」や「executeUpdate」などに
信頼できないデータを引数として渡した場合、このルールにマッチするとSecureAssistが認識します。
また、「Standards」内ではこのルールに対応するガイダンスとの紐付けを行っています。
ルールパックの詳細フィルター
フィルターでは、各ルールをIDE上での表示について定義します。
実際のデフォルトルールパックでの記述を例に説明します。「Problem」の属性である「name="SQLInjecmon"」は、この「Problem」の要素である「Rule」が「SQLInjecmon」というグループに含まれることを定義しています。
各「Rule」の各属性は、次の内容を表しています。 ・ 「id」は先のルールで定義したidに対応しています。 ・ 「acmve」は、このフィルターの有効無効を定義しています。 ・ 「importance」はこのルールの重大度を定義しています。 ・ 「markerShow」はソースファイル中でこのルールのアイコンを表示非表示を定義しています。
13
<Problemname="SQLInjecmon"><Rules><Ruleid="CIGITAL-SQL-001"acmve="true"importance="MEDIUM"markerShow="true"/><Ruleid="CIGITAL-SQL-002"acmve="true"importance="HIGH"markerShow="true"/><Ruleid="CIGITAL-SQL-003"acmve="true"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-JAVA-SPRING-JDBC"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-HIBERNATE-01"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-HIBERNATE-02"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-JAVA-SPRING-JDBC-01"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-JAVA-SPRING-ORM-JDO-01"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-JAVA-SPRING-ORM-HIBERNATE-01"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-JAVA-SPRING-ORM-JPA-01"importance="HIGH"markerShow="true"/><Ruleacmve="true"id="CIGITAL-JAVA-JAVAX-PERSISTENCE"importance="HIGH"markerShow="true"/></Rules></Problem>
ルールパックの構成要素ガイダンス
ガイダンスは、ルールに対応する説明内容を定義します。タイトルと説明、対応の仕方、ソースコードの良い例と悪い例、関連するリファレンスなどを、ここで定義しています。
14
SecureAssistRulepackConfigurator導入と起動
15
導入と起動パッケージのダウンロード
16
SecureAssistのWebサイトのDownloadページに、新版のRulepackConfiguratorのダウンロードリンクがあります。
ここにあるzipファイルをダウンロードしたあと、適切なディレクトリに展開します。SecureAssistWebサイトhGps://secureassist.jpSecureAssistRulepackConfiguratorDownloadページhGps://secureassist.jp/downloads/enterpriseportal/
導入と起動RulepackConfiguratorの起動
17
ダウンロードしたzipファイルを展開した中にある「Rulepack.exe」を実行すると、RulepackConfiguratorが起動します。起動時はJDKのインストールされたフォルダーを選択するダイアログが表示されます。ここで選択後に「OK」ボタンをクリックすると、次回起動時からはこのダイアログは表示されません。
「Rulepack.exe」を実行
JDKの場所を選択
RulepackConfiguratorが起動
SecureAssistRulepackConfiguratorカスタムルールパック作成
18
カスタムルールパック作成作成するルールについて
オリジナルのクラスとメッソドに対して、次の内容でカスタムルールを作成する例を紹介します。1. 信頼できないデータの入力元となるメソッドの定義
– com.example.Umlsのメソッド getEnvironments()とgetSystemInfromamon()を、信頼できないデータの入力元として定義します。
– 「ソース」がこれに対応します。
2.引数として信頼できないデータを受け取った時に、Highの問題として検出する定義– com.example.Umlsのメソッド writeCommand()と executeCommand()を、
信頼できないデータを受け取った時にHighの問題として検出するように定義して、対応するガイダンスを用意します。
– 「ガイダンス」、「ルール」、「フィルター」がこれに対応します。
19
カスタムルールパック作成新規ルールパックの作成開始
「File」の「NewRulepack」を選択して、新規ルールパッックの作成を開始します。
既存のルールパックへのルールの追加や更新を行う場合は、「File」の「OpenRulepack」を選択して、既存のルールパックを開きます。
ツリー表示された「Custom」以下が、カスタムルールで編集できる範囲となります。SecureAssistのデフォルトルールパックを読み込んだ場合は、「Default」以下にその内容が表示されます。
20
カスタムルールパック作成ソースの編集開始
21
右クリックメニューの「New」の「NewSources」を選択します。ダイアログの「FileName」を入力して「Create」ボタンをクリックすると、
ソースの編集画面が表示されます。
ソースの編集画面
「example-sources」
カスタムルールパック作成ソースの編集画面
22
ソースの編集画面の表示は「Design」と「Source」の2種類
を切り替えることができます。「Design」では右クリックメニューで要素や属性を選択しな
がら編集することができます。
「Source」ではテキストを直接編集することができます。
「Design」 「Source」
右クリックメニューで編集
カスタムルールパック作成ソースのデータ入力と保存
<?xmlversion="1.0"encoding="UTF-8"?><Sourcesxmlns:xsi="hGp://www.w3.org/2001/XMLSchema-instance"xsdVersion="2.3.6"xsi:noNamespaceSchemaLocamon="../../schemas/sources_2_3_6.xsd"><Sourcelang="java"taint="WEB"><QualifiedName><![CDATA[com.example.Umls]]></QualifiedName><Method><![CDATA[(getEnvironments|getSystemInformamon)\b]]></Method></Source></Sources>
23
ソースのデータを入力して「File」の「Save」を実行します。
「Save」をすることで、「SaveRulepack」でルールパックのファイル
に書き出す対象となります。
「Save」をしていない内容は、「SaveRulepack」でルールパックの
ファイルに書き出す対象となりません。
ここでの「Save」は、編集内容を確定するという意味になります。
編集内容をファイルに書き出す場合は、「Save」後に「SaveRulepack」を実行してください。
データを入力
「File」の「Save」を実行
カスタムルールパック作成ルールパックファイルへの保存
24
1. ルールパックファイルに保存するため、「File」の「SaveRulepack」を選択します。
2. ダイアログの「RulepackName」と「RulepackVersion」を入力して「Save」ボタンをクリックします。
3. 必要に応じて「ファイル名」を変更して「保存」ボタンをクリックします。
保存するファイル名は、デフォルトでは{Name}_{Version}.jarの形式になります。すでに同名のファイルがある場合は、上書きするかどうかの確認ダイアログが表示されます。
1. 2.
3.
カスタムルールパック作成ガイダンスの編集開始
右クリックメニューの「New」の「NewGuidance」を選択します。ダイアログの「FileName」を入力して「Create」ボタンをクリックすると、
ガイダンスの編集画面が表示されます。
25
「example-001」
カスタムルールパック作成ガイダンスの編集画面
ガイダンスの編集は、画面の各項目を操作しながら行
うことができます。「テキスト入力欄」にはそのままテキストを入力すること
ができます。
「ボタン」や「タブ」はクリックして操作を行います。「右クリックメニュー」で編集する画面では、右クリックメ
ニューから操作を選択すると、対応するダイアログが表
示されるので、その画面に従いデータを入力します。ガイダンスを編集したら「File」の「Save」を実行します。「Save」をすることで、「SaveRulepack」でルールパックの
ファイルに書き出す対象となります。
編集内容をファイルに書き出す場合は、「Save」後に
「SaveRulepack」を実行してください。
26
「テキスト入力」
「テキスト入力」
「テキスト入力」
「右クリックメニュー」
「ボタン」
「右クリックメニュー」
「タブ」
カスタムルールパックルールの編集開始
右クリックメニューの「New」の「NewRules」を選択します。ダイアログの「FileName」を入力して「Create」ボタンをクリックすると、
ガイダンスの編集画面が表示されます。Languageは、Java,JSP,XML,.NET(C#,VB.NET),PHPなどから選択します。
27
「example_rules.xml」
カスタムルールパック作成ルールの編集画面
28
ルールの編集画面の表示は「Design」と「Source」の2種類を切り替えることができます。「Design」では右クリックメニューで要素や属性を選択しながら編集することができます。
「Source」ではテキストを直接編集することができます。
「Design」 「Source」
右クリックメニューで編集
カスタムルールパック作成ルールのデータ入力と保存
<?xmlversion="1.0"encoding="UTF-8"?><Rulesxmlns:xsi="hGp://www.w3.org/2001/XMLSchema-instance"xsdVersion="2.3.6"xsi:noNamespaceSchemaLocamon="../../../schemas/java_rule_2_3_6.xsd"><Ruleid="EXAMPLE-RULE-001"lang="java"><Category>ExampleCategory</Category><Title>Exampleルール#001</Title><Descripmon>これはExampleのオリジナルルール#001です。</Descripmon><Match><QualifiedName><![CDATA[com.example.Umls]]></QualifiedName><Method><![CDATA[(writeCommand|executeCommand)\b]]></Method><Arguments><Argument><Index>0</Index><Taint><Type>UNTRUSTED</Type></Taint></Argument></Arguments></Match><Standards><Standardfile="example-001.xml"><Context>J2EE</Context></Standard></Standards></Rule></Rules>
29
ソースのデータを入力して「File」の「Save」を実行します。「Save」をすることで、「SaveRulepack」でルールパックのファイルに書き出す対象となります。「Save」をしていない内容は、「SaveRulepack」でルールパックのファイルに書き出す対象となりません。ここでの「Save」は、編集内容を確定するという意味になります。編集内容をファイルに書き出す場合は、「Save」後に「SaveRulepack」を実行してください。
データを入力
先ほどのガイダンス「example-001.xml」と紐付けています。
カスタムルールパックフィルターの編集開始
右クリックメニューの「New」の「NewFilter」を選択します。ダイアログの「IDE」、「FileName」、「FilterDescripmon」を入力して
「Create」ボタンをクリックすると、ガイダンスの編集画面が表示されます。
30
「Example」
カスタムルールパック作成フィルターの編集画面
31
ルールの編集画面の表示は「Design」と「Source」の2種類を切り替えることができます。「Design」では右クリックメニューで要素や属性を選択しながら編集することができます。
「Source」ではテキストを直接編集することができます。
「Design」 「Source」
右クリックメニューで編集
カスタムルールパック作成フィルターのデータ入力と保存
<?xmlversion="1.0"encoding="UTF-8"?><Filterxmlns:xsi="hGp://www.w3.org/2001/XMLSchema-instance"desc="Theexamplefilterfortutorial"ide="eclipse"name="Example"version="1458894635476"xsdVersion="1.2"xsi:noNamespaceSchemaLocamon="../../schemas/filter_1_2.xsd"><Problems><Problemname="Example001"><Rules><Ruleimportance="HIGH"markerShow="true"acmve="true"id="EXAMPLE-RULE-001"/></Rules></Problem></Problems></Filter>
32
フィルターのデータを入力して「File」の「Save」を実行します。「Save」をすることで、「SaveRulepack」でルールパックのファイルに書き出す対象となります。「Save」をしていない内容は、「SaveRulepack」でルールパックのファイルに書き出す対象となりません。ここでの「Save」は、編集内容を確定するという意味になります。ここまでの編集内容をルールパックとしてファイルに保存するため、「Save」後に「SaveRulepack」を実行してください。
データを入力
先ほど入力したルールの「EXAMPLE-RULE-001」と紐付けています。
カスタムルールパック作成ルールパックファイルへの保存(再掲)
33
1. ルールパックファイルに保存するため、「File」の「SaveRulepack」を選択します。
2. ダイアログの「RulepackName」と「RulepackVersion」を入力して「Save」ボタンをクリックします。
3. 必要に応じて「ファイル名」を変更して「保存」ボタンをクリックします。
保存するファイル名は、デフォルトでは{Name}_{Version}.jarの形式になります。すでに同名のファイルがある場合は、上書きするかどうかの確認ダイアログが表示されます。
1. 2.
3.
SecureAssistRulepackConfiguratorカスタムルールパックの動作確認
34
カスタムルールパックの動作確認カスタムルールパックの読み込み
35
「SecureAssist」の「FiltersConfiguramon」の「Import」ボタンをクリック
カスタムルールパックを選択して「開く」ボタンをクリック
インポート成功のダイアログの「OK」ボタンをクリック
読み込んだカスタムルールパックのチェックボックスにチェックを入れて有効化
カスタムルールパックの読み込みと有効化が完了しました。
カスタムルールパックの動作確認動作例「信頼できない入力元」
36
SecureAssistのデフォルトのルールパックでは、ProcessBuilderのコンストラクタの引数として信頼できないデータを渡した場合、
重大度Highの問題として指摘するように定義しています。
18行目は、引数が固定の文字列であるため信頼できないデータに該当しないため、問題として検出することはありません。
19行目と20行目は、15行目と16行目での変数への代入が、カスタムルールパックで定義した信頼できない入力元のデータに該当し、これを引数として渡しているため、重大度Highの問題として検出します。
「ソースコード」 「IssueList」
カスタムルールパックの動作確認動作例「重大度Highの問題とガイダンス」
37
ソースコードの14行目と15行目は、引数として信頼できないデータを
受け取っています。そのため、カスタムルールパックでの定義に従い、
重大度Highの問題として検出しています。Guidanceには、カスタムルールパックでの定義通り、この問題に対応
するガイダンスを表示しています。ソースコードの16行目も引数として信頼できないデータを受け取って
いますが、このメソッドについてはカスタムルールパックで定義してい
ないため、これを問題として検出することはありません。また、10行目と11行目は、引数が信頼できないデータに該当しないた
め、これも問題として検出することはありません。
「ソースコード」 「IssueList」
「Guidance」
カスタムルールパックの動作確認動作確認後の配布
カスタムルールパックの配布方法には次の2つの方法があります。1. EnterprisePortalによる配布
– EnterprisePortalにカスタムルールパックをアップロードして配布する方法です。– 具体的な手順は「EnterprisePortal導入ガイド」をご覧ください。
hGps://secureassist.jp/downloads/enterpriseportal/
2. 直接ユーザーにファイルを渡しての配布– 動作確認での手順と同様に、IDEからインポートする方法です。– 本資料の「カスタムルールパックの読み込み」のページをご覧ください。
38
お問い合わせ
39
本資料についてのお問い合わせやサポートのご依頼[email protected]
パートナーシップ・提携 [email protected]
トレーニング・研修 [email protected]
サービス・プロダクトのご購入 [email protected]
ご購入後のサポート [email protected]
広報・取材依頼 [email protected]
その他のお問い合わせ
株式会社アスタリスク・リサーチAsteriskResearch,Inc.hGp://www.asteriskresearch.com/