WebVulnerabilities

コードインジェクション攻撃について

概要

言語のコードインジェクションは、ユーザー入力がアプリケーションのコードとして実行される脆弱性です。この脆弱性を利用すると、攻撃者はアプリケーションに任意のコードを実行させることができ、結果としてシステムの制御を奪取したり、データを漏洩させたりする可能性があります。各言語には異なるインジェクションのリスクがあり、適切な対策が求められます。


PHP

脆弱なコード:

<?php
$code = $_GET['code'];
eval($code);
?>

攻撃手法:

ユーザーがcodeパラメータにphpinfo();と入力すると、サーバーのPHP設定情報が表示されます。また、system('rm -rf /');を入力すると、サーバー上の全ファイルが削除される可能性があります。

防止策:


Python

脆弱なコード:

user_code = input("Enter your Python code: ")
exec(user_code)

攻撃手法:

ユーザーがexec関数を使用してimport os; os.system('rm -rf /')などの危険なコードを実行すると、システムが破壊される可能性があります。

防止策:


Node.js

脆弱なコード:

const vm = require('vm');

const userCode = req.body.code;
vm.runInThisContext(userCode);

攻撃手法:

ユーザーがrequire('fs').unlinkSync('/etc/passwd');などのコードを送信すると、サーバーのファイルが削除される可能性があります。

防止策:


Java

脆弱なコード:

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 /");のようなコードを渡すと、任意のシステムコマンドが実行される可能性があります。

防止策:


Perl

脆弱なコード:

my $code = $ARGV[0];
eval $code;

攻撃手法:

攻撃者が$ARGV[0]system("rm -rf /")を入力すると、システムのファイルが削除される可能性があります。

防止策:


言語による差異

ほとんどの言語において、evalや類似の機能を使うことで、コードインジェクションのリスクが発生します。ただし、JavaScriptを使用するNode.jsではvmモジュールがそのリスクを軽減するために使われることが多く、Javaではセキュリティマネージャーを活用することで制御できます。

また、特定の言語やフレームワークでは、バージョンによってセキュリティ強化が図られており、脆弱性の有無が異なる場合もあります。


防止策のまとめ

  1. 直接的なコードの評価を避ける: evalexec、スクリプトエンジンの使用を避け、サンドボックスや制限付き環境でコードを実行する。
  2. ユーザー入力の厳密なバリデーション: ホワイトリスト方式で許可された入力のみを受け入れる。
  3. セキュリティメカニズムの活用: 言語やプラットフォーム固有のセキュリティ機能を活用して、コードインジェクションのリスクを軽減する。

これらの対策を実施することで、コードインジェクション攻撃のリスクを効果的に軽減できます。