コードインジェクション攻撃について
言語のコードインジェクションは、ユーザー入力がアプリケーションのコードとして実行される脆弱性です。この脆弱性を利用すると、攻撃者はアプリケーションに任意のコードを実行させることができ、結果としてシステムの制御を奪取したり、データを漏洩させたりする可能性があります。各言語には異なるインジェクションのリスクがあり、適切な対策が求められます。
<?php
$code = $_GET['code'];
eval($code);
?>
ユーザーがcode
パラメータにphpinfo();
と入力すると、サーバーのPHP設定情報が表示されます。また、system('rm -rf /');
を入力すると、サーバー上の全ファイルが削除される可能性があります。
eval
の使用を避ける: 可能な限り、eval
を使用しないようにする。user_code = input("Enter your Python code: ")
exec(user_code)
ユーザーがexec
関数を使用してimport os; os.system('rm -rf /')
などの危険なコードを実行すると、システムが破壊される可能性があります。
exec
やeval
の使用を避ける: これらの関数は直接的なユーザー入力の実行を避ける。const vm = require('vm');
const userCode = req.body.code;
vm.runInThisContext(userCode);
ユーザーがrequire('fs').unlinkSync('/etc/passwd');
などのコードを送信すると、サーバーのファイルが削除される可能性があります。
vm.runInThisContext
の使用を避ける: ユーザーが送信したコードをそのまま実行しない。vm
モジュールのサンドボックス機能を使って、危険な操作ができないようにする。import javax.script.*;
public class CodeInjectionExample {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String userCode = args[0];
engine.eval(userCode);
}
}
攻撃者がargs[0]
にjava.lang.Runtime.getRuntime().exec("rm -rf /");
のようなコードを渡すと、任意のシステムコマンドが実行される可能性があります。
my $code = $ARGV[0];
eval $code;
攻撃者が$ARGV[0]
にsystem("rm -rf /")
を入力すると、システムのファイルが削除される可能性があります。
eval
の使用を避ける: 可能な限りeval
を使用しない。ほとんどの言語において、eval
や類似の機能を使うことで、コードインジェクションのリスクが発生します。ただし、JavaScriptを使用するNode.jsではvm
モジュールがそのリスクを軽減するために使われることが多く、Javaではセキュリティマネージャーを活用することで制御できます。
また、特定の言語やフレームワークでは、バージョンによってセキュリティ強化が図られており、脆弱性の有無が異なる場合もあります。
eval
やexec
、スクリプトエンジンの使用を避け、サンドボックスや制限付き環境でコードを実行する。これらの対策を実施することで、コードインジェクション攻撃のリスクを効果的に軽減できます。