Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SecureAssist Rulepack Configurator 利用ガイド

963 views

Published on

SecureAssistでは、脆弱性に結びつくソースコードのパターンをルールパックという仕組みで管理しています。そしてこのルールパックをカスタマイズするためツール、Rulepack Configuratorを提供しています。
本資料では、ルールパックについての説明と、Rulepack Configuratorの使い方について紹介します。

2016.04.01 - 初版

Published in: Software
  • Be the first to comment

  • Be the first to like this

SecureAssist Rulepack Configurator 利用ガイド

  1. 1. パッケージのダウンロード ルールパックの説明 カスタムルールの作成 2016.04.01 SecureAssist Rulepack Configurator 利用ガイド Version 3.0対応版
  2. 2. 目次 * 本資料について * Rulepack Configurator概要 Rulepack Configuratorとルールパック ルールパックとIDEでの表示 問題検出の流れ * ルールパックの構成要素 ルールパックの構成要素の一覧 ソース プロパゲーター ルール フィルター ガイダンス * 導入と起動 パッケージのダウンロード Rulepack Configuratorの起動 * カスタムルールパック作成 作成するルールについて 新規ルールパックの作成開始 ソースの編集開始 ソースのデータ入力と保存 ルールパックファイルへの保存 ガイダンスの編集開始 ガイダンスの編集画面 ルールの編集開始 ルールのデータ入力と保存 フィルターの編集開始 フィルターのデータ入力と保存 ルールパックファイルへの保存(再掲) * カスタムルールパックの動作確認 カスタムルールパックの読み込み 動作例「信頼できない入力元」 動作例「重大度Highの問題とガイダンス」 動作確認後の配布 * お問い合わせ 2
  3. 3. 本資料について 本資料では、SecureAssist Rulepack Configuratorに関する、 以下の範囲を取り扱います。 –  パッケージのダウンロードと起動 –  ルールパックについての説明 –  カスタムルールの作成 3
  4. 4. SecureAssist Rulepack Configurator 概要 4
  5. 5. Rulepack Configurator概要 Rulepack Configuratorとルールパック Rulepack Configuratorは、SecureAssistがソースコードのスキャン時に使用するコードの パターンやその重大度、関連するガイダンスを定義するために使用するツールです。 定義した内容は、ルールパックとしてファイルに保存されます。 作成したルールパックは、Enterprise Portalを通じて、Eclipse, IntelliJ IDEA, Visual Studioの 各IDEに配布することができます。 Enterprise Portalへのルールパックの登録については「Enterprise Postal導入ガイド」を ご参照ください。 「Enterprise Portal導入ガイド」は hGps://secureassist.jp/downloads/enterpriseportal/ から ダウンロードできます。 5
  6. 6. Rulepack Configurator概要 ルールパックとIDEでの表示 6 ルールパックでの定義は、IDEでは次の場所に反映されます。 ・ 「ソースコード」中の問題箇所の特定 ・ 「ソースコード」での重大度マークの種別(High, Medium, Low)表示 ・ 「Issue List」と「Project Review」での重大度と問題の種別の表示 ・ 「ガイダンス」の表示内容 「ソースコード」 「Issue List」 「ガイダンス」
  7. 7. Rulepack Configurator概要 問題検出の流れ 7 01: package com.example; 02: 03: import java.sql.Connection; 04: import java.sql.DriverManager; 05: import java.sql.ResultSet; 06: import java.sql.SQLException; 07: import java.sql.Statement; 08: import java.util.Properties; 09: import java.util.logging.Level; 10: import java.util.logging.Logger; 11: import javax.servlet.http.HttpServletRequest; 12: import com.example.Utils; 13: 14: public class Example { 15: private final static String UPDATE_SQL = "SELECT name FROM users WHERE id = "; 16: 17: public String getUserName(HttpServletRequest request) { 18: final Properties props = Utils.loadProperties("properties.xml"); 19: final Logger logger = Logger.getLogger(props.getProperty("log_file")); 20: 21: String userName = null; 22: StringBuffer query = new StringBuffer(); 23: query.append(UPDATE_SQL); 24: query.append(request.getParameter("id")); 25: 26: try ( 27: Connection con = DriverManager.getConnection(props.getProperty("db_connection"), props); 28: Statement stmt = con.createStatement() 29: ) { 30: 31: ResultSet rs = stmt.executeQuery(query.toString()); 32: userName = rs.getString(0); 33: 34: } catch (SQLException e) { 35: logger.log(Level.SEVERE, e.getMessage(), e); 36: } 37: 38: return userName; 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)と呼びます。
  8. 8. SecureAssist Rulepack Configurator ルールパックの構成要素 8
  9. 9. ルールパックの構成要素 ルールパックの構成要素の一覧 9 ルールパックは次の5つの要素から構成されています。 ソース(Sources) 信頼できないデータの入力元を定義します。 プロパゲーター(Propagators) 信頼できないデータの伝搬を定義します。 ルール(Rules) 問題として指摘するコードのパターンを定義します。 フィルター(Filters) ルールごとの重大度や複数のルールからなるカテゴリを定義します。 ガイダンス(Guidances) ユーザーへのガイダンスを定義します。
  10. 10. ルールパックの構成要素 ソース 10 ソースでは、信頼できないデータの入力元を、対応する言語(php, java, cs, vb)、信頼できないデータの 入力元の種別(WEB, DB, FILE, PRIVATE)、対応するクラスやメソッドによって定義します。 <Source lang="java" taint="DB"> <QualifiedName extends="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. 11. ルールパックの構成要素 プロパゲーター 11 プロパゲーターでは、信頼できないデータがメソッドの呼び出しで伝搬していく状態を追跡するための 情報を定義します。 <PropagamonRule lang="java" ruleID="JAVA_PROPAGATOR_007"> <QualifiedName><![CDATA[bjava.lang.Stringb]]></QualifiedName> <Method><![CDATA[bsubstringb]]></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. 12. ルールパックの構成要素 ルール 12 ルールでは、問題として指摘するプログラムの呼び出しのパターンを定義します。 <Rule id="CIGITAL-SQL-002" lang="java"> <Category>Query Injecmon</Category> <Title>SQL Injecmon</Title> <Descripmon>Idenmfies dangerous method calls of the java.sql.Statement class where tainted data was used to build the query to be executed.</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><Standard file="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」内ではこのルールに対応するガイダンスとの紐付けを行っています。
  13. 13. ルールパックの詳細 フィルター フィルターでは、各ルールをIDE上での表示について定義します。 実際のデフォルトルールパックでの記述を例に説明します。 「Problem」の属性である「name="SQL Injecmon"」は、この「Problem」の要素である「Rule」が「SQL Injecmon」というグループに 含まれることを定義しています。 各「Rule」の各属性は、次の内容を表しています。  ・ 「id」は先のルールで定義したidに対応しています。  ・ 「acmve」は、このフィルターの有効無効を定義しています。  ・ 「importance」はこのルールの重大度を定義しています。  ・ 「markerShow」はソースファイル中でこのルールのアイコンを表示非表示を定義しています。 13 <Problem name="SQL Injecmon"> <Rules> <Rule id="CIGITAL-SQL-001" acmve="true" importance="MEDIUM" markerShow="true"/> <Rule id="CIGITAL-SQL-002" acmve="true" importance="HIGH" markerShow="true"/> <Rule id="CIGITAL-SQL-003" acmve="true" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-JAVA-SPRING-JDBC" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-HIBERNATE-01" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-HIBERNATE-02" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-JAVA-SPRING-JDBC-01" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-JAVA-SPRING-ORM-JDO-01" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-JAVA-SPRING-ORM-HIBERNATE-01" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-JAVA-SPRING-ORM-JPA-01" importance="HIGH" markerShow="true"/> <Rule acmve="true" id="CIGITAL-JAVA-JAVAX-PERSISTENCE" importance="HIGH" markerShow="true"/> </Rules> </Problem>
  14. 14. ルールパックの構成要素 ガイダンス ガイダンスは、ルールに対応する説明内容を定義します。 タイトルと説明、対応の仕方、ソースコードの良い例と悪い例、関連するリファレンスなどを、ここで定義しています。 14
  15. 15. SecureAssist Rulepack Configurator 導入と起動 15
  16. 16. 導入と起動 パッケージのダウンロード 16 SecureAssistのWebサイトのDownloadページに、 最新版のRulepack Configuratorのダウンロードリンクがあります。 ここにあるzipファイルをダウンロードしたあと、適切なディレクトリに展開します。 SecureAssist Webサイト hGps://secureassist.jp SecureAssist Rulepack Configurator Downloadページ hGps://secureassist.jp/downloads/enterpriseportal/
  17. 17. 導入と起動 Rulepack Configuratorの起動 17 ダウンロードしたzipファイルを展開した中にある「Rulepack.exe」を実行すると、 Rulepack Configuratorが起動します。 起動時はJDKのインストールされたフォルダーを選択するダイアログが表示されます。 ここで選択後に「OK」ボタンをクリックすると、次回起動時からはこのダイアログは表示されません。 「Rulepack.exe」を実行 JDKの場所を選択 Rulepack Configuratorが起動
  18. 18. SecureAssist Rulepack Configurator カスタムルールパック作成 18
  19. 19. カスタムルールパック作成 作成するルールについて オリジナルのクラスとメッソドに対して、次の内容でカスタムルールを作成する例を紹介します。 1. 信頼できないデータの入力元となるメソッドの定義 –  com.example.Umls のメソッド getEnvironments() とgetSystemInfromamon() を、 信頼できないデータの入力元として定義します。 –  「ソース」がこれに対応します。 2. 引数として信頼できないデータを受け取った時に、Highの問題として検出する定義 –  com.example.Umls のメソッド writeCommand() と executeCommand() を、 信頼できないデータを受け取った時にHighの問題として検出するように定義して、 対応するガイダンスを用意します。 –  「ガイダンス」、「ルール」、「フィルター」がこれに対応します。 19
  20. 20. カスタムルールパック作成 新規ルールパックの作成開始 「File」の「New Rulepack」を選択して、新規ルールパッックの作成を開始します。 既存のルールパックへのルールの追加や更新を行う場合は、「File」の「Open Rulepack」を 選択して、既存のルールパックを開きます。 ツリー表示された「Custom」以下が、カスタムルールで編集できる範囲となります。 SecureAssistのデフォルトルールパックを読み込んだ場合は、「Default」以下にその内容が 表示されます。 20
  21. 21. カスタムルールパック作成 ソースの編集開始 21 右クリックメニューの「New」の「New Sources」を選択します。 ダイアログの「File Name」を入力して「Create」ボタンをクリックすると、 ソースの編集画面が表示されます。 ソースの編集画面 「example-sources」
  22. 22. カスタムルールパック作成 ソースの編集画面 22 ソースの編集画面の表示は「Design」と「Source」の2種類 を切り替えることができます。 「Design」では右クリックメニューで要素や属性を選択しな がら編集することができます。 「Source」ではテキストを直接編集することができます。 「Design」 「Source」 右クリックメニューで編集
  23. 23. カスタムルールパック作成 ソースのデータ入力と保存 <?xml version="1.0" encoding="UTF-8"?> <Sources xmlns:xsi="hGp://www.w3.org/2001/XMLSchema-instance" xsdVersion="2.3.6" xsi:noNamespaceSchemaLocamon="../../schemas/sources_2_3_6.xsd"> <Source lang="java" taint="WEB"> <QualifiedName><![CDATA[com.example.Umls]]></QualifiedName> <Method><![CDATA[(getEnvironments|getSystemInformamon)b]]></Method> </Source> </Sources> 23 ソースのデータを入力して「File」の「Save」を実行します。 「Save」をすることで、「Save Rulepack」でルールパックのファイル に書き出す対象となります。 「Save」をしていない内容は、「Save Rulepack」でルールパックの ファイルに書き出す対象となりません。 ここでの「Save」は、編集内容を確定するという意味になります。 編集内容をファイルに書き出す場合は、「Save」後に 「Save Rulepack」を実行してください。 データを入力 「File」の「Save」を実行
  24. 24. カスタムルールパック作成 ルールパックファイルへの保存 24 1.  ルールパックファイルに保存するため、「File」の「Save Rulepack」を 選択します。 2.  ダイアログの「Rulepack Name」と「Rulepack Version」を入力して 「Save」ボタンをクリックします。 3.  必要に応じて「ファイル名」を変更して「保存」ボタンをクリックします。 保存するファイル名は、デフォルトでは {Name}_{Version}.jar の 形式になります。 すでに同名のファイルがある場合は、上書きするかどうかの 確認ダイアログが表示されます。 1. 2. 3.
  25. 25. カスタムルールパック作成 ガイダンスの編集開始 右クリックメニューの「New」の「New Guidance」を選択します。 ダイアログの「File Name」を入力して「Create」ボタンをクリックすると、 ガイダンスの編集画面が表示されます。 25 「example-001」
  26. 26. カスタムルールパック作成 ガイダンスの編集画面 ガイダンスの編集は、画面の各項目を操作しながら行 うことができます。 「テキスト入力欄」にはそのままテキストを入力すること ができます。 「ボタン」や「タブ」はクリックして操作を行います。 「右クリックメニュー」で編集する画面では、右クリックメ ニューから操作を選択すると、対応するダイアログが表 示されるので、その画面に従いデータを入力します。 ガイダンスを編集したら「File」の「Save」を実行します。 「Save」をすることで、「Save Rulepack」でルールパックの ファイルに書き出す対象となります。 編集内容をファイルに書き出す場合は、「Save」後に 「Save Rulepack」を実行してください。 26 「テキスト入力」 「テキスト入力」 「テキスト入力」 「右クリックメニュー」 「ボタン」 「右クリックメニュー」 「タブ」
  27. 27. カスタムルールパック ルールの編集開始 右クリックメニューの「New」の「New Rules」を選択します。 ダイアログの「File Name」を入力して「Create」ボタンをクリックすると、 ガイダンスの編集画面が表示されます。 Language は、Java, JSP, XML, .NET(C#, VB .NET), PHP などから 選択します。 27 「example_rules.xml」
  28. 28. カスタムルールパック作成 ルールの編集画面 28 ルールの編集画面の表示は「Design」と「Source」の 2種類を切り替えることができます。 「Design」では右クリックメニューで要素や属性を 選択しながら編集することができます。 「Source」ではテキストを直接編集することができます。 「Design」 「Source」 右クリックメニューで編集
  29. 29. カスタムルールパック作成 ルールのデータ入力と保存 <?xml version="1.0" encoding="UTF-8"?> <Rules xmlns:xsi="hGp://www.w3.org/2001/XMLSchema-instance" xsdVersion="2.3.6" xsi:noNamespaceSchemaLocamon="../../../schemas/java_rule_2_3_6.xsd"> <Rule id="EXAMPLE-RULE-001" lang="java"> <Category>Example Category</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> <Standard file="example-001.xml"> <Context>J2EE</Context></Standard> </Standards> </Rule> </Rules> 29 ソースのデータを入力して「File」の「Save」を実行します。 「Save」をすることで、「Save Rulepack」でルールパックのファイルに書き出す対象となります。 「Save」をしていない内容は、「Save Rulepack」でルールパックのファイルに書き出す対象となりません。 ここでの「Save」は、編集内容を確定するという意味になります。 編集内容をファイルに書き出す場合は、「Save」後に「Save Rulepack」を実行してください。 データを入力 先ほどのガイダンス「example-001.xml」と 紐付けています。
  30. 30. カスタムルールパック フィルターの編集開始 右クリックメニューの「New」の「New Filter」を選択します。 ダイアログの「IDE」、「File Name」、「Filter Descripmon」を入力して 「Create」ボタンをクリックすると、ガイダンスの編集画面が 表示されます。 30 「Example」
  31. 31. カスタムルールパック作成 フィルターの編集画面 31 ルールの編集画面の表示は「Design」と「Source」の 2種類を切り替えることができます。 「Design」では右クリックメニューで要素や属性を 選択しながら編集することができます。 「Source」ではテキストを直接編集することができます。 「Design」 「Source」 右クリックメニューで編集
  32. 32. カスタムルールパック作成 フィルターのデータ入力と保存 <?xml version="1.0" encoding="UTF-8"?> <Filter xmlns:xsi="hGp://www.w3.org/2001/XMLSchema-instance" desc="The example filter for tutorial" ide="eclipse" name="Example" version="1458894635476" xsdVersion="1.2" xsi:noNamespaceSchemaLocamon="../../schemas/filter_1_2.xsd"> <Problems> <Problem name="Example001"> <Rules> <Rule importance="HIGH" markerShow="true" acmve="true" id="EXAMPLE-RULE-001" /> </Rules> </Problem> </Problems> </Filter> 32 フィルターのデータを入力して「File」の「Save」を実行します。 「Save」をすることで、「Save Rulepack」でルールパックのファイルに書き出す対象となります。 「Save」をしていない内容は、「Save Rulepack」でルールパックのファイルに書き出す対象となりません。 ここでの「Save」は、編集内容を確定するという意味になります。 ここまでの編集内容をルールパックとしてファイルに保存するため、「Save」後に「Save Rulepack」を 実行してください。 データを入力 先ほど入力したルールの「EXAMPLE-RULE-001」と 紐付けています。
  33. 33. カスタムルールパック作成 ルールパックファイルへの保存(再掲) 33 1.  ルールパックファイルに保存するため、「File」の「Save Rulepack」を 選択します。 2.  ダイアログの「Rulepack Name」と「Rulepack Version」を入力して 「Save」ボタンをクリックします。 3.  必要に応じて「ファイル名」を変更して「保存」ボタンをクリックします。 保存するファイル名は、デフォルトでは {Name}_{Version}.jar の 形式になります。 すでに同名のファイルがある場合は、上書きするかどうかの 確認ダイアログが表示されます。 1. 2. 3.
  34. 34. SecureAssist Rulepack Configurator カスタムルールパックの動作確認 34
  35. 35. カスタムルールパックの動作確認 カスタムルールパックの読み込み 35 「SecureAssist」の「Filters Configuramon」の 「Import」ボタンをクリック カスタムルールパックを選択して 「開く」ボタンをクリック インポート成功のダイアログの 「OK」ボタンをクリック 読み込んだカスタムルールパックのチェックボックスに チェックを入れて有効化 カスタムルールパックの読み込みと 有効化が完了しました。
  36. 36. カスタムルールパックの動作確認 動作例「信頼できない入力元」 36 SecureAssistのデフォルトのルールパックでは、ProcessBuilderのコンストラクタの引数として信頼できないデータを渡した場合、 重大度Highの問題として指摘するように定義しています。 18行目は、引数が固定の文字列であるため信頼できないデータに該当しないため、問題として検出することはありません。 19行目と20行目は、15行目と16行目での変数への代入が、カスタムルールパックで定義した信頼できない入力元のデータに 該当し、これを引数として渡しているため、重大度Highの問題として検出します。 「ソースコード」 「Issue List」
  37. 37. カスタムルールパックの動作確認 動作例「重大度Highの問題とガイダンス」 37 ソースコードの14行目と15行目は、引数として信頼できないデータを 受け取っています。そのため、カスタムルールパックでの定義に従い、 重大度Highの問題として検出しています。 Guidanceには、カスタムルールパックでの定義通り、この問題に対応 するガイダンスを表示しています。 ソースコードの16行目も引数として信頼できないデータを受け取って いますが、このメソッドについてはカスタムルールパックで定義してい ないため、これを問題として検出することはありません。 また、10行目と11行目は、引数が信頼できないデータに該当しないた め、これも問題として検出することはありません。 「ソースコード」 「Issue List」 「Guidance」
  38. 38. カスタムルールパックの動作確認 動作確認後の配布 カスタムルールパックの配布方法には次の2つの方法があります。 1.  Enterprise Portal による配布 –  Enterprise Portalにカスタムルールパックをアップロードして配布する方法です。 –  具体的な手順は「Enterprise Portal導入ガイド」をご覧ください。 hGps://secureassist.jp/downloads/enterpriseportal/ 2.  直接ユーザーにファイルを渡しての配布 –  動作確認での手順と同様に、IDEからインポートする方法です。 –  本資料の「カスタムルールパックの読み込み」のページをご覧ください。 38
  39. 39. お問い合わせ 39 本資料についてのお問い合わせやサポートのご依頼 support@rsrch.jp パートナーシップ・提携 partners@rsrch.jp トレーニング・研修 edu@rsrch.jp サービス・プロダクトのご購入 sales@rsrch.jp ご購入後のサポート support@rsrch.jp 広報・取材依頼 press@rsrch.jp その他のお問い合わせ 株式会社アスタリスク・リサーチ Asterisk Research, Inc. hGp://www.asteriskresearch.com/

×