JP5186443B2 - 文字列の妥当性を判定するシステム、方法及びプログラム - Google Patents

文字列の妥当性を判定するシステム、方法及びプログラム Download PDF

Info

Publication number
JP5186443B2
JP5186443B2 JP2009155705A JP2009155705A JP5186443B2 JP 5186443 B2 JP5186443 B2 JP 5186443B2 JP 2009155705 A JP2009155705 A JP 2009155705A JP 2009155705 A JP2009155705 A JP 2009155705A JP 5186443 B2 JP5186443 B2 JP 5186443B2
Authority
JP
Japan
Prior art keywords
character string
program
storage means
prog
variable
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.)
Expired - Fee Related
Application number
JP2009155705A
Other languages
English (en)
Other versions
JP2011013810A (ja
Inventor
孝彰 立石
直 田渕
ピストイア マルコ
ハヴィヴ イノン
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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2009155705A priority Critical patent/JP5186443B2/ja
Priority to US12/825,610 priority patent/US8365280B2/en
Publication of JP2011013810A publication Critical patent/JP2011013810A/ja
Application granted granted Critical
Publication of JP5186443B2 publication Critical patent/JP5186443B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • Quality & Reliability (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Computing Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Description

この発明は、コンピュータ・プログラムのコードにおける文字列(ストリング)妥当性を判定する技術に関するものである。
世の中でインターネットが隆盛するにつれて、セキュリティ上の危険性も増大してきた。その典型的な危険性として、クロスサイトスクリプティング(XSS)がある。これは、アプリケーション・プログラムによって動的に生成されるウェブ・ページに、サイト間を横断して悪意のあるスクリプトを混入させることである。
他の危険性として、SQLインジェクションがある。これは、既存のSQL文に、別のSQL文を注入することによって、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作するものである。
CGIプログラムで、XSSの危険性を検出するためには、例えば、print関数に、'<'という文字が渡されるかどうかを調べる必要がある。
特開2007−52625号公報は、検査対象のソースコードを構文解析手段により解析して解析木を構築するシステム開示する。そこで、脆弱性検出手段は解析木を辿り動的仮引数間遷移DBを作製する。これと仮引数間遷移DBから検査対象のソースコードにおける外部入力の遷移を追跡し、外部入力をパラメータとして使用すると脆弱な関数を登録した脆弱性データベースの登録内容に合致する箇所を、脆弱性を有する箇所として警告する。
この公開公報に開示されている技法は、ソースコードの脆弱性を検査することに関するが、外部入力の遷移に関するもので、プログラムが生成する文字列の値に関与するものではない。
下記に掲げる非特許文献1、2及び3は、プログラムを実行しないで、実行時に生起する文字列の値を推論するための静的プログラム解析技術を開示する。典型的には、静的プログラム解析技術は、文法(正規文法または文脈自由文法)によって文字列の値を抽象し、推論した文字列の値を、予め用意した安全または非安全なパターンと比較することによって、セキュリティの脆弱性を検出するために使用される。
しかし、文法ベースのアプローチは、モジュール化が難しいという点で、制約がある。さらに、文法ベースのアプローチは、後ろ向き解析に使用したり、文字列のインデックスと文字列の値の間の関係を扱ったりするのが、困難である。
例えば、非特許文献2の文字列解析は、文脈自由文法の変形に依存している。すると、非特許文献2の文字列解析をモジュール化するには、そのような変形の合成を計算する必要があり、非特許文献2の文字列解析を後ろ向き解析に使用するには、そのような変形を逆転する必要がある。
このように、モジュール化された解析と、後ろ向き解析には、文字列解析の推論フェーズで追加のアルゴリズムが必要である。
ところで、単項2階論理(M2L)によって、文字列上の特性を扱うというアイデアも考えられる。M2Lによれば、合成は、なんら特別なアルゴリズムを使用することなく、単なる論理演算(例えば、∧)によって行うことができる。M2Lの式を解くためのBDDベースのアルゴリズムが、組合せの爆発の問題を解消することに貢献する。
M2Lを解くためのプログラムの例として、MONAがあり、http://www.brics.dk/mona/からプログラムを入手することができる。
特に、http://www.brics.dk/mona/publications.htmlの6.6章には、正規表現のためのエンコーディング方法が記述されている。
非特許文献4に記述されている技術は、プログラム中の文字列演算が、MSO(単項2階論理)で定義可能な文字列変換によって定義または近似可能であるなら、文字列の結合や反転の問題を解決し得るものである。しかし、静的プログラム解析の観点からみると、この論文は、M2Lによってプログラムを抽象するためのアルゴリズムは何ら記述しない。
それ以外にも、非特許文献5に記述されている技術のように、M2Lを用いてプログラムを検証するための研究はある。
しかし、従来のどの研究や技術も、プログラムによって生成される文字列の値の検証に取り組むものではない。
特開2007−52625号公報
Aske Simon Christensen, Anders Moller, and Michael I. Schwartzbach, "Precise Analysis of String Expressions", In SAS'03 Proceedings of International Static Analysis Symposium, volume 2695 of LNCS, page 1-18, Springer-Verlag 2003 Yasuhiko Minamide, Static approximation of dynamically generated Web pages, International World Wide Web Conference archive, Proceedings of the 14th international conference on World Wide Web table of contents, Pages: 432 - 441, 2005, ACM New York, NY, USA Gary Wassermann, Zhendong Su, Sound and precise analysis of web applications for injection vulnerabilities, In PLDI'07 Proceedings of Programming Language Design and Implementation, 2007 Joost Engelfriet, Hendrik Jan Hoogeboom, MSO definable string transductions and two-way finite-state transducers, ACM Transactions on Computational Logic, Volume 2, Issue 2 (April 2001) Pages: 216 - 254 Anders Moller, Michael I. Schwartzbach, The pointer assertion logic engine, ACM SIGPLAN Volume 36 , Issue 5 (May 2001) Pages: 221 - 231
この発明の目的は、プログラムが生成する文字列の妥当性を、プログラムを実際に実行せずに効率的に判定する技法を提供することにある。
上記目的を達成するために、本願発明者は、単項2階論理(M2L)に基づく文字列解析技術に想到した。M2Lは、2階変数の使用によって正規言語を定義するに十分な表現力をもつ。
本願発明者は、この表現力を利用して、プログラム変数間の制約を記述し、組込み文字列演算を抽象した。これによれば、あらゆる組込み組込み文字列演算は、その入力値と出力値上の制約によってモデルされる。プログラム全体が一旦M2Lに変換されると、そのプログラムが、M2Lソルバを用いて、やはりM2Lで書かれた仕様を満足するかどうかが判定される。
本発明によれば先ず、位置の集合よって、文字列が表現される。この際、文字の順序に関する情報は失われない。2つの文字列の結合は、2つの位置集合S1とS2の和集合によってあらわされる。ここで、S1の全ての位置は、S2の全ての位置よりも下位にある。
次に、命令が、M2L述語宣言に変換される。その各々のM2L述語宣言は、起こりえる全ての文字列の性質(property)をあらわし、これらは、実行時に対応する変数に割り当てられることになる。
次に、非循環変数を終端記号と考えて、非循環変数に対応する終端記号からM2L述語への変換を通じて、変数の循環定義に関連する命令が、正規文法(または、正規表現)に変換される。
次に、入力文字列値と、出力文字列値の間の制約によって、組込み文字列関数の健全な抽象が定義される。その際、入力ストリングに対応するパラメータが、高階変数によって抽象され、高階変数の各々は、プログラムによって生成されたM2L述語によってインスタンス化される。
各文字列インデックスが文字列と文字列集合の対によってエンコードされてなる、文字列インデックスを扱う機能によって、解析手法が強化される。
さらに、追加のビットを使用することによって、ラベル付け機能で、解析手法が強化される。
さらに、条件を考慮した機能も使用することができ、これによって、解析手法が強化される。
以上のように、この発明によれば、プログラムのソートコードと、そのプログラムが実行時に生成する文字列の制約条件の両方を、M2Lで記述することによって、M2Lソルバを用いて、プログラムが生成する文字列の妥当性を、効率的に解くことができるという効果が得られる。
本発明を実施するためのハードウェア構成のブロック図である。 本発明の処理を行なう機能ブロック図を示す図である。 本発明の処理全体の概要フローチャートを示す図である。 述語生成器の処理のフローチャートを示す図である。
以下、図面に基づき、この発明の実施例を説明する。特に断わらない限り、同一の参照番号は、図面を通して、同一の対象を指すものとする。尚、以下で説明するのは、本発明の一実施形態であり、この発明を、この実施例で説明する内容に限定する意図はないことを理解されたい。
図1を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・パス102には、CPU104と、主記憶(RAM)106と、ハードディスク・ドライブ(HDD)108と、キーボード110と、マウス112と、ディスプレイ114が接続されている。CPU104は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標) 4、Core(商標)2 Duo、Xeon(商標)、AMD社のAthlon(商標)などを使用することができる。主記憶106は、好適には、2GB以上の容量をもつものである。
ハードディスク・ドライブ108には、個々に図示しないが、オペレーティング・システムが、予め格納されている。オペレーティング・システムは、Linux(商標)、マイクロソフト社のWindows XP(商標)、Windows(商標)2000、アップルコンピュータのMac OS(商標)などの、CPU104に適合する任意のものでよい。
ハードディスク・ドライブ108にはまた、必要に応じて、C、C++、C#、Java(商標)などのプログラム言語処理系も格納していてもよい。ハードディスク・ドライブ108にはさらに、プログラム言語処理系でコンパイルするためのソースコードを書くためのテキスト・エディタ、及び、Eclipse(商標)などの開発環境を含んでいてもよい。
ハードディスク・ドライブ108にはさらに、M2Lソルバである、MONAが格納されている。
MONAは、http://www.brics.dk/mona/download.htmlから入手可能である。
ハードディスク・ドライブ108にはさらに、Java(商標)ソースコードを、SSA形式に変換するツールが格納されている。
そのようなツールは例えば、http://wala.sourceforge.net/から入手可能である。チェックしようとするプログラミング言語のソースコードが、Java(商標)以外のC、C++、C#、その他の言語である場合でも、
キーボード110及びマウス112は、オペレーティング・システムまたは、ハードディスク・ドライブ108から主記憶106にロードされ、ディスプレイ114に表示されたプログラム(図示しない)を起動したり、文字を打ち込んだりするために使用される。
ディスプレイ114は、好適には、液晶ディスプレイであり、例えば、XGA(1024×768の解像度)、またはUXGA(1600×1200の解像度)などの任意の解像度のものを使用することができる。ディスプレイ114は、図示しないが、プログラムのチェック結果の表示などの目的に使用される。
次に、本発明の基本的なアイデアの概要を説明する。本発明のキーポイントは、プログラムの変数間の制約をあらわすM2L式を生成し、式中の変数が、プログラムの変数に対応する仕様(specification)をM2Lで記述することである。この技法によれば、MONA(http://www.brics.dk/mona/)などの定理証明技法を用いて、変数が制約を満たすかどうかの解釈を自動的に見出すことができる。すなわち、文法ベースの文字列解析で行なわれているような、抽象的な文字列の値の変形を考慮する必要がない。
もしプログラムとその仕様から合成された式を満足する解釈を見出すことができるなら、そのプログラムは、潜在的に、その仕様を満たすことになる。こうして、その式が、どのような解釈の下でも成立するなら、そのプログラムは常に、その仕様をみたすことになる(順方向解析)。さもなければ、その仕様を満たさない反例が得られる。さらにまた、その仕様を満たすプログラム変数の文字列の値も得られる(後ろ向き解析)。
<順方向解析>
まず、次のようなJava(商標)のプログラムを考える。
String a = "a";
String b = "b";
String s;
if (flag) { s = a + b; }
else { s = b + a; }
System.out.println(s);
このプログラムから、次のような式Progを生成することができる。
Prog(Va,Vb,Vs) ≡
"a"(Va)∧"b"(Va)∧(concat(Vs,Va,Vb)∨concat(Vs,Vb,Va))
ここで、直感的に、Va,Vb,Vsの各々が変数をあらわすものとする。"c"(P)は、Pによってあらわされる文字列がcであるなら真となる述語である。
concat(R,P,Q)は、Rによってあらわされる文字列が、PとQによってあらわされる文字列の結合によって生成されるなら真となる述語である。
ここで、文字列"<"を、安全でない文字列と仮定すると、そのプログラムの安全仕様は、次のようになる。
Spec(Vs) ≡ ∀P⊆Vs.¬"<"(P)
すると、次の式をチェックすることによって、そのプログラムが、その仕様を満たすことを見出すことができる。
Prog(Va,Vb,Vs) ⇒ Spec(Vs)
ここで、Va,Vb,Vsは、自由変数である。
もし、プログラム変数bの値が、プログラムの外から来るなら、プログラム変数bの部分式を用いることなく、次のような制約が得られる。
Prog'(Va,Vb,Vs) ≡
"a"(Va)∧(concat(Vs,Va,Vb)∨concat(Vs,Vb,Va))
そうして、Prog'(Va,Vb,Vs) ⇒ Spec(Vs)をチェックすることによって、
"<"(Vb)のような反例を得ることができる。
<後向き解析>
文字列の値が未知のとき、仕様(制約)を満足させる変数bの値を見出すための式を生成することができる。
Prog'(Va,Vb,Vs) ∧ Spec(Vs)
<M2Lにおける文字列と組込み関数のエンコーディング>
M2Lにおいては、文字列の値の位置と、位置の部分集合はそれぞれ、1階変数と、2階変数によって直接記述することができる。本発明のエンコーディング技法においては、有限文字列をヒープと考える。これは、プログラムと仕様から生成されたM2L式を満たす。プログラム中で構築される文字列は、そのヒープの位置の集合によってあらわすことができる。例えば、"abcabc"というヒープ文字列があったとして、位置の集合{0,2}と{2,5}はそれぞれ、文字列"ac"と文字列"cc"をあらわす。ヒープ中の各キャラクタは、M2LにおけるM2L{Str}[5]をエンコーディングする方法の場合、ビット・ベクトルによってあらわすことができる。1バイト文字をあらわすために、8つの2階変数
B0,...,B7が必要である。ここで、Biは、i番目のビットが1である文字の位置を含む。
すると、文字"a"をあらわす述語"a"(P)は、8つの2階変数
B0,...,B7を用いて、次のようにあらわされる。
Figure 0005186443
このエンコーディング方法により、文字列結合述語は、次のように定義することができる。
concat(R,P,Q) ≡ R = P∪Q
∧(∀p,q . p∈P∧q∈Q ⇒ p<q)
他の文字列演算もM2Lで同様に定義される。
ここで、図2を参照して、本発明のこの実施例に係る処理の機能ブロックについて説明する。まず、ソースコード202は、典型的にはJavaのソースコードで、一般的には、テキストファイルの形式で、ハードディスク・ドライブ108に格納されている。
SSAコンバータ204は、この実施例では、JavaのソースコードをSSA形式のファイル206に変換する機能を有する。そのようなツールは、例えば、http://wala.sourceforge.net/から入手可能である。SSAとは、静的単一代入形式(Static Simple Assignment)のことであり、変数の定義が字面上唯一になるように添字をつけた中間表現形式であり、コンパイラにおけるデータフロー解析や最適化を見通しよく行うのに適している。
Java以外に、C、C++など様々なプログラミング言語のソースコードに対応してSSAコンバータが存在しており、そのようなSSAコンバータを導入することにより、この実施例では、Java以外の言語のソースコードも取り扱うことができる。
このようにして変換されたSSAプログラム206は、ハードディスク・ドライブ108に一旦保存してもよいし、主記憶108にロードしてもよい。
述語生成器208は、本発明の主要な特徴を具現化するプログラムであって、SSAプログラム206と、組込み関数の抽象集合を記述したファイル210を読み取って、M2Lソルバ214にかけるための述語宣言212を生成する機能をもつ。組込み関数の抽象集合を記述したファイル210は、予め用意される内容であって、好適にはハードディスク・ドライブ108に格納されている。
述語生成器208自体は、C、C++、C#、Java(商標)、Perl、Ruby、Pythonなどの任意のプログラミング言語で書くことができる。述語生成器208のプログラムは、ハードディスク・ドライブ108に格納され、キーボードの操作などに応答して、オペレーティング・システムの働きによって主記憶106にロードされ実行される。
このようにして変換された述語宣言212は、ハードディスク・ドライブ108に一旦保存してもよいし、主記憶108にロードしてもよい。
生成された述語宣言212は、予めユーザによってM2Lで書かれて好適にはハードディスク・ドライブ108に格納されている制約のファイル216とともに、M2Lソルバ214に読み込まれ、その処理結果は、ディスプレイ114の出力218の形式で表示される。
M2Lソルバ214は、これには限定されないが、好適には、MONAであり、http://www.brics.dk/mona/download.htmlから入手可能である。
<本発明のアルゴリズムの概要>
次に、図3及び図4のフローチャートを参照して、本発明のアルゴリズムの概要を説明する。上述のように、本発明のこの実施例では、検証入力は、SSAプログラム入力Progと、ターゲット変数xtと、仕様Specである。そのような仕様は、可能的には解析対象変数xtに割り当てられる文字列の性質をあらわす。
さて、図3において、最初のステップ302は、準備ステップであって、2つの文字列の結合は、2つの位置集合S1とS2の和集合によってあらわされるように、位置集合Rが、文字の順序を失うことなく文字列vをあらわすことを言明する述語"v"を定義することである。ここで、S1の全ての位置は、S2の全ての位置よりも下位にある。
次のステップ304も、準備ステップであって、||f||(R,"v1",...,"vn")が全ての入力文字列の値v1,...,vnと、戻り値f(v1,...,vn)をあらわす位置集合Rについて成立するように全ての組込み関数fについて、高階述語 ||f|| を定義することである。
次のステップ306も、準備ステップであって、文字列にのみ関連する命令を得ることである。もし他の種類の命令もあるなら、そのような命令ももとのプログラムから抽象することができる。
次のステップ308は、述語変換器208に関するものであり、図4のフローチャートにより詳細に示すように、プログラムProg中のすべての命令を、次のようにして述語宣言に変換することによって、M2L述語宣言の組を生成する。
すなわち、図4において、ステップ402では、述語変換器208は、まだ読み込む命令があると判断すると、ステップ404で、命令を読み取る。
ステップ406で、述語変換器208が、命令が文字列の代入x = vであると判断したなら、ステップ408で、それを、progx(R) ≡ "v"(R)に変換する。
ステップ410で、述語変換器208が、命令が未定義のプログラム変数xを導入すると判断したなら、ステップ412で、それを、宣言progx(R) ≡ R = Xxに変換する。ここで、Xxは、プログラム変数xに対応する自由変数である。
ステップ414で、述語変換器208が、命令が、組込み関数の呼び出しx =f(x1,...,xn)であると判断したなら、
ステップ416で、それを、宣言progx(R) ≡ ||f||(R,progx1,...,progxn)に変換する。
ここで、||f||(R,progx1,...,progxn)は、高階述語 ||f||を、変数Rと、述語progx1,...,progxnでインスタンス化することによって得られる。
ステップ418で、述語変換器208が、命令が、Φ命令x=Φ(x1,...,xn)であり、変数xの定義が循環的でないと判断したなら、ステップ420で、それを、
宣言progx(R) ≡ progx1(R)∨...∨progxn(R)に変換する。
ステップ422で、命令が、Φ命令x=Φ(x1,...,xn)であり、変数xの定義が循環的であるなら、述語変換器208は、次のようにする。
ステップ424で、もし定義が文字列の結合によってのみ影響されると判断したなら、ステップ426で、非循環変数を終端の変数と考え、非循環変数が対応するM2L述語に変換されるような正規文法をあらわすM2L述語宣言progxを構築することによって、その変数に関連する命令を正規文法(または、正規表現)に変換する。
そうでないなら、ステップ428で、循環的定義を固定回数だけアンロール(unroll)し、またはループ不変量を自動的に見出す技術を使用する。
こうして1つの命令の処理が終わるとステップ402に戻り、まだ命令があるなら、ステップ404で命令を読み取って、ステップ406以下を繰り返す。
そうでないなら、処理を終わって、図3のフローチャートの処理に戻る。
図3に戻って、ステップ310は、証明ソルバの記述であり、"v"の述語宣言と、M2L述語Predの集合と、M2L式∀S . progxt(S) ⇒ Spec(S)をM2Lソルバに入力する。そして、M2Lソルバから結果を受け取る。
次に、本発明の背景の理論的な詳細を説明する。
<プログラム>
プログラムは、SSAの形式で表現される。SSAについては、下記の文献を参照されたい。

B. K. Rosen, M. N. Wegman, F. K. Zadeck, Global value numbers and redundant
computations,
Proceedings of the 15th ACM SIGPLAN-SIGACT symposium on Principles of
programming, San Diego, California, United States
Pages: 12 - 27, 1988
Ron Cytron, Jeanne Ferrante, Barry K. Rosen, Mark N. Wegman,
F. Kenneth Zadeck,
Efficiently computing static single assignment form and the control
dependence graph
Source ACM Transactions on Programming Languages and Systems (TOPLAS)
archive, Volume 13 , Issue 4 (October 1991)
SSAの抽象的なシンタックスは、以下のとおりである。
x ∈ X
n ∈ N
v ∈ V
x' ::= x|¬x|⊥
s ::= x = v ステートメント
| x = undefined
| x = f(x1,...,xn)
| x = Φ(x1,...,xn)
b ::= (n,{s}) 基本ブロック
N ::= {b} 基本ブロックの集合
E ::= {(b,b,x')} エッジの集合
G ::= (N,E') プログラム(制御フロー・グラフ)
x ∈ Xとv ∈ Vはそれぞれ、変数と値をあらわす。n ∈ Nは基本ブロックの識別子である。(n,{s})は基本ブロック識別子nと、命令の集合{s}とからなる基本ブロックである。
Eは、2つの基本ブロックbと、条件x'によってあらわされるエッジの集合であり、ここで、条件は、変数、変数の否定、または特殊な値botによってあらわされる。SSA命令は、定数値の代入(x = v)、関数呼出し(x = f(x1,...,n))、またはΦ関数(x = Φ(x1,...,xn))である。基本ブロックbは、分岐もループもないステートメントの列である。分岐やループなどの制御フローは、制御フロー・グラフgのエッジとしてあらわされる。
<単項2階論理>
この発明では、変数の間の制約をあらわす文字列上で、単項2階論理が使用される。M2L(str)の抽象的なシンタックスは、次のとおりである。
Figure 0005186443
なお、この実施例を通して、次の述語を使用する。ここで、"a"(P)は、Pによってあらわされる文字列がaであることを示す。
Figure 0005186443
次に、アルゴリズムのコアの部分について説明する。
<組込み関数の抽象>
組込み関数の抽象は、M2L述語によって予め定義されている。すなわち、組込み関数fの抽象は、記号||f||であらわされる。組込み関数のパラメータは、黙示的には高階変数であらわされ、それは、述語で置き換えることができる。各高階変数は、述語によってインスタンス化されると想定され、その述語は、命令の抽象化の時点で、組込み関数のパラメータに割り当てられた文字列の値の特性をあらわす。
ここで、sで指定された文字列から、xで指定された文字列のすべての出現を除去する、remove(s,x)関数を考えてみる。この文字列の場合、||remove||は、次のように定義される。ここで、Ps, Pxは高階変数であり、R, S, Xは2階変数である。
Figure 0005186443
文字列連結に関しては、次のような抽象化を使用する。
Figure 0005186443
文字列xにおけるyの出現をzで置換する置換関数replace(s,x,y)は、次のような抽象化が使用される。
Figure 0005186443
解析を健全にするために、関数fの抽象化は、次の性質を満たさなくてはならない。
Figure 0005186443

ここで、ww'は、有限文字列wとw'の連結をあらわし、下記の式は、式Ψが、有限の文字列wと、代入Iについて成立することを示す。
Lw,I(Ψ)は、Ψによってあらわされる文字列の集合であり、下記のとおり定義される。
Figure 0005186443
<変数と命令の抽象化>
命令を抽象化したものが、M2L述語の宣言である。もし変数の循環的な定義がないなら、変数と命令の抽象化は、下記のとおりとなる。
Figure 0005186443
もし、各命令sの抽象が、下記に示すように、述語の宣言なく再帰的に定義される。ここで、def(x)は、変数xを定義する命令を返す。
Figure 0005186443
もし、Φ命令の左側の変数が、それ自身によって定義されるなら、その変数は、循環(cyclic)変数と呼ばれる。そのような循環変数は、ループまたは再帰をもつプログラムを解析するときのみあらわれる。
もし循環変数の値が、文字列の結合によってのみ影響を受けるなら、非特許文献2にあるように、循環変数について文脈自由文法を先ず構成し、それを正規言語で近似する。次に正規文法がエンコードされ、それは、M2Lで、その循環変数がとりえる可能的な文字列の値をあらわす。正規言語のエンコーディングは、基本的には、
http://www.brics.dk/mona/publications.htmlの6.6章の記載内容と同様であるが、異なるのは、この発明の方法では、終端記号として考えることができる、非循環変数のプログラム変数に対応する述語が使用できる、ということである。
下記は、そのエンコーディングの定義であり、ここで、Tは文字をあらわす終端記号であり、Txは、プログラム変数xに対応する終端記号をあらわし、変数N, N1, N2は、非終端記号をあらわす。
Figure 0005186443
そうでないなら、そのようなプログラムは、固定回数アンロール(unroll)されることによって、ループのないプログラムに変更され、あるいは後述の技法をもちいて、循環変数に対してループ不変量が見出される。
<基本ブロックと制御フローの抽象化>
この解析は、フローや条件を考慮したものではないので、基本ブロックと制御フローの抽象化は、下記のように、直接的なものとなる。
Figure 0005186443
次に、拡張と変形について述べる。
<手続間解析>
今まで、手続内解析だけを述べてきたが、これは、容易に手続間解析に拡張することができる。そのアルゴリズムを説明するためにまず、コールグラフのシンタックスを次のように定義する。
m ∈ M
N' ::= {(m,g)}
E' ::= {((m,g),(m,g))}
D ::= {((x,m),{(x,m)})}
cg ::= {(N',E',D)}
Mはコールグラフのノードであり、cgはコールグラフであり、N'はノード名と制御フローグラフの対からなるコールグラフ・ノードの集合であり、E'はコールグラフのエッジの集合であり、Dは、関数呼び出しによって引き起こされるパラメータと戻り値の直接データ依存性の集合である。
((x,m),{(x1,m1),...,(xn,mn)}) ∈ Dは、対応するコールグラフ・ノードm1,...,mn中の変数x1,...,xnの値が、コールグラフ・ノードmの値xに流れることをあらわす。
ここで、もし再帰的呼び出しがないなら、コールグラフの抽象は、次のように定義される。
Figure 0005186443
ノード名は、コールグラフ・ノードから生成される述語をアノテート(annotate)するために、命令の抽象に伝播する。
<ラベル付けされたストリングの解析>
ラベル付けされたストリングの解析は、ストリングの解析の変形であって、各文字が、汚染(taintedness)などの追加の情報をもっている。そのようなラベルは、追加のビットを使用することにより、あらわすことができる。例えば、汚染文字と非汚染文字をあらわしたいなら、1バイト文字を9ビットであらわす。
<条件を考慮した文字列解析>
条件を考慮した解析の場合、下記に示す抽象化を行う。
Figure 0005186443

ここでπは、変数と基本ブロックの対から制約へのマッピングである。その制約は、指定された基本ブロックで使用されている指定された変数をアサートし、それはM2L式であらわされると想定される。そのようなπは、本出願人に係る、米国特許第7530107号に記載されているのと同一の方法で、計算することができる。
<ループ不変量の発見>
もし循環変数xについてループ不変量invxがあるなら、関数呼び出しの抽象化に、progxの代わりにこの述語を使用することができる。そのようなループ不変量を見出すために割り当てられる文字列の値からなる全ての文字を含む文字集合をあらわすために、自由(位置集合)変数CSxを導入する。
こうして、ループ不変量invxは、次のように定義される。
invx ≡ construct(R,CSx)
ここで、construct(R,S) ≡ R ⊆ S
述語construct(R,S)は、位置集合Rによってあらわされる文字列の値が、位置集合の文字列からなることを言い述べる。すると、invxはループ不変量なので、CSxを制約するために、次のような仮定が必要である。
∀R . progx(R) ⇒ invx(R)
こうして、仕様Specyをもつプログラム変数yの検証は、次の式で行われる。
(∀R . progx(R) ⇒ invx(R))
⇒ (∀R . progy(R) ⇒ Specy(R))
上記式の一般化は、次のとおりである。ここでXは、循環プログラム変数の集合である。
(∨x∈X ∀R . progx(R) ⇒ invx(R))
⇒ (∀R . progy(R) ⇒ Specy(R))
<正規表現の演算>
http://www.brics.dk/mona/publications.htmlにあるようなM2Lの典型的な正規表現のエンコーディング方法と同様に、この発明の実施例でも、正規表現のパターンマッチングを使用して、それを正規表現の演算に使用することができる。エンコーディング方法は、数11にあるのと同様である。例えば、正規表現(ab)*は、次のようにあらわすことができる。
is_ab_star(V) ≡
∃R . min(V) ∈ R ∧ max(V) + 1 ∈ R ∧
∀r,r',S . consecutive(r,r',R) ∧ strr(S,V,r,r')
⇒ "ab"(S)
<文字列インデックスの取り扱い>
インデックスは、位置と、位置の集合の対でエンコードすることができる。例えば、プログラム定文字列"ace"が、M2Lで位置集合{0,2,4}でエンコードされるなら、文字列"ace"のインデックスは、対(2,{0,2,4})によってエンコードされる。
そこで、上述のエンコーディングに基づき、M2L中の文字列をあらわすために、述語pos0, ..., posnを導入する。ここで、posn(p,S)は、位置集合S中の位置pが、位置集合Sに対応する文字列のインデックスnをあらわすことを言い述べる。
Figure 0005186443
JavaのIndexOfメソッドは、次のように抽象化される。
Figure 0005186443

ここで、||indexOf||の第1のパラメータは位置であり、第2のパラメータは、その位置を含む文字列をあらわす。このように、文字列インデックスを扱う関数の呼び出しについては、僅かに異なる抽象化が使用される。
さらに、文字列sのインデックスnとインデックスmの間の部分文字列を抽出する別の文字列演算substring(s,n,m)を考えてみる。すると、文字列演算は、次のように抽象化される。
Figure 0005186443
上述の例を考慮すると、インデックスの置換と、関数呼び出しの命令は、次のように抽象化される。
Figure 0005186443
以下では、理解を助けるために、いくつかの例を示す。
先ず下記は、文字列の値を出力するJava(商標)のプログラムである。
static public void main(String args[]){
String uname = args[0];
String group = args[1];
if (group.equals("IBM")) {
System.out.println(uname + "(IBM)");
} else {
uname = uname.replace("<","&lt;");
System.out.println(uname);
}
}
次に示すのは、上記Java(商標)のプログラムのSSA形式である。
G = (N, E)
N = {b1, b2, b3, b4}
E = {(b1,b2,v2), (b1,b3,¬ v2), (b2, b4), (b3, b4) }
b1 = (1, BB1)
b2 = (2, BB2)
b3 = (3, BB3)
b4 = (4, BB4)
BB1 =
uname = undefined;
group = undefined;
v1 = "(IBM)";
v2 = equals(group,v1)
BB2 =
v3 = uname + v1;
System.out.println(v3)
BB3 =
v4 = "<";
v5 = "lt;";
v6 = replace(uname,v4,v5);
System.out.println(v6)
BB4 = φ
本発明によれば、上記SSA形式に対応するMONAの述語が下記のように得られる。
pred prog_v1(var2 R) =
ex2 c1,c2,c3,c4,c5 where is_lparen(c1) & is_I(c2) & is_B(c3) & is_M(c4) & is_rparen(c5):
ex2 S1,S2,S3,S4,S5:
S1 = empty & concat(S2,c1,S1) & concat(S3,c2,S2) &
concat(S4,c3,S3) & concat(S5,c4,S4) & concat(R,c5,S5);
pred prog_v2(var2 R) =
ex2 P: prog_v1(P) & (R = P);
var2 uname;
var2 group;
pred prog_uname(var2 P) = P = uname;
pred prog_group(var2 P) = P = group;
pred prog_v3(var2 R) =
ex2 P,Q: prog_uname(P) & prog_v1(Q) & concat(R, P, Q);
pred prog_v4(var2 R) =
is_lt(R);
pred prog_v5(var2 R) =
ex2 c1,c2,c3,c4 where is_amp(c1) & is_l(c2) & is_t(c3) & is_semicolon(c4):
ex2 S1,S2,S3,S4:
concat(S2,c1,c2) & concat(S3,c2,S2) &
concat(S4,c3,S3) & concat(R,c4,S4);
pred prog_v6(var2 R) =
ex2 S,X',Y':
prog_uname(S) &
(all1 x : (x in X' <=> ex2 X : x in X substr(X, S) & prog_v4(X))) &
(all1 y : (y in Y' <=> ex2 Y : y in Y substr(Y, R) & prog_v5(Y))) &
R / Y' = S / X';
pred Spec(var2 P) =
all1 p where p in P: ~is_lt({p});
var2 S;
prog_v6(S) => Spec(S);
上記で、prog_xは、progxに対応し、is_a(c)は、式 "a"(c)に対応する。さらに、ex1, all1, ex2, all2はそれぞれ、1階変数と、2階変数の修飾子である。
下記は、正規表現の演算によって更新される文字列の値を出力するJava(商標)プログラムである。
static public void main(String args[]){
String s = args[0];
s = s.replaceAll("(ab)+", "z")
System.out.println(s);
}
それの対応するSSA形式は、下記のとおりである。
G = (N, E)
N = {b1,b2}
E = {(b1, b2)}
b1 = (1, BB1)
b2 = (2, BB2)
BB1 =
s = undefined;
v1 = "(ab)*";
v2 = "z";
v3 = replaceAll(s,v1,v2);
System.out.println(v3)
BB2 = φ
本発明によれば、上記SSA形式に対応するMONAの述語が下記のように得られる。
include "sa.mona";
pred prog_v1(var2 R) =
ex2 P: min(R) in P & max(R)+1 in P &
all1 r,r': all2 S: consecutive(r,r',P) & strr(S,R,r,r') => is_ab(S);
pred prog_v2(var2 R) = is_z(R);
var2 Xs;
pred prog_s(var2 R) = R = Xs;
pred prog_v3(var2 R) =
ex2 S,X',Y':
prog_args0(S) &
(all1 x : (x in X' <=> ex2 X : x in X & substr(X, S) & prog_v1(X))) &
(all1 y : (y in Y' <=> ex2 Y : y in Y & substr(Y, R) & prog_v2(Y))) &
R \ Y' = S \ X';
pred Spec(var2 P) =
~(ex2 S: substr(S,P) & is_ab(S));
var2 V3;
prog_v3(V3) => Spec(V3);
ここで、prog_v1が、正規表現"(ab)*"をあらわす述語である。
次のSSA形式は、循環変数v2をもつ。なお、ここでは便宜上、制御フローグラフは省略した。
v0 = "ab"
v1 = "ab"
v2 = phi(v0,v3)
v3 = v2 + v1
v2がとりえる文字列の値は、次の文脈自由文法によってあらわすことができる。
v2 → v0|v2
v3 → v2 v1
文脈自由文法は、正規表現v0 v1*で近似できるので、次のようなMONAプログラムが得られる。
pred prog_v0(var2 R) = is_ab(R);
pred prog_v1(var2 R) = is_ab(R);
pred prog_v2(var2 R) =
ex2 V0,V1Star:
prog_v1(V0) &
(ex2 P: min(V1Star) in P & max(V1Star)+1 in P &
all1 r,r': all2 S: consecutive(r,r',P) &
strr(S,V1Star,r,r') => prog_v1(S)) &
concat(R, V0, V1Star);
pred prog_v3(var2 R) =
ex2 V1,V2:
prog_v2(V2) & prog_v1(V1) & concat(R, V2, V1);
次のSSAプログラムは、indexOfの呼び出しをもつ。なお、ここでも制御フローは省略した。
v0 = 0;
v1 = "ab";
v2 = "b";
v3 = indexOf(v1,v2);
v4 = substring(v1,v0,v3);
これは、次のようなMONAプログラムに変換される。
include "sa.mona";
pred prog_v0(var1 n, var2 S) = pos0(n,S);
pred prog_v1(var2 R) = is_ab(R);
pred prog_v2(var2 R) = is_b(R);
pred prog_v3(var1 n0, var2 S0) =
(ex2 S1: prog_v2(S1) & indexOf(n0, S0, S1)) &
(all2 S1: all1 m:
prog_v2(S1) & indexOf(m,S0,S1) => n0 <= m);
pred prog_v4(var2 R) =
ex2 V1: ex1 v0,v3:
prog_v0(v0,V1) & prog_v1(V1) & prog_v3(v3,V1) &
substrr(R, V1, v0, v3);
pred Spec(var2 R) =
all2 R': R' sub R => ~is_b(R');
var2 R;
prog_v4(R) => Spec(R);
次のSSAプログラムは、ループをもつ。なお、ここでも制御フローは省略した。
v1 = ...
v2 = "a"
v3 = "b"
v4 = replace(v5,v2,v3)
v5 = phi(v1,v4)
これは、次のようなMONAプログラムに変換される。
include "sa.mona";
# R is a string constructed from a character
# set S by selecting positions.
# Ex.: Suppose w = "abc", S = {0,1,2}, then
# R = {0}|{1}|{2}|{0,1}|{0,2}|{1,2}|{0,1,2}
pred construct(var2 R, S) = R sub S | R = S;
var2 CSv5;
var2 args0;
pred inv_v5(var2 R) = construct(R, CSv5);
pred prog_v1(var2 R) = is_b(R);
pred prog_v2(var2 R) = is_a(R);
pred prog_v3(var2 R) = is_b(R);
pred prog_v4(var2 R) =
ex2 S,X',Y':
inv_v5(S) &
(all1 x :
(x in X' <=> ex2 X : x in X &
substr(X, S) & prog_v2(X))) &
(all1 y :
(y in Y' <=> ex2 Y : y in Y &
substr(Y, R) & prog_v3(Y))) &
(R \ Y' sub S \ X');
pred prog_v5(var2 R) =
prog_v1(R) | prog_v4(R);
pred SpecA(var2 P) =
all1 p where p in P: ~is_a({p});
(all2 R: prog_v5(R) => inv_v5(R))
=> all2 S: prog_v5(S) => SpecA(S);
以上、本発明を実施の形態を用いて説明したが、上記実施の形態に、多様な変更または改良を加えることが可能であり、その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、この分野の当業者に明らかであろう。例えば、本発明は、特定のコンピュータのアーテテクチャやOSなどのプラットフォームに依存しない。
また、Java(商標)に限らず、文字列を扱う任意のコンピュータ言語のソースコードに適用可能である。その際、好適には一旦SSA形式に変換するのが望ましいが、コンピュータ言語のソースコードから直接M2L形式に変換するようにしてもよい。
さらに、M2Lソルバとして、この実施例ではMONAを使用したが、これには限定されず、プラットフォームで使用可能な任意のM2Lソルバを使用することができる。
202・・・ソースコード
204・・・SSAコンバータ
208・・・述語生成器
210・・・組込み関数の抽象集合
214・・・M2Lソルバ
216・・・M2Lで書かれた仕様

Claims (9)

  1. CPUと主記憶と記憶手段をもつコンピュータの処理により、プログラミング言語のプログラムが生成する文字列の妥当性を、該プログラムを実行せずに判定する方法であって、
    前記CPUの処理により、前記記憶手段に保存されている、文字列の宣言を含む、各変数の定義が唯一となるようなプログラミング言語のソースコードを前記主記憶に読み込むステップと、
    前記CPUの処理により、前記主記憶に読み込まれた前記ソースコードから、変数の間の制約を抽象化して、M2Lで記述し、記憶手段に格納するステップと、
    前記CPUの処理により、前記M2Lで記述された変数の間の制約と、予め用意されて前記記憶手段に保存された文字列の安全/非安全のM2Lの記述を前記主記憶または前記記憶手段に格納するステップと、
    前記CPUの処理により、M2Lソルバ上で、前記主記憶または前記記憶手段に格納された、前記M2Lで記述された変数の間の制約と、前記文字列の安全/非安全のM2Lの記述に基づき、文字列の妥当性を判断するステップとを有する、
    プログラムが生成する文字列の妥当性を判定する方法。
  2. 前記各変数の定義が唯一となるようなプログラミング言語がSSA形式である、請求項1の方法。
  3. 前記プログラミング言語がJava(R)である、請求項1の方法。
  4. CPUと主記憶と記憶手段をもつコンピュータの処理により、プログラミング言語のプログラムが生成する文字列の妥当性を、該プログラムを実行せずに判定するプログラムであって、
    前記CPUに、
    前記記憶手段に保存されている、文字列の宣言を含む、各変数の定義が唯一となるようなプログラミング言語のソースコードを前記主記憶に読み込むステップと、
    前記主記憶に読み込まれた前記ソースコードから、変数の間の制約を抽象化して、M2Lで記述し、前記主記憶または前記記憶手段に保存するステップと、
    前記M2Lで記述された変数の間の制約と、予め用意されて前記記憶手段に保存された文字列の安全/非安全のM2Lの記述を前記主記憶または前記記憶手段に読み込むステップと、
    M2Lソルバ上で、前記主記憶または前記記憶手段に格納された、前記M2Lで記述された変数の間の制約と、前記文字列の安全/非安全のM2Lの記述に基づき、文字列の妥当性を判断するステップを実行させる、
    文字列の妥当性を判定する処理プログラム。
  5. 前記各変数の定義が唯一となるようなプログラミング言語がSSA形式である、請求項4の処理プログラム。
  6. 前記プログラミング言語がJava(R)である、請求項4の処理プログラム。
  7. CPUと主記憶と記憶手段をもつコンピュータの処理により、プログラミング言語のプログラムが生成する文字列の妥当性を、該プログラムを実行せずに判定するシステムであって、
    前記記憶手段に保存された、文字列の宣言を含む、各変数の定義が唯一となるようなプログラミング言語のソースコードと、
    前記記憶手段に保存された、M2Lソルバと、
    前記記憶手段に保存された、文字列の安全/非安全のM2Lの記述の情報と、
    前記CPUの処理により、前記記憶手段から、前記主記憶に読み込まれた前記ソースコードから、変数の間の制約を抽象化して、M2Lで記述し、前記主記憶または前記記憶手段に格納する手段と、
    前記CPUの処理により、前記M2Lソルバを動作させ、前記M2Lで記述された変数の間の制約と、前記文字列の安全/非安全のM2Lの記述に基づき、文字列の妥当性を判断する手段を有する、
    プログラムが生成する文字列の妥当性を判定するシステム。
  8. 前記各変数の定義が唯一となるようなプログラミング言語がSSA形式である、請求項7のシステム。
  9. 前記プログラミング言語がJava(R)である、請求項7のシステム。
JP2009155705A 2009-06-30 2009-06-30 文字列の妥当性を判定するシステム、方法及びプログラム Expired - Fee Related JP5186443B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2009155705A JP5186443B2 (ja) 2009-06-30 2009-06-30 文字列の妥当性を判定するシステム、方法及びプログラム
US12/825,610 US8365280B2 (en) 2009-06-30 2010-06-29 System, method, and program for determining validity of string

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009155705A JP5186443B2 (ja) 2009-06-30 2009-06-30 文字列の妥当性を判定するシステム、方法及びプログラム

Publications (2)

Publication Number Publication Date
JP2011013810A JP2011013810A (ja) 2011-01-20
JP5186443B2 true JP5186443B2 (ja) 2013-04-17

Family

ID=43382282

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009155705A Expired - Fee Related JP5186443B2 (ja) 2009-06-30 2009-06-30 文字列の妥当性を判定するシステム、方法及びプログラム

Country Status (2)

Country Link
US (1) US8365280B2 (ja)
JP (1) JP5186443B2 (ja)

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8584246B2 (en) * 2009-10-13 2013-11-12 International Business Machines Corporation Eliminating false reports of security vulnerabilities when testing computer software
US8468605B2 (en) * 2009-11-30 2013-06-18 International Business Machines Corporation Identifying security vulnerability in computer software
US8528095B2 (en) 2010-06-28 2013-09-03 International Business Machines Corporation Injection context based static analysis of computer software applications
US8365281B2 (en) * 2010-11-19 2013-01-29 International Business Machines Corporation Determining whether method of computer program is a validator
US20120151592A1 (en) * 2010-12-13 2012-06-14 Microsoft Corporation String operations with transducers
US8667584B2 (en) 2010-12-15 2014-03-04 International Business Machines Corporation Formal analysis of the quality and conformance of information flow downgraders
US8726246B2 (en) * 2011-05-17 2014-05-13 International Business Machines Corporation Static analysis of validator routines
US8769696B2 (en) 2011-09-29 2014-07-01 International Business Machines Corporation Automated detection of flaws and incompatibility problems in information flow downgraders
US20130091197A1 (en) 2011-10-11 2013-04-11 Microsoft Corporation Mobile device as a local server
US9075672B2 (en) * 2011-10-21 2015-07-07 Microsoft Technology Licensing, Llc Monadic evaluation of injected query compositions
US8863292B2 (en) 2011-12-07 2014-10-14 International Business Machines Corporation Interactive analysis of a security specification
US8966635B2 (en) * 2012-02-24 2015-02-24 Hewlett-Packard Development Company, L.P. Software module object analysis
JP2013186647A (ja) * 2012-03-07 2013-09-19 Yokohama National Univ 難読化装置、難読化方法、及び難読化プログラム、並びに難読化されたソースコード
US9600351B2 (en) 2012-12-14 2017-03-21 Microsoft Technology Licensing, Llc Inversion-of-control component service models for virtual environments
US8984495B2 (en) 2013-01-03 2015-03-17 International Business Machines Corporation Enhanced string analysis that improves accuracy of static analysis
US9021450B2 (en) 2013-03-11 2015-04-28 International Business Machines Corporation Scalable and precise string analysis using index-sensitive static string abstractions
US8881293B1 (en) * 2013-07-01 2014-11-04 Sap Se Static application security testing
US10296737B2 (en) * 2015-12-09 2019-05-21 International Business Machines Corporation Security enforcement in the presence of dynamic code loading
US10095484B2 (en) * 2015-12-15 2018-10-09 International Business Machines Corporation Automatic program synthesis using monadic second-order logic
CN105868280A (zh) * 2016-03-23 2016-08-17 沈文策 一种互联网信息数据处理系统及方法
WO2018092237A1 (ja) 2016-11-17 2018-05-24 三菱電機株式会社 プログラムコード生成装置、プログラムコード生成方法及びプログラムコード生成プログラム
WO2020257973A1 (en) * 2019-06-24 2020-12-30 Citrix Systems, Inc. Detecting hard-coded strings in source code

Family Cites Families (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7392545B1 (en) 2002-01-18 2008-06-24 Cigital, Inc. Systems and methods for detecting software security vulnerabilities
JP4248499B2 (ja) 2003-02-21 2009-04-02 テレコム・イタリア・エッセ・ピー・アー スマートカードを用いたネットワークアクセス装置の管理方法及びシステム
CN1809812A (zh) 2003-04-18 2006-07-26 盎司实验室股份有限公司 用于源代码检测源代码中弱点的方法和装置
JP2006523898A (ja) 2003-04-18 2006-10-19 オンス ラブス,インク ソースコードの脆弱点の検出法および検出システム
US20050108562A1 (en) 2003-06-18 2005-05-19 Khazan Roger I. Technique for detecting executable malicious code using a combination of static and dynamic analyses
GB2405499A (en) 2003-09-01 2005-03-02 Isis Innovation Information system development
US20060150160A1 (en) 2004-06-14 2006-07-06 Sofcheck, Inc. Software analyzer
US7661097B2 (en) 2005-04-05 2010-02-09 Cisco Technology, Inc. Method and system for analyzing source code
WO2006118193A1 (ja) * 2005-04-27 2006-11-09 Matsushita Electric Industrial Co., Ltd. エージェントおよび分散制約充足方法
US7945958B2 (en) 2005-06-07 2011-05-17 Vmware, Inc. Constraint injection system for immunizing software programs against vulnerabilities and attacks
US20070016894A1 (en) 2005-07-15 2007-01-18 Sreedhar Vugranam C System and method for static analysis using fault paths
JP4693044B2 (ja) 2005-08-18 2011-06-01 株式会社日立ソリューションズ ソースコード脆弱性検査装置
US7849509B2 (en) 2005-10-07 2010-12-07 Microsoft Corporation Detection of security vulnerabilities in computer programs
US7937692B2 (en) 2005-11-30 2011-05-03 Red Hat, Inc. Methods and systems for complete static analysis of software for building a system
US7844955B2 (en) 2005-12-24 2010-11-30 International Business Machines Corporation Performance computer program testing after source code modification using execution conditions
WO2007116490A1 (ja) * 2006-03-31 2007-10-18 Fujitsu Limited ソースコード生成プログラム、ソースコード生成方法およびソースコード生成装置
US7975257B2 (en) 2006-06-13 2011-07-05 Microsoft Corporation Iterative static and dynamic software analysis
US7617489B2 (en) 2006-09-15 2009-11-10 Ounce Labs, Inc. Method and system for detecting interprocedural vulnerability by analysis of source code
US8166532B2 (en) * 2006-10-10 2012-04-24 Honeywell International Inc. Decentralized access control framework
US7853987B2 (en) * 2006-10-10 2010-12-14 Honeywell International Inc. Policy language and state machine model for dynamic authorization in physical access control
JP5042315B2 (ja) 2006-10-19 2012-10-03 チェックマークス リミテッド ソースコード内のセキュリティ脆弱性の検出
US7987451B1 (en) 2006-11-20 2011-07-26 Mcafee, Inc. System, method and computer program product for verifying invocations of interfaces
US20080244536A1 (en) 2007-03-27 2008-10-02 Eitan Farchi Evaluating static analysis results using code instrumentation
US7530107B1 (en) * 2007-12-19 2009-05-05 International Business Machines Corporation Systems, methods and computer program products for string analysis with security labels for vulnerability detection
US8397300B2 (en) 2009-09-22 2013-03-12 International Business Machines Corporation Detecting security vulnerabilities relating to cryptographically-sensitive information carriers when testing computer software
US8584246B2 (en) 2009-10-13 2013-11-12 International Business Machines Corporation Eliminating false reports of security vulnerabilities when testing computer software
US8468605B2 (en) 2009-11-30 2013-06-18 International Business Machines Corporation Identifying security vulnerability in computer software
US8528095B2 (en) 2010-06-28 2013-09-03 International Business Machines Corporation Injection context based static analysis of computer software applications

Also Published As

Publication number Publication date
JP2011013810A (ja) 2011-01-20
US20100333201A1 (en) 2010-12-30
US8365280B2 (en) 2013-01-29

Similar Documents

Publication Publication Date Title
JP5186443B2 (ja) 文字列の妥当性を判定するシステム、方法及びプログラム
CN109375899B (zh) 一种形式验证Solidity智能合约的方法
Ford Packet parsing: a practical linear-time algorithm with backtracking
Jensen et al. Remedying the eval that men do
Tateishi et al. Path-and index-sensitive string analysis based on monadic second-order logic
Brumley et al. Creating vulnerability signatures using weakest preconditions
Mateescu et al. XTL: A meta-language and tool for temporal logic model-checking
Appel et al. A trustworthy proof checker
Yu et al. Building certified libraries for PCC: Dynamic storage allocation
Bour et al. Merlin: a language server for OCaml (experience report)
Ferles et al. Verifying correct usage of context-free API protocols
Arenaz et al. Xark: An extensible framework for automatic recognition of computational kernels
Doh et al. Abstract parsing: Static analysis of dynamically generated string output using lr-parsing technology
D'antoni et al. Fast: A transducer-based language for tree manipulation
Drape et al. Transforming the. net intermediate language using path logic programming
Khoo Decompilation as search
Kim et al. String analysis as an abstract interpretation
Bonfante et al. A computability perspective on self-modifying programs
Kurš et al. Efficient parsing with parser combinators
He et al. Termination analysis for evolving programs: An incremental approach by reusing certified modules
Chapman Worst-case timing analysis via finding longest paths in SPARK Ada basic-path graphs
Carneiro Metamath zero: The cartesian theorem prover
Mailund Domain-Specific Languages in R: Advanced Statistical Programming
Watson et al. Compilers and Interpreters
Shortt A System for Bounding the Execution Cost of Web Assembly Functions

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120710

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120711

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120820

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20121127

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121211

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: 20130108

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130121

R150 Certificate of patent or registration of utility model

Ref document number: 5186443

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: 20160125

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees