コードインジェクション攻撃について
言語のコードインジェクションは、ユーザー入力がアプリケーションのコードとして実行される脆弱性です。この脆弱性を利用すると、攻撃者はアプリケーションに任意のコードを実行させることができ、結果としてシステムの制御を奪取したり、データを漏洩させたりする可能性があります。各言語には異なるインジェクションのリスクがあり、適切な対策が求められます。
<?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、スクリプトエンジンの使用を避け、サンドボックスや制限付き環境でコードを実行する。これらの対策を実施することで、コードインジェクション攻撃のリスクを効果的に軽減できます。