JP2009169846A - コマンド文構築プログラム,処理方法,および処理装置 - Google Patents
コマンド文構築プログラム,処理方法,および処理装置 Download PDFInfo
- 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
Links
Images
Abstract
【解決手段】 文字列生成部10は,利用者のプログラム4の外部プログラム5の呼び出しコマンドに追加される部分文字列を取得し,定数情報をもとに部分文字列の属性(定数/非定数)を判定し,判定結果と結合位置を部分文字列情報記憶部20に記憶する。コマンド文構築時に,コマンド文構築部30は,部分文字列情報をもとに,定数の文字列をテンプレート文にそのまま追加し,非定数の文字列を示すプレースホルダを追加して初期化し,非定数の文字列の値をプレースホルダにバインドして,実行コマンド文を構築する。
【選択図】 図1
Description
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)への入力が任意データであっても認証条件を満たすため,パスワード認証処理が無意味となってしまう。
String query = “SELECT * FROM user_info WHERE
user=\”” + userid + “\” AND pass=\”” + password + “\””;
PreparedStatement pstmnt = con.prepareStatement(query);
ResultSet rs = pstmnt.executeQuery();
(b)クエリが動的に変化する場合に静的テンプレートの用意が困難になる: 条件分岐,ループなどによって発行され,その実行ごとに動的に変化するクエリである場合に,分岐やループの組み合わせ数だけ静的クエリのテンプレートを用意しなければならない。そのため,コーディング量とバグ発生率の増加を招き,保守性が低下するという問題が生じる。
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);
しかし,システムは,どの情報を秘匿するべきかを判断できないため,プログラムミスによる情報漏洩をシステム的に防止することは困難であった。
図3は,部分文字列作成処理(ステップS2)の処理フローを示す図である。
利用者のプログラム4で外部プログラム5の呼び出しコマンドの構築が必要となった場合に,コマンド文構築部30は,呼び出しコマンドのコンテキストに対応する呼び出し部を選択して起動する。
利用者のプログラム4の外部プログラム5の呼び出しコマンドがOSコマンドに関するものである場合には,OSコマンド呼び出し部33が起動される。本例では,利用者のプログラム4で,図9(A)に示すOSコマンド(ファイル情報表示および検索)が作成されるとする。
[HTMLのコマンド文構築処理]
利用者のプログラム4において外部プログラム5へ出力するHTMLが生成される場合に,HTML生成部35が起動される。本例では,図12(A)に示すHTMLが記述され,図3に示す処理フローにしたがって,図12(B)に示す部分文字列情報が生成され記憶されているとする。
利用者のプログラム4において,外部プログラム5へ情報出力を行う場合には出力情報生成部37が起動される。
氏名=(大久保 隆代);年齢=(28)
プライバシー保護の観点などから,データ項目の情報を非表示/代替表示とするプログラミングが必要な場合でも,プログラムミスによって表示させてしまうおそれがある。
実施例1において防御対象となるインジェクション攻撃を説明する。攻撃の一例として,攻撃者が,ユーザ入力でなく,一旦メモリ上やデータベースに格納された値を利用してインジェクション攻撃(セカンドオーダー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"が,データベースに格納された値であるために,サニタイズやバインドメカニズムの対象から漏れてしまうことが原因となっている。
- 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()内部では以下の処理が実行される。
?? and where userid=?
このようなコードは,PreparedStatementの構文として不正であってエラーとなるため,プログラムミスとして検出が可能になる。
さらに,実施例2として,プログラマがプログラムミスにより,データベースから取得した非表示とするべき情報を誤って表示させてしまう場合を想定する。例えば,プログラマが,本来表示すべきでないユーザID,パスワードを誤って表示させるプログラムを書くとする。
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に示す部分文字列情報のとおりとなる。
user ID = ***** password = *****
これにより,非表示とする情報を誤って表示させるというプログラムミスがあっても,情報漏洩を防止することができる。
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に相当)は,文字列が追加された時に,それを強制的に定数とみなして部分文字列に追加する。
user ID = admin password = *****
以上,本発明をその実施の形態により説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。
10 文字列生成部
11 文字列追加部
13 定数部分判定部
15 部分文字列情報生成部
17 定数化設定部
20 部分文字列情報記憶部
30 コマンド文構築部
31 SQL呼び出し部
33 OSコマンド呼び出し部
35 HTML生成部
37 出力情報生成部
39 バインド処理部
310 パラメータリスト
4 利用者のプログラム
5 外部プログラム
Claims (8)
- 部分文字列情報記憶部を備えるコンピュータに,
プログラムのコマンド文に追加される部分文字列を取得する部分文字列取得処理と,
前記コマンド文の静的要素を定義した定数情報をもとに,前記追加される部分文字列が定数であるかを判定する定数部分判定処理と,
前記部分文字列の値,当該部分文字列が追加される結合位置,および前記定数部分判定処理の判定結果をもとに前記部分文字列が定数または非定数のいずれかを示す属性を含む部分文字列情報を生成して前記部分文字列情報記憶部に格納する部分文字列情報生成処理と,
前記コマンド文を構築する場合に,前記部分文字列情報記憶部から前記コマンド文の部分文字列情報を取得し,前記部分文字列の属性が定数の場合に当該部分文字列の値を結合位置に従って前記コマンド文の所定のテンプレート文字列に追加する処理と,または前記部分文字列の属性が非定数の場合に当該部分文字列に対応する所定文字を結合位置に従って前記テンプレート文字列に追加する処理とを行うことによって,前記実行コマンド文を構築するコマンド文構築処理とを
実行させるためのコマンド文構築プログラム。 - 前記コマンド文構築処理において,前記属性が非定数の部分文字列について,前記文字として所定のプレースホルダを前記テンプレート文字列の結合位置に追加し,当該非定数の部分文字列の値をパラメータリストに格納し,前記パラメータリストの部分文字列の値を前記プレースホルダに設定する処理を行うことによって,前記実行コマンド文を構築する処理を,
前記コンピュータに実行させるための請求項1に記載のコマンド文構築プログラム。 - 前記コマンド文構築処理において,前記コマンド文が情報出力を行うものである場合に,前記プレースホルダに前記パラメータリストの部分文字列の値の代わりに所定の表示文字列を設定する処理を,
前記コンピュータに実行させるための請求項2に記載のコマンド文構築プログラム。 - 前記コマンド文構築処理において,前記コマンド文が情報出力を行うものである場合に,前記属性が非定数の部分文字列について,当該部分文字列の値の代わりに所定の表示文字列を結合位置に追加する処理を行うことによって,前記実行コマンド文を構築する処理を,
前記コンピュータに実行させるための請求項1に記載のコマンド文構築プログラム。 - ユーザによって指示された部分文字列の属性を定数とする定数化指定処理を,
前記コンピュータに実行させるための請求項3または請求項4に記載のコマンド文構築プログラム。 - 前記出力コマンド文構築処理において,任意の数列または文字列である乱数を生成し,前記表示文字列として用いる
ことを特徴とする請求項3または請求項4に記載のコマンド文構築プログラム。 - 部分文字列情報記憶部を備えるコンピュータが実行する処理方法であって,
プログラムのコマンド文に追加される部分文字列を取得する部分文字列取得過程と,
前記コマンド文の静的要素を定義した定数情報をもとに,前記追加される部分文字列が定数であるかを判定する定数部分判定過程と,
前記部分文字列の値,当該部分文字列が追加される結合位置,および前記定数部分判定処理の判定結果をもとに前記部分文字列が定数または非定数のいずれかを示す属性を含む部分文字列情報を生成して前記部分文字列情報記憶部に格納する部分文字列情報生成過程と,
前記コマンド文を構築する場合に,前記部分文字列情報記憶部から前記コマンド文の部分文字列情報を取得し,前記部分文字列の属性が定数の場合に当該部分文字列の値を結合位置に従って前記コマンド文の所定のテンプレート文字列に追加する処理と,または前記部分文字列の属性が非定数の場合に当該部分文字列に対応する所定文字を結合位置に従って前記テンプレート文字列に追加する処理とを行うことによって,前記実行コマンド文を構築するコマンド文構築過程とを,
備えるコマンド文構築処理方法。 - プログラムのコマンド文に追加される部分文字列を取得する部分文字列取得部と,
前記コマンド文の静的要素を定義した定数情報をもとに,前記追加される部分文字列が定数であるかを判定する定数部分判定部と,
前記部分文字列の値,当該部分文字列が追加される結合位置,および前記定数部分判定処理の判定結果をもとに前記部分文字列が定数または非定数のいずれかを示す属性を含む部分文字列情報を生成して部分文字列情報記憶部に格納する部分文字列情報生成部と,
前記コマンド文を構築する場合に,前記部分文字列情報記憶部から前記コマンド文の部分文字列情報を取得し,前記部分文字列の属性が定数の場合に当該部分文字列の値を結合位置に従って前記コマンド文の所定のテンプレート文字列に追加する処理と,または前記部分文字列の属性が非定数の場合に当該部分文字列に対応する所定文字を結合位置に従って前記テンプレート文字列に追加する処理とを行うことによって,前記実行コマンド文を構築するコマンド文構築部とを
備えるコマンド文構築処理装置。
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)
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)
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 | 文字入力装置 |
-
2008
- 2008-01-18 JP JP2008009562A patent/JP5145967B2/ja not_active Expired - Fee Related
Patent Citations (6)
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)
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 |