eval インジェクション
eval インジェクション とは何ですか?
eval インジェクションJavaScript の eval() や Python の eval/exec などの動的評価プリミティブに、信頼できない入力を渡すことで起こる具体的なコード注入。
eval インジェクションはコード注入の具体的なサブケースで、言語の動的評価関数(JavaScript の eval、new Function、文字列を渡す setTimeout、Python の eval/exec、Ruby の eval、PHP の同等関数、VBA の Application.Run など)が、直接または間接にユーザ入力由来のデータを引数として呼ばれてしまうケースです。これらは渡された文字列をホストプロセス内の完全なソースコードとして解釈・実行するため、悪用に成功すれば言語レベルでの完全な RCE が得られ、インポート、グローバル変数、ファイルシステム、環境変数、子プロセスへすべてアクセスできます。対策には、動的評価そのものの撤廃、JSON.parse や ast.literal_eval などの安全なパーサへの置換、数式評価が必要な場合の厳格なホワイトリスト検証、vm2 のようなランタイムサンドボックスや制限付きサブプロセスの利用があります。
● 例
- 01
Python: result = eval(request.form['expr']) — ペイロード __import__('os').system('id')。
- 02
Node: new Function('return ' + req.query.f)() — ペイロード process.mainModule.require('child_process').execSync('id')。
● よくある質問
eval インジェクション とは何ですか?
JavaScript の eval() や Python の eval/exec などの動的評価プリミティブに、信頼できない入力を渡すことで起こる具体的なコード注入。 サイバーセキュリティの 攻撃と脅威 カテゴリに属します。
eval インジェクション とはどういう意味ですか?
JavaScript の eval() や Python の eval/exec などの動的評価プリミティブに、信頼できない入力を渡すことで起こる具体的なコード注入。
eval インジェクション はどのように機能しますか?
eval インジェクションはコード注入の具体的なサブケースで、言語の動的評価関数(JavaScript の eval、new Function、文字列を渡す setTimeout、Python の eval/exec、Ruby の eval、PHP の同等関数、VBA の Application.Run など)が、直接または間接にユーザ入力由来のデータを引数として呼ばれてしまうケースです。これらは渡された文字列をホストプロセス内の完全なソースコードとして解釈・実行するため、悪用に成功すれば言語レベルでの完全な RCE が得られ、インポート、グローバル変数、ファイルシステム、環境変数、子プロセスへすべてアクセスできます。対策には、動的評価そのものの撤廃、JSON.parse や ast.literal_eval などの安全なパーサへの置換、数式評価が必要な場合の厳格なホワイトリスト検証、vm2 のようなランタイムサンドボックスや制限付きサブプロセスの利用があります。
eval インジェクション からどのように防御しますか?
eval インジェクション に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
eval インジェクション の別名は何ですか?
一般的な別名: eval() 注入, 動的評価インジェクション。
● 関連用語
- attacks№ 195
コードインジェクション
攻撃者が与えたデータがアプリケーションによってコードとして解釈・実行される脆弱性の総称。任意コード実行に直結する。
- attacks№ 1009
サーバーサイドテンプレートインジェクション
テンプレートエンジンの構文を不信頼な入力に注入し、テンプレートの描画時にサーバー上でコード実行を引き起こす攻撃。
- attacks№ 202
コマンドインジェクション
ユーザー入力をサニタイズせずに OS シェルへ渡し、攻撃者が指定したコマンドをアプリケーションに実行させる攻撃。
- vulnerabilities№ 539
安全でないデシリアライゼーション
アプリが信頼できないデータをデシリアライズすることで、攻撃者が任意オブジェクトを生成し、しばしばリモートコード実行に至る脆弱性。
- appsec№ 538
入力検証
アプリケーションが処理する前に、信頼できないすべての入力が期待する型・長さ・範囲・形式・値集合に合致しているかをサーバー側で確認する処理。