[go: up one dir, main page]

JP2009169846A - コマンド文構築プログラム,処理方法,および処理装置 - Google Patents

コマンド文構築プログラム,処理方法,および処理装置 Download PDF

Info

Publication number
JP2009169846A
JP2009169846A JP2008009562A JP2008009562A JP2009169846A JP 2009169846 A JP2009169846 A JP 2009169846A JP 2008009562 A JP2008009562 A JP 2008009562A JP 2008009562 A JP2008009562 A JP 2008009562A JP 2009169846 A JP2009169846 A JP 2009169846A
Authority
JP
Japan
Prior art keywords
character string
partial character
constant
command
partial
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2008009562A
Other languages
English (en)
Other versions
JP5145967B2 (ja
Inventor
Takao Okubo
隆夫 大久保
Hidehiko Tanaka
英彦 田中
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2008009562A priority Critical patent/JP5145967B2/ja
Publication of JP2009169846A publication Critical patent/JP2009169846A/ja
Application granted granted Critical
Publication of JP5145967B2 publication Critical patent/JP5145967B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

【課題】 プログラム上で外部プログラム呼び出しコマンドを構築する際に,コマンド文字列内の動的な値によって生じる脆弱性を排除したコマンド文の構築を可能にする。
【解決手段】 文字列生成部10は,利用者のプログラム4の外部プログラム5の呼び出しコマンドに追加される部分文字列を取得し,定数情報をもとに部分文字列の属性(定数/非定数)を判定し,判定結果と結合位置を部分文字列情報記憶部20に記憶する。コマンド文構築時に,コマンド文構築部30は,部分文字列情報をもとに,定数の文字列をテンプレート文にそのまま追加し,非定数の文字列を示すプレースホルダを追加して初期化し,非定数の文字列の値をプレースホルダにバインドして,実行コマンド文を構築する。
【選択図】 図1

Description

本発明は,コンピュータのアプリケーションプログラムのインジェクション系の攻撃や情報漏洩などの脆弱性を防止するため,プログラム開発において,当該脆弱性に対処した安全なコマンド文の実装および確認を行う処理に関する。
Webアプリケーションプログラムでは,SQLやOSコマンドへのインジェクション攻撃やデータ表示時の情報漏洩などの危険性がある。インジェクション攻撃,情報漏洩の脆弱性ついて,プログラム開発時から適切な対策が必要である。
インジェクション攻撃とは,サーバプログラムがクライアントから入力されたデータにもとづいて外部プログラムに何かのコマンドを送信する際に,攻撃者が入力データにコマンドの一部を挿入することにより,外部プログラムに意図しない動作をさせる攻撃をいう。
外部プログラムがリレーショナルデータベースである場合に,コマンドはSQLであり,SQL文を利用した攻撃はSQLインジェション攻撃と呼ばれる。同様に,外部プログラムがOS(オペレーティングシステム)で,コマンドがOSコマンドの場合には,OSコマンドインジェクション攻撃と呼ばれる。
なお,一般的には異なる分類とされているクロスサイトスクリプティング(XSS)攻撃も,外部プログラムをHTMLレンダラ(ブラウザ),コマンドをHTMLと考えれば,本質的な構造はインジェクション攻撃と同じである。
SQLインジェクション攻撃の典型例を説明する。以下のSQL文は,サーバプログラムが,認証時にデータベースに問い合わせを行い,ユーザID,パスワードに一致するデータが存在するときにデータを返すことを想定して構築されたクエリである。

SELECT * FROM utable WHERE user="(userid)" AND pass="(password)"

上記の(userid),(password)の部分には入力データが入る。攻撃者が文字列「" or "a"="a」をパスワードとして入力させると,サーバプログラムが発行するクエリの構文は以下のように変更される。

SELECT * FROM utable WHERE user="dummy" AND pass="" OR "a"="a"

この変更の結果,「a=a」が常に真になり,(password)への入力が任意データであっても認証条件を満たすため,パスワード認証処理が無意味となってしまう。
このインジェクション攻撃の防御手法として,バインドメカニズムが知られている。バインドメカニズムでは,動的な値を埋めこむ位置があらかじめ指定された固定のテンプレート(クエリ文字列)を事前に準備しておき,動的な値は,指定位置のパラメータにバインドさせて文字列に組み込む手法である。
Java(登録商標)のPreparedStatement,PerlのDBI,PHP,PythonのADOdb,VisualBASIC(登録商標)のSQLCommandなどがこれに相当する。
図20に,バインドメカニズムによるインジェクション攻撃防止の仕組みを示す。
図20に示すように,予め準備されたSQL文(PreparedStatement)には,予めパラメータ入力位置が設定されている。そして,パラメータを全て入力文字列として扱うサニタイジング(無害化処理)を行い,パラメータによって構文が変化してしまうという脆弱性に対処している。
このバインド処理によって,攻撃者が「" or "a"="a」のような不正な値を入力した場合でも,準備されたSQL文の構文が変更せず,安全なクエリであることが保証される。
また,インジェクション攻撃に対する防御として,特許文献1に開示されているように,Webサーバ側でパラメータを含むメッセージのチェックポリシーを用意し,脆弱性を生じる入力値を含むメッセージがチェックポリシーに合致するかを判定し,合致するメッセージのみを有効として扱う処理手法もある。
特開2007−4685号公報
しかし,従来のバインドメカニズムによる対策には次のような2つの問題点がある。
(a)パラメータのバインドメカニズムを利用しないプログラミングが脆弱性を生じる: JavaのPreparedStatementのクエリ文字列を構築する際に,図21に示すように,入力値をパラメータとして指定せずに,通常のクエリの部分(文字列)として構築すると,その部分は,入力値であるにもかかわらずバインドされず,無害化処理が機能しないことになる。その結果,入力値がそのままクエリの一部となり,SQLインジェクション攻撃が可能になるおそれがある。
以下に,このような脆弱性を生じるJavaプログラムの例を示す。

String query = “SELECT * FROM user_info WHERE
user=\”” + userid + “\” AND pass=\”” + password + “\””;
PreparedStatement pstmnt = con.prepareStatement(query);
ResultSet rs = pstmnt.executeQuery();

(b)クエリが動的に変化する場合に静的テンプレートの用意が困難になる: 条件分岐,ループなどによって発行され,その実行ごとに動的に変化するクエリである場合に,分岐やループの組み合わせ数だけ静的クエリのテンプレートを用意しなければならない。そのため,コーディング量とバグ発生率の増加を招き,保守性が低下するという問題が生じる。
以下のJavaプログラムはキーワード検索の例であるが,キーの種類が6種類であると仮定すると,1から5までのキー組み合わせ総数62通りのSQLクエリのテンプレートを用意する必要がある。

Statement stmnt = con.createStatement();
String query = "SELECT * FROM user_info ";
Set keyset = map.keySet();
Iterator iter = keyset.iterator();
boolean first = true;
while (iter.hasNext()) {
String key =(String) iter.next();
String[] value = (String[]) map.get(key);
if(value[0] != ""){
if(!first) {
query+= " OR ";
} else {
query+= " WHERE ";
}
query+= key + "=\"" + value[0] + "\"";
first = false;
}
}
ResultSet rs = stmnt.executeQuery(query);

(c)情報出力用のコマンドによって出力するべきではない情報の漏洩が生じる: 例えばデータベースから取得した情報を画面に表示するような場合に,取得情報には開示してもよい情報と秘匿すべき情報とが混在していることがあり,これらの情報は区別して扱う必要がある。しかし,不注意やプログラムミスなどによって,表示するべきでない情報(値)が表示され,情報漏洩を生じるおそれがある。このような脆弱性を生じるJavaプログラムの例を下記に示す。

StringX sx;
sx.add(OutConst.userid); //userID =
sx.add(userid);
sx.add(OutConst.password);// password =
sx.add(password);
String outstr = "userid = " + userid + "password = " + password;
outHTML(outstr);

しかし,システムは,どの情報を秘匿するべきかを判断できないため,プログラムミスによる情報漏洩をシステム的に防止することは困難であった。
本発明は,プログラム上で外部プログラム呼び出しのコマンド文(コマンド文字列)を構築する場合に,コマンド文に含まれる動的な値によって生じる脆弱性を排除した安全なコマンド文の構築処理をコンピュータに実行させるためのプログラム,または,コンピュータが当該コマンド文構築処理を行う処理方法,または,当該コマンド文構築処理を実行する処理装置を提供することを目的とする。
本プログラムを実行するコンピュータは,プログラムのコマンド文を作成する場合に,部分文字列取得処理として,プログラムのコマンド文に追加される部分文字列を取得する。そして,定数部分判定処理として,コマンド文の静的要素(定数)を定義した定数情報をもとに,コマンド文に追加される部分文字列が定数であるかを判定する。
次に,部分文字列情報生成処理として,追加される部分文字列の値,部分文字列が追加される結合位置,および定数部分判定処理の判定結果をもとに部分文字列の属性(定数/非定数)を含む部分文字列情報を生成し,部分文字列情報記憶部に格納する。
その後,前記プログラム実行時など,コマンド文構築が必要になった場合に,コマンド文構築処理として,部分文字列情報記憶部からコマンド文の部分文字列情報を取得し,部分文字列の属性が定数の場合には,部分文字列の値を結合位置に従ってコマンド文の所定のテンプレート文字列にそのまま追加する。または,部分文字列の属性が非定数の場合には,部分文字列に対応する所定の文字を結合位置に従ってテンプレート文字列に追加する。これらの追加処理を行うことによって,前記実行コマンド文を構築する。
そして,前記コマンド文構築処理において,部分文字列の属性が非定数の場合に,前記所定の文字としてプレースホルダをテンプレート文字列の結合位置に追加する。さらに,この非定数の部分文字列の値をパラメータリストに格納し,パラメータリストの部分文字列の値をプレースホルダに設定する処理を行って,前記実行コマンド文を構築する。
本プログラムでは,コマンド文の作成時に,不定の要素が全てパラメータとして扱われる安全なコマンド文を生成することができるため,パラメータ以外の文字列部分に動的な値が組み込まれることによってバインドメカニズムによる無害化処理をすり抜ける部分を持つコマンド文を排除することができる。
また,プログラム上で動的にコマンド文を構築するため,バインドメカニズムによる対応が困難な構成のコマンド文であっても定数部分と非定数部分とを区別して構築することができ,プログラム実行時のインジェクション攻撃に対する脆弱性を除去することができる。
また,本プログラムでは,前記コマンド文構築処理において,コマンド文が情報出力を行うものである場合に,プレースホルダにパラメータリストの部分文字列の値の代わりに所定の表示文字列をバインドする処理を,前記コンピュータに実行させることができる。
また,本プログラムは,前記コマンド文構築処理において,コマンド文が情報出力を行うものである場合に,属性が非定数の部分文字列について,この部分文字列の値の代わりに所定の表示文字列を結合位置に追加する処理を行うことによって,実行コマンド文を構築する処理を,前記コンピュータに実行させることができる。
さらに,表示文字列として,乱数を発生させて用いてもよい。
これにより,プログラムミスがある場合でも,出力するべきでない情報が所定の定数値(表示文字列)で設定され,外部プログラムに渡されるため,明示的に定義されない限り非定数の部分はパラメータとみなされて隠蔽される。よって,プログラムミスによる情報漏洩を防止する処理が優先的に行われる安全なコマンド文を構築することができる。
また,本プログラムは,さらに,ユーザによって指示された部分文字列の属性を定数とする定数化指定処理を,前記コンピュータに実行させることができる。
これにより,ユーザ指示などによる明示的な設定によって,パラメータの出力または隠蔽を任意に設定することができるため,情報漏洩の防止を図りつつ柔軟なプログラミングを支援することができる。
なお,本プログラムは,コンピュータが読み取り可能な可搬媒体メモリ,半導体メモリ,ハードディスクなどの適当な記録媒体に格納することができ,これらの記録媒体に記録して提供され,または,通信インタフェースを介して種々の通信網を利用した送受信により提供される。
本発明によれば,プログラム開発においてコマンド文を生成する場合に,コマンド文に追加される部分文字列の定数/非定数の属性を判断し,部分文字列の属性に応じて異なる処理を行ってコマンド文構築のための情報を生成し,コマンド文構築が必要になった場合に,プログラム上で非定数の部分文字列をパラメータとしてコマンドのテンプレート文に追加することができる。これにより,コマンド文に含まれる動的な値によって生じるインジェクション攻撃に対する脆弱性に対処した安全なコマンド文構築を行うことができる。
また,コマンド文が外部からの取得値を出力するものである場合に,取得値を非定数の属性を持つ部分文字列として扱うため,表示用の定数値で置き換えて出力することができる。よって,プログラムミスなどによる情報漏洩の危険性を排除した安全なコマンド文構築を行うことができる。
以下,本発明の最良の実施形態を,コンピュータ・ソフトウェアのJavaプログラムによって実施するコマンド文構築処理装置を例に説明する。
コマンド文構築処理装置は,次の特徴を備える。
(1)コマンド文構築処理装置は,処理手段として,外部プログラム呼び出し用のインタフェースを具備する手続きライブラリを用意する。ここで,外部プログラム呼び出しに,表示画面への表示処理も含む。
なお,プログラミングにおいて,外部プログラム呼び出しでは,コマンド文構築処理装置で用意された手続きライブラリのみを用い,他の手段は用いないというルールのもとで行われる。
(2)コマンド文構築処理装置の各処理手段としての手続きライブラリは,手続き実行の引数として,下記の機能を具備するデータ構造型を受け付ける。
(a)コマンド文への部分文字列追加のための手続きインタフェースを具備する。
(b)前記(1)のインタフェースの実行時に受け付けた部分文字列が「定数かどうか」を判定し,その判定結果と共に部分文字列の値をそのまま格納する。この時点で,受け付けた部分文字列の結合操作を行う必要がない。
(3)前記(1)の各手続きライブラリは,前記(1)のインタフェース実行時に,各部分文字列の構成要素が定数または非定数の場合に分けて,それぞれに応じた処理をコンテキスト(文中の前後関係)に応じて行い,プログラムを実行する。
これにより,インジェクション防止,情報漏洩防止などが図られ,安全なプログラム実行が実現できる。
図1は,コマンド文構築処理装置1の構成例を示す図である。
コマンド文構築処理装置1は,文字列生成部10,部分文字列情報記憶部20,コマンド文構築部30,および乱数生成部40を備える。
文字列生成部10は,利用者のプログラム4において,外部プログラム5を呼び出すためにコマンド文を作成する場合に,コマンド文に追加される文字列を受け付けるインタフェースを備え,追加される部分文字列の定数/非定数の属性を判断し,部分文字列情報を部分文字列情報記憶部20に格納する処理手段である。
また,文字列生成部10は,利用者のプログラム4で使用されるコマンド文の静的要素である定数を定義した定数情報を保持しているものとする。
文字列生成部10は,文字列追加部11,定数部分判定部13,部分文字列情報生成部15,定数化設定部17を備える。
文字列追加部11は,利用者のプログラム4で外部プログラム5の呼び出し用のコマンド文が作成される時に,コマンド文に追加される部分文字列を受け付ける処理部である。
定数部分判定部13は,定数情報をもとに,文字列追加部11が受け付けた部分文字列が静的要素(定数)であるかを判定する処理手段である。部分文字列が定義情報に定義された静的要素であれば,その属性を定数と判断する。一方,部分文字列が静的要素でなく動的な値であれば,その属性を非定数と判断する。
部分文字列情報生成部15は,部分文字列の部分文字列情報を生成し,部分文字列情報記憶部20に格納する処理手段である。
部分文字列情報は,追加された部分文字列の値,その部分文字列がコマンド文に追加される位置(結合位置),定数/非定数の属性などを含む。
定数化設定部17はユーザによって指定された部分文字列について,その属性を定数に設定する処理手段である。この設定によって,部分文字列が定数情報に該当しない要素であっても,部分文字列情報の属性に定数が設定される。
部分文字列情報記憶部20は,部分文字列情報を記憶する記憶部である。
コマンド文構築部30は,外部プログラム5の呼び出しコマンドの実行時など,コマンド文の構築が必要になったときに,コマンドのコンテキストに対応して具備する処理部を起動する処理手段である。
コマンド文構築部30は,SQL呼び出し部31,OSコマンド呼び出し部33,HTML生成部35,出力情報生成部37,バインド処理部39を備える。
SQL呼び出し部31は,コマンドがSQLである場合に,外部プログラム5(リレーショナルデータベースなど)への呼び出しに対応するコマンド文を構築する処理部である。SQL呼び出し部31は,部分文字列情報にもとづいて,コマンドのテンプレート文(SQL文)に対し,定数の部分文字列を結合位置にそのまま追加する。また,非定数の部分文字列に対応するプレースホルダ(?)を結合位置に追加する。さらに,非定数の部分文字列の値を,パラメータとしてパラメータリスト310に保持する。
SQL呼び出し部31によって,SQLインジェクション攻撃へ対処することができる。
OSコマンド呼び出し部33は,コマンドがOSコマンドである場合に,外部プログラム5(OSなど)への呼び出しに対応するコマンド文を構築する処理部である。OSコマンド呼び出し部33は,部分文字列情報にもとづいて,OSコマンドのテンプレート文に対し,定数の部分文字列を結合位置にそのまま追加する。また,非定数の部分文字列に対応するプレースホルダを結合位置に追加する。さらに,非定数の部分文字列の値をパラメータリスト310に保持する。
OSコマンド呼び出し部33によって,OSコマンドインジェクション攻撃へ対処することができる。
HTML生成部35は,コマンドがHTML生成である場合に,外部プログラム5へのHTML出力に対応するコマンド文を構築する処理部である。HTML生成部35は,HTMLのテンプレート文に対し,定数の部分文字列を結合位置にそのまま追加する。また,非定数の部分文字列に対応するプレースホルダを結合位置に追加する。さらに,非定数の部分文字列の値を,パラメータリスト310に保持する。
HTML生成部35によって,クロスサイトスクリプティング攻撃へ対処することができる。
出力情報生成部37は,コマンドが情報出力(例えば,出力画面の生成など)を行うものである場合に,外部プログラム5(例えば,表示装置など)へのコマンドに対応するコマンド文を構築する処理部である。出力情報生成部37は,情報出力コマンドのテンプレート文に対し,定数の部分文字列を結合位置にそのまま追加する。また,非定数の部分文字列の代わりとして所定の表示文字列(例えば,アスタリスク文字列)を結合位置に追加する。
出力情報生成部37によって,情報漏洩を防止することができる。
バインド処理部39は,SQL呼び出し部31,OSコマンド呼び出し部33,またはHTML生成部35によって,コマンドなどのテンプレート文に追加された非定数の部分文字列に対応するプレースホルダへ,パラメータリスト310に記憶された部分文字列の値をパラメータとして設定する処理部である。
乱数生成部40は,表示文字列として用いられる乱数を生成する処理手段である。
図2に,コマンド文構築処理装置1の処理フローを示す。
コマンド文構築処理装置1は,利用者のプログラム4の作成処理中に,外部プログラム5への呼び出しコマンド文を作成しようとすると(ステップS1のYES),文字列生成部10が,コマンド文に追加される部分文字列を受け付け,部分文字列の属性判定および部分文字列情報作成などを行う処理(部分文字列作成処理)を実行する(ステップS2)。
その後,外部プログラム5の呼び出し実行によってコマンドの構築が必要になると(ステップS3のYES),コマンド文構築部30が,呼び出す外部プログラム5に対応するコマンド文の構築および実行を行う処理(コマンド文構築処理)を実行する(ステップS4)。
[部分文字列作成処理]
図3は,部分文字列作成処理(ステップS2)の処理フローを示す図である。
文字列生成部10の文字列追加部11は,利用者のプログラム4において,コマンド文が作成されるときに,コマンド文に追加される部分文字列を順に受け付ける(ステップS20)。ここで,利用者のプログラム4において,図4に示すSQLのコマンド文(select)が作成されるものとする。
定数部分判定部13は,予め保持している定数情報(コマンドの静的要素(定数)の定義)をもとに,追加された部分文字列が定数であるかを判定する(ステップS21)。追加された部分文字列が定数情報に該当する場合は(ステップS21のYES),その部分文字列に定数の属性を付与し(ステップS22),定数情報に該当しない場合は(ステップS21のNO),その部分文字列に非定数の属性を付与する(ステップS23)。
そして,部分文字列情報生成部15は,追加される部分文字列ごとに,部分文字列の値,部分文字列が追加される位置(結合位置),定数/非定数のいずれかの属性を含む部分文字列情報を生成し,部分文字列情報記憶部20に格納する(ステップS24)。
ここで,図4に示すコマンド文として,追加された文字列のうち,ユーザID(id)とパスワード(password)についてユーザ入力された部分文字列(okubo)と(pass)は,定数情報に定義されていないので,非定数の文字列と判定される。
図5に,部分文字列情報の例を示す。
部分文字列情報として,文字列追加部11が受け付けた部分文字列のすべてについて,文字列の値,定数部分判定部13で判定された属性情報,結合のための位置情報が記録される。
例えば,1行目の部分文字列「SELECT * FROM utable WHERE id=“」は,定数情報に定義された要素(定数)であり,テンプレート文の第1番目の文字位置から第31番目の文字位置に結合されることを示す。また,2行目の部分文字列「okubo」は,定数情報に定義された要素ではないので,属性が非定数であり,部分文字列がテンプレート文の第32番目から第36番目の文字位置に結合されることを示す。
[SQLコマンドのコマンド文構築処理]
利用者のプログラム4で外部プログラム5の呼び出しコマンドの構築が必要となった場合に,コマンド文構築部30は,呼び出しコマンドのコンテキストに対応する呼び出し部を選択して起動する。
呼び出しコマンドがSQLに関するものである場合に,SQL呼び出し部31が起動される。
図6に,コマンドがSQL呼び出しである場合のコマンド文構築処理(ステップS4)の処理フローを示す。
SQL呼び出し部31は,部分文字列情報記憶部20から,該当するコマンド文の部分文字列情報を取得し(ステップS400),部分文字列を1つずつ取り出す(ステップS401)。
そして,部分文字列の属性を調べて(ステップS402),部分文字列の定数が属性であれば(ステップS402のYES),コマンドのテンプレート文に部分文字列の値をそのまま追加する(ステップS403)。
一方,部分文字列の属性が非定数であれば(ステップS402のNO),部分文字列の値をパラメータリスト310に追加し(ステップS404),コマンドのテンプレート文に非定数の部分文字列に対応する文字としてプレースホルダ(?)を追加する(ステップS405)。
例えば,図5に示す部分文字列情報では,2番目の部分文字列「okubo」と4番目の部分文字列「pass」は,ユーザ入力値であり非定数と判定される。したがって,SQL呼び出し部31は,2,4番目の非定数の部分文字列に相当する位置にプレースホルダ「?0」,「?1」を設定し,パラメータリスト310に部分文字列の値を記録する。
図7に,パラメータリスト310の例を示す。パラメータリスト310には,プレースホルダのインデックスと部分文字列の値が記録される。
部分文字列情報の部分文字列すべてについてステップS401〜S405の処理を行い,全ての部分文字列に対する処理が終了したら(ステップS406のYES),部分文字列を追加したテンプレート文で,実行コマンド文(PreparedStatement)を初期化する(ステップS407)。
次に,バインド処理部39は,図8に示すように,初期化されたコマンド文のプレースホルダにパラメータリスト310の部分文字列の値を設定する(ステップS408)。
そして,コマンド文構築部30によって,部分文字列の値がバインドされたSQLコマンド文(PreparedStatement)が実行される(ステップS409)。
[OSコマンドのコマンド文構築処理]
利用者のプログラム4の外部プログラム5の呼び出しコマンドがOSコマンドに関するものである場合には,OSコマンド呼び出し部33が起動される。本例では,利用者のプログラム4で,図9(A)に示すOSコマンド(ファイル情報表示および検索)が作成されるとする。
図3の処理フローに示すように,文字列追加部11によってOSコマンドに追加される部分文字列が受け付けられ,定数部分判定部13によって受け付けた部分文字列の属性が判定され,文字列生成部10によって,図9(B)に示す部分文字列情報が生成され記憶されているとする。
図10に,コマンドがOSコマンドである場合のコマンド文構築処理(ステップS4)の処理フローを示す。
図10に示す処理フローのステップS410〜S419の処理は,図6のステップS400〜S409の各処理に対応する。OSコマンド呼び出し部33が,ステップS410〜S417の処理を行い,図11(A)に示すパラメータリスト310が保持される。そして,バインド処理部39が,ステップS418の処理を行い,図11(B)に示すようにプレースホルダに部分文字列をバインドする。これにより,図9(A)のOSコマンドの実行が可能となる。
[HTMLのコマンド文構築処理]
利用者のプログラム4において外部プログラム5へ出力するHTMLが生成される場合に,HTML生成部35が起動される。本例では,図12(A)に示すHTMLが記述され,図3に示す処理フローにしたがって,図12(B)に示す部分文字列情報が生成され記憶されているとする。
図13に,HTML生成の場合のコマンド文構築処理(ステップS4)の処理フローを示す。
図13に示す処理フローのステップS420〜S429の処理は,図6のステップS400〜S409の各処理にほぼ対応する。そして,HTML生成部35が,ステップS420〜S427の処理を行い,バインド処理部39がステップS428の処理を行う。
ただし,ステップS428の処理において,ステップS408の処理と同様に,プレースホルダに部分文字列の値をバインドするが,さらに,既知の手法によって,パラメータのサニタイジング(無害化処理)を行う。
また,ステップS429の処理では,コマンド文構築部30が,バインドされたHTMLを外部プログラム5へ出力する。
[情報出力のコマンド文構築処理]
利用者のプログラム4において,外部プログラム5へ情報出力を行う場合には出力情報生成部37が起動される。
例えば,表示装置にデータベースから取得した情報を表示させる場合に,データ表示コマンドに,データベースからの取得値が組み込まれる。データベースから「氏名」「年齢」のデータ項目について「(大久保 隆代)」「(28)」を得たときに,通常では,以下のとおり情報がすべて表示される。

氏名=(大久保 隆代);年齢=(28)

プライバシー保護の観点などから,データ項目の情報を非表示/代替表示とするプログラミングが必要な場合でも,プログラムミスによって表示させてしまうおそれがある。
文字列生成部10では,データベースから取得した情報(値)は定数情報に定義されていないため,属性が非定数となり,図14に示す部分文字列情報を生成する。
そこで,利用者のプログラム4で外部プログラム5(表示装置)へデータベースの取得値を表示するコマンドが実行される場合に,出力情報生成部37は,コマンドのテンプレート文に対し,定数の部分文字列の値「氏名」「年齢」を結合位置でそのまま追加し,非定数の部分文字列の値「(大久保 隆代)」「(28)」の代わりに,表示文字列(アスタリスク文字列)を追加する。
また,出力情報生成部37は,乱数生成部40によって生成された乱数を,表示文字列として使用することができる。
これにより,データベースの情報が図15(A)に示すように表示され,プログラムミスによる不用意な表示処理から生じる情報漏洩を防止することができる。
さらに,アプリケーションによっては,データベースからの取得情報に,表示対象と非表示の対象とが混在する場合がある。一例として,「氏名」の情報を表示し「年齢」の情報を非表示とする場合がある。
この場合に,定数化設定部17によって出力対象とする取得値を設定することができる。定数化設定部17はインタフェースを備え,ユーザ指示によって出力対象として部分文字列情報の2番目の部分文字列「大久保 隆代」が指定されると,この部分文字列の属性を非定数から定数へ変更する。
この属性変更によって,出力情報生成部37が,属性が定数の部分文字列の値(大久保 隆代)をそのままコマンドのテンプレートに追加するので,図15(B)に示すように,データベースの「氏名」の情報(大久保 隆代)が表示され,また,それ以外の非定数の部分文字列の値は,表示文字列(アスタリスク文字列,乱数)が表示される。
図16に,コマンドが情報出力である場合のコマンド文構築処理(ステップS4)の処理フローを示す。
出力情報生成部37は,部分文字列情報記憶部20から表示対象となる部分文字列情報(データベースのデータ)を取得し(ステップS430),各項目(部分文字列)を1つずつ取り出す(ステップS431)。
そして,部分文字列の属性を判定し(ステップS432),部分文字列の定数が属性であれば(ステップS432のYES),情報出力コマンドのテンプレート文に部分文字列の値をそのまま追加する(ステップS433)。
一方,部分文字列の属性が非定数であれば(ステップS432のNO),表示文字列を生成し(ステップS434),コマンドのテンプレート文に生成した表示文字列を追加する(ステップS435)。
部分文字列情報の部分文字列すべてについてステップS431〜S435の処理を行い,全ての部分文字列に対する処理が終了したら(ステップS436のYES),部分文字列を追加したコマンドのテンプレート文を引数とした外部プログラム5の呼び出しを実行する(ステップS437)。
以下,本発明のより具体的な実施例を示す。
実施例において,コマンド文構築処理装置1は,文字列生成部10,およびSQL呼び出し部31を備えるコマンド文構築部30を備えるものとする。コマンド文構築処理装置1は,Javaプログラムとして実装される。
[実施例1]
実施例1において防御対象となるインジェクション攻撃を説明する。攻撃の一例として,攻撃者が,ユーザ入力でなく,一旦メモリ上やデータベースに格納された値を利用してインジェクション攻撃(セカンドオーダーSQLインジェクション攻撃)を行う場合が考えられ,以下のような状態が想定される。
まず,攻撃者が,ユーザ登録時に「’admin’--」というユーザIDで登録しておく。
ここで,パスワード変更時に以下のSQL呼び出しを実行するようにプログラムが書かれているとする。

sql="select * from users where username='" + username + "'
and password='" + oldpassword"'";
sql="update users set password='"
+ newpassword + "' where username='" + rso("username") + "'";

すると,登録されたユーザIDにより,上記コードの3,4行目のSQLは以下のように変えられ,“admin”のパスワードが攻撃者によって変更されてしまう。

update users set password='passwd2' where username='admin'--'

したがって,ユーザ入力値のみを対象としてサニタイズやバインドメカニズムの適用を行っていると,セキュリティ対策の対象外となっているような値,過去に入力された値やデータベースに格納されている値など,を利用されて攻撃されるおそれがある。前述のコード例では,SQL呼び出しの下段(3,4行目)のSQLの"username"が,データベースに格納された値であるために,サニタイズやバインドメカニズムの対象から漏れてしまうことが原因となっている。
このような攻撃に対処できるコマンド文構築処理装置1の構成と動作を説明する。
(1)文字列生成部10は,以下に示すSQLの静的構文要素を定義する定義情報を備える。

- select * from users where username=
- and password=
- update users set password=
- where username=

また,文字列生成部10は,以下のインタフェース(文字列追加部11に相当する機能)を持つ。

public class StringX {
public void add(Object o){
}
}

(2)プログラマが,文字列生成部10のインタフェースを用いて,SQLクエリを構築する文字列を以下のように記述する。

StringX sx;
...
sx.add{QCOnst.SELECT}; //select * from users where username=
sx.add(username);
sx.add(QConst.AND); //and password=
sx.add(oldpassword);
....
sx.add(QCOnst.UPDATE); //update users set password=
sx.add(newpassword);
sx.add(QConst.WHERE); // where username=
sx.add(username);

(3)前記StringX#add(),すなわち文字列生成部10のインタフェースが実行された場合に,add()内部では以下の処理が実行される。
(3a)add()の引数(Object)が,定数かどうかを判定する(定数部分判定部13に相当する機能)。本実施例では,定数かどうかは,そのObjectが指定されたenum型(QConst)であるかどうかで判断する。
(3b)定数のものには定数フラグを付与し,部分文字列情報記憶部20に格納する。上記(2)の最後4行のコードが実行された時点で,部分文字列情報記憶部20に格納されている部分文字列情報は,図17(A)に示すとおりになる。
(4)プログラマは,コマンド文構築処理装置1の一部として用意された,安全なSQL実行インタフェースSqfeExec#execSQL()を,sxを引数として実行するプログラム4を記述する。そして,execSQL実行時には以下の処理が行われる。
(4a)部分文字列を順に調べ,部分文字列が定数であれば,PreparedStatementの構成文字列qに追加する。
(4b)部分文字列が定数でなければ,部分文字列の値をパラメータリスト310に追加し,上記文字列qにはプレースホルダ(?)を追加する。
(4c)前記(4a),(4b)の処理が完了すると,図17(B)に示すPreparedStatementの初期化文字列と,図17(C)に示すパラメータリスト310が得られる。
(4d)次に,得られた初期化文字列を用いてPreparedStatementの初期化が行われ,プレースホルダにパラメータリスト310の値(パラメータ)がバインドされる。そして,PreparedStatement.executeQuery()によりSQL実行が行われる。
以上の処理が実行された場合に,攻撃者によって過去に登録されたユーザID「admin'--」は,値そのものがパラメータとして扱われるため,「'--」(以降を無視する)が構文を変更する要素として機能しない。これにより,セカンドオーダーSQLインジェクション攻撃を防御することができる。
また,利用者が定数として定義すべき箇所を誤ってそのまま入力させた場合,例えば,前記コードにおいて「update users set...」の部分を定数として定義しない場合には,その部分文字列が,非定数すなわちパラメータとみなされ,生成されるPreparedStatementの初期化文字列は以下のとおりになる。

?? and where userid=?

このようなコードは,PreparedStatementの構文として不正であってエラーとなるため,プログラムミスとして検出が可能になる。
[実施例2]
さらに,実施例2として,プログラマがプログラムミスにより,データベースから取得した非表示とするべき情報を誤って表示させてしまう場合を想定する。例えば,プログラマが,本来表示すべきでないユーザID,パスワードを誤って表示させるプログラムを書くとする。
コマンド文構築処理装置1では,出力に,コマンド構築部30の各手段として用意した出力ライブラリを必ず用いることになる。そこで,プログラマは以下のように記述する。

StringX sx;
sx.add(OutConst.userid); //userID =
sx.add(userid);
sx.add(OutConst.password);// password =
sx.add(password);
SafeExec.outHTML(sx);

前記のコードにおいて,sx.add()では実施例1と同様に,追加された部分文字列が定数かどうかの判別が行われるので,最終的に生成される部分文字列の構造は,図18に示す部分文字列情報のとおりとなる。
また,SafeExec.outHTML()(HTML生成部35のインタフェースに相当)の実行時において,部分文字列が非定数の場合には実際の部分文字列の値(文字)の代わりに「*」が出力される。その結果,HTMLに出力される文字列は下記の通りとなる。

user ID = ***** password = *****

これにより,非表示とする情報を誤って表示させるというプログラムミスがあっても,情報漏洩を防止することができる。
さらに,データベースからの取得値の一部だけを隠蔽する場合には,部分文字列の追加時に,明示的に「定数」とみなす部分文字列を特定する機能(定数化設定部17に相当)によって,データベースからの取得値のうち表示させる情報を特定することができる。
一例として,パスワードは隠したいが,ユーザIDはそのまま表示させたい場合に,プログラマは前記のコードの代わりに下記のように記述する。

StringX sx;
sx.add(OutConst.userid); //userID =
sx.addConst(userid);
sx.add(OutConst.password);// password =
sx.add(password);
SafeExec.outHTML(sx);

String#addConst()(定数化設定部17のインタフェース,文字列追加部11に相当)は,文字列が追加された時に,それを強制的に定数とみなして部分文字列に追加する。
この結果,生成される部分文字列情報は,図19に示すとおりとなり,以下のようなHTML出力となる。

user ID = admin password = *****

以上,本発明をその実施の形態により説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。
本発明の実施の形態におけるコマンド文構築処理装置の構成例を示す図である。 本発明の実施の形態におけるコマンド文構築処理装置の処理フローを示す図である。 本発明の実施の形態における部分文字列作成処理の処理フローを示す図である。 本発明の実施の形態において,作成されるSQLコマンド文の例を示す図である。 本発明の実施の形態における部分文字列情報の例を示す図である。 コマンドがSQL呼び出しである場合のコマンド文構築処理の処理フローを示す図である。 コマンドがSQL呼び出しである場合のパラメータリストの例を示す図である。 コマンドがSQL呼び出しである場合のバインド例を示す図である。 OSコマンドが作成される場合に,作成されるOSコマンドおよび部分文字列情報の例を示す図である。 コマンドがOSコマンド呼び出しである場合のコマンド文構築処理の処理フローを示す図である。 コマンドがOSコマンド呼び出しである場合のパラメータリストおよびバインド例を示す図である。 HTMLが作成される場合に,作成されるHTMLおよび部分文字列情報の例を示す図である。 HTMLが作成される場合のコマンド文構築処理の処理フローを示す図である。 コマンドが情報出力の場合に,作成される部分文字列情報の例を示す図である。 コマンドが情報出力の場合の情報出力の例を示す図である。 コマンドが情報出力である場合のコマンド文構築処理の処理フローを示す図である。 コマンドが情報出力である場合の部分文字列情報,情報出力のコマンド,パラメータリスト例を示す図である。 実施例1における部分文字列情報の例を示す図である。 実施例2における情報出力の例を示す図である。 バインドメカニズムによるインジェクション攻撃防止の仕組みを説明するための図である。 バインドメカニズムが有効でない場合を説明するための図である。
符号の説明
1 コマンド文構築処理装置
10 文字列生成部
11 文字列追加部
13 定数部分判定部
15 部分文字列情報生成部
17 定数化設定部
20 部分文字列情報記憶部
30 コマンド文構築部
31 SQL呼び出し部
33 OSコマンド呼び出し部
35 HTML生成部
37 出力情報生成部
39 バインド処理部
310 パラメータリスト
4 利用者のプログラム
5 外部プログラム

Claims (8)

  1. 部分文字列情報記憶部を備えるコンピュータに,
    プログラムのコマンド文に追加される部分文字列を取得する部分文字列取得処理と,
    前記コマンド文の静的要素を定義した定数情報をもとに,前記追加される部分文字列が定数であるかを判定する定数部分判定処理と,
    前記部分文字列の値,当該部分文字列が追加される結合位置,および前記定数部分判定処理の判定結果をもとに前記部分文字列が定数または非定数のいずれかを示す属性を含む部分文字列情報を生成して前記部分文字列情報記憶部に格納する部分文字列情報生成処理と,
    前記コマンド文を構築する場合に,前記部分文字列情報記憶部から前記コマンド文の部分文字列情報を取得し,前記部分文字列の属性が定数の場合に当該部分文字列の値を結合位置に従って前記コマンド文の所定のテンプレート文字列に追加する処理と,または前記部分文字列の属性が非定数の場合に当該部分文字列に対応する所定文字を結合位置に従って前記テンプレート文字列に追加する処理とを行うことによって,前記実行コマンド文を構築するコマンド文構築処理とを
    実行させるためのコマンド文構築プログラム。
  2. 前記コマンド文構築処理において,前記属性が非定数の部分文字列について,前記文字として所定のプレースホルダを前記テンプレート文字列の結合位置に追加し,当該非定数の部分文字列の値をパラメータリストに格納し,前記パラメータリストの部分文字列の値を前記プレースホルダに設定する処理を行うことによって,前記実行コマンド文を構築する処理を,
    前記コンピュータに実行させるための請求項1に記載のコマンド文構築プログラム。
  3. 前記コマンド文構築処理において,前記コマンド文が情報出力を行うものである場合に,前記プレースホルダに前記パラメータリストの部分文字列の値の代わりに所定の表示文字列を設定する処理を,
    前記コンピュータに実行させるための請求項2に記載のコマンド文構築プログラム。
  4. 前記コマンド文構築処理において,前記コマンド文が情報出力を行うものである場合に,前記属性が非定数の部分文字列について,当該部分文字列の値の代わりに所定の表示文字列を結合位置に追加する処理を行うことによって,前記実行コマンド文を構築する処理を,
    前記コンピュータに実行させるための請求項1に記載のコマンド文構築プログラム。
  5. ユーザによって指示された部分文字列の属性を定数とする定数化指定処理を,
    前記コンピュータに実行させるための請求項3または請求項4に記載のコマンド文構築プログラム。
  6. 前記出力コマンド文構築処理において,任意の数列または文字列である乱数を生成し,前記表示文字列として用いる
    ことを特徴とする請求項3または請求項4に記載のコマンド文構築プログラム。
  7. 部分文字列情報記憶部を備えるコンピュータが実行する処理方法であって,
    プログラムのコマンド文に追加される部分文字列を取得する部分文字列取得過程と,
    前記コマンド文の静的要素を定義した定数情報をもとに,前記追加される部分文字列が定数であるかを判定する定数部分判定過程と,
    前記部分文字列の値,当該部分文字列が追加される結合位置,および前記定数部分判定処理の判定結果をもとに前記部分文字列が定数または非定数のいずれかを示す属性を含む部分文字列情報を生成して前記部分文字列情報記憶部に格納する部分文字列情報生成過程と,
    前記コマンド文を構築する場合に,前記部分文字列情報記憶部から前記コマンド文の部分文字列情報を取得し,前記部分文字列の属性が定数の場合に当該部分文字列の値を結合位置に従って前記コマンド文の所定のテンプレート文字列に追加する処理と,または前記部分文字列の属性が非定数の場合に当該部分文字列に対応する所定文字を結合位置に従って前記テンプレート文字列に追加する処理とを行うことによって,前記実行コマンド文を構築するコマンド文構築過程とを,
    備えるコマンド文構築処理方法。
  8. プログラムのコマンド文に追加される部分文字列を取得する部分文字列取得部と,
    前記コマンド文の静的要素を定義した定数情報をもとに,前記追加される部分文字列が定数であるかを判定する定数部分判定部と,
    前記部分文字列の値,当該部分文字列が追加される結合位置,および前記定数部分判定処理の判定結果をもとに前記部分文字列が定数または非定数のいずれかを示す属性を含む部分文字列情報を生成して部分文字列情報記憶部に格納する部分文字列情報生成部と,
    前記コマンド文を構築する場合に,前記部分文字列情報記憶部から前記コマンド文の部分文字列情報を取得し,前記部分文字列の属性が定数の場合に当該部分文字列の値を結合位置に従って前記コマンド文の所定のテンプレート文字列に追加する処理と,または前記部分文字列の属性が非定数の場合に当該部分文字列に対応する所定文字を結合位置に従って前記テンプレート文字列に追加する処理とを行うことによって,前記実行コマンド文を構築するコマンド文構築部とを
    備えるコマンド文構築処理装置。
JP2008009562A 2008-01-18 2008-01-18 コマンド文構築プログラム,処理方法,および処理装置 Expired - Fee Related JP5145967B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008009562A JP5145967B2 (ja) 2008-01-18 2008-01-18 コマンド文構築プログラム,処理方法,および処理装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008009562A JP5145967B2 (ja) 2008-01-18 2008-01-18 コマンド文構築プログラム,処理方法,および処理装置

Publications (2)

Publication Number Publication Date
JP2009169846A true JP2009169846A (ja) 2009-07-30
JP5145967B2 JP5145967B2 (ja) 2013-02-20

Family

ID=40970910

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008009562A Expired - Fee Related JP5145967B2 (ja) 2008-01-18 2008-01-18 コマンド文構築プログラム,処理方法,および処理装置

Country Status (1)

Country Link
JP (1) JP5145967B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2021022358A (ja) * 2019-07-26 2021-02-18 広東叡江云計算股▲分▼有限公司Guangdong Eflycloud Computing Co., Ltd phpに基づく独立型sqlインジェクション防御分析通知方法及びそのシステム

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6120129A (ja) * 1984-07-06 1986-01-28 Hitachi Ltd 複数コ−ド系情報処理方式
JPH0259952A (ja) * 1988-08-26 1990-02-28 Nec Corp アクセス権情報の保護方式
JPH05298116A (ja) * 1992-04-23 1993-11-12 Hokkaido Nippon Denki Software Kk コンパイラシステム
JPH0695890A (ja) * 1992-09-10 1994-04-08 Toyo Commun Equip Co Ltd コンパイラにおける名前置換方式
JPH08329009A (ja) * 1995-05-31 1996-12-13 Puromisu Kk 暗証番号登録システム
JP2005250530A (ja) * 2004-03-01 2005-09-15 Citizen Watch Co Ltd 文字入力装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6120129A (ja) * 1984-07-06 1986-01-28 Hitachi Ltd 複数コ−ド系情報処理方式
JPH0259952A (ja) * 1988-08-26 1990-02-28 Nec Corp アクセス権情報の保護方式
JPH05298116A (ja) * 1992-04-23 1993-11-12 Hokkaido Nippon Denki Software Kk コンパイラシステム
JPH0695890A (ja) * 1992-09-10 1994-04-08 Toyo Commun Equip Co Ltd コンパイラにおける名前置換方式
JPH08329009A (ja) * 1995-05-31 1996-12-13 Puromisu Kk 暗証番号登録システム
JP2005250530A (ja) * 2004-03-01 2005-09-15 Citizen Watch Co Ltd 文字入力装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2021022358A (ja) * 2019-07-26 2021-02-18 広東叡江云計算股▲分▼有限公司Guangdong Eflycloud Computing Co., Ltd phpに基づく独立型sqlインジェクション防御分析通知方法及びそのシステム

Also Published As

Publication number Publication date
JP5145967B2 (ja) 2013-02-20

Similar Documents

Publication Publication Date Title
EP2092424B1 (en) Locating security vulnerabilities in source code
US9298924B2 (en) Fixing security vulnerability in a source code
JP5458184B2 (ja) 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
US20170116410A1 (en) Software protection
CN110096853B (zh) 基于Mono的Unity安卓应用加固方法、存储介质
US9594769B2 (en) Computing device configured with a table network
CN106462677A (zh) 优化和保护软件
Amirtahmasebi et al. A survey of SQL injection defense mechanisms
WO2021019341A1 (en) Systems, methods, and storage media for producing verifiable protected code
EP3918494A1 (en) Systems, methods, and storage media for obfuscating a computer program by representing the control flow of the computer program as data
CN111475168A (zh) 一种代码编译方法及装置
JP5145967B2 (ja) コマンド文構築プログラム,処理方法,および処理装置
CN105956425A (zh) 一种基于smali代码混淆的Android应用保护方法
De Ryck et al. Protected web components: Hiding sensitive information in the shadows
Dahse Static detection of complex vulnerabilities in modern PHP applications
Canlas et al. ASP. NET Core 5 Secure Coding Cookbook
Wilhoite Code obfuscation: methods and practicality within automation
Markulin et al. Using ChatGPT in Designing Web Applications Resistant to SQL Injection Attacks
Singleton Automated Tool Support for Finding and Repairing Security Bugs in Mobile Applications
Zeinali et al. Threat extraction method based on uml software description
Stein et al. Leveraging MDS2 and SBOM Data for LLM-Assisted Vulnerability Analysis of Medical Devices
Yoo et al. Automatic string deobfuscation scheme for mobile applications based on platform-level code extraction
Cristalli Static and dynamic analyses for protecting the java software execution environment
Kwon et al. P2C: Understanding Output Data Files via On-the-Fly Transformation from Producer to Consumer Executions.

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100917

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120314

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120417

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120613

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120807

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121009

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20121030

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20121112

R150 Certificate of patent or registration of utility model

Ref document number: 5145967

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20151207

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees