リモートコード実行とは
リモートコード実行、または任意コード実行とは、攻撃者が他者のコンピュータを自由に操作できるというサイバー攻撃の一形態を指します。ホストが悪意あるマルウェアをダウンロードすることでRCEが発生します。この現象は、デバイスの設置場所に関係なく起こり得ます。
Remote Code Executionは、ユーザ入力がファイルや文字列に注入され、そのままプログラミング言語のパーサで実行される際に発生する脆弱性を示す概念です。この動作はウェブアプリの開発者が意図して行うものではありません。リモートコード実行攻撃により、ウェブアプリやサーバ全体が危険にさらされる可能性があります。また、権限の昇格やネットワーク内での横展開、永続性の確保へとつながる場合もあります。このため、RCEは常に高い(重大な)リスクとして扱われます。なお、ほとんどのプログラミング言語には異なるコード評価関数が備わっています。
同じプログラミング言語内のコード評価関数にユーザ入力を渡すと、コード評価が発生することがあります。この仕組みは、意図的に言語の数学的機能にアクセスするために実装される場合や、開発者が誤ってユーザ入力をその関数内に組み込む設計にした場合などがあります。この手法は推奨されず、多くの人がコード評価の使用を悪意あるものと考えています。
ここではコード評価攻撃の一例を見ていきます。
各ユーザごとに動的に変数名を生成し、登録日を保存するという考えは一見良さそうに見えます。以下はPHPでの実装例です。
eval(“\$$user = ‘$regdate’);
As long as the username is controlled by the user’s input, an attacker may create a name like this:
x = ‘y’;phpinfo();//
生成されるPHPコードはこのようになります:
$x = ‘y’;phpinfo();// = 2016’;
この例では、変数がxと呼ばれているにもかかわらず、実際の値はyとなっています。攻撃者が変数に別の値を割り当てると、セミコロン(;)を用いて新たなコマンドを付加でき、文字列の残り部分に任意のコードを続けることが可能です。この方法では、構文エラーを回避しつつ、コード実行が行われます。コードが実行されると、phpinfoの出力が画面に表示されます。PHPなど、ユーザ入力を評価する機能を持つ言語では注意が必要です。
多くのリモートコード実行の脆弱性は、その起源に遡る基本的な原因によるものです。以下に分類を示します。
動的コード実行は、コード実行攻撃を引き起こす最も一般的な原因です。多くのプログラミング言語は、あるコードから別のコードを生成し、即時に実行できるよう設計されています。この仕組みは複雑な問題を解決するために有効ですが、悪意ある攻撃者に利用されるとRCEが実現される恐れがあります。
通常、生成されるコードはユーザ入力に依存しています。コードには、特定のパターンに沿って保存された情報が組み込まれることが一般的です。もし攻撃者が、コード評価時に特定の情報が利用されることを把握すれば、その情報を狙って不正なコードを生成する可能性があります。ユーザ入力が適切に検証されなければ、コードがそのまま実行されてしまいます。
さらに、動的コード実行に起因するRCE攻撃は、直接型と間接型の2種類に分けられます。
直接型の場合、攻撃者は自分の入力がコード生成に使用されることを認識しています。
間接型では、評価されるコードがユーザ入力を含む場合があります。通常、ユーザ入力は複数の層を経由し、その過程で内容が変更されることもあります。また、動的コード実行は入力が直ちに利用されるわけではなく、後続の処理として実行される場合もあるため、入力がコードの一部として実行されることがユーザに分かりにくい状況となります。
Deserializationは、この状況を説明するのに適した例です。デシリアライズ中にコード実行が発生してはいけません。例えば、シリアライズされたオブジェクトに不適切なデータや類似のオブジェクトが含まれている場合、またオブジェクトの要素自体がシリアライズされている場合、複雑な状況が発生し、結果として動的コード実行のリスクが高まります。
動的言語だけがシリアライズの影響を受けると思われがちですが、実際は静的言語でも同様の問題が発生し得ます。静的言語では実現が難しいものの、決して不可能というわけではありません。
場合によっては、デシリアライズによって生成された中間オブジェクトが、動的コード実行を引き起こす原因となることがあります。実行時のオブジェクトは動的コード実行によりしか生成され得ないため、外部から渡されたデータがデシリアライズされる場合、攻撃者がそのデータを乗っ取り変更する危険性があります。また、あらかじめ設計されたコード片が、デシリアライズされる際に動的コード実行を起こすことも考えられます。
もう一つのRCE攻撃の基本原因は、メモリ安全性、またはAPIセキュリティに関連しています。メモリ安全性とは、コードが許可されていないメモリ領域へアクセスしないようにする仕組みを指します。メモリ安全性が欠如すると、不正な情報へのアクセスにつながる可能性があります。しかし、OSやデバイスは実行可能なコードやそのメタデータをメモリに格納しているため、これらの領域への不正なアクセスがACEやRCEを引き起こすことがあります。ここから、メモリ安全性に関する問題の主な原因を見ていきます。
製品の設計不備は、特定の内部コンポーネントにおける設計ミスから生じるメモリ安全性の脆弱性の一例です。問題の箇所は、コンパイラ、インタプリタ、仮想マシン、またはOSの一部やライブラリなど多岐にわたります。
Buffer overflowは、メモリ安全性を破るための基本かつ有名な手法の一つです。この攻撃は、特定の設計上の欠陥やバグを利用して、メモリバッファの末尾に配置された領域にアクセスするものです。通常は正規のAPI呼び出しを通じてメモリが取得されますが、基点(cradle)を用いて、特定のデータや命令の実際のメモリアドレスを突き止めることができます。基点からの差分が大きく、容易に推測される場合もあり、コードの解析や実行状態の調査が、攻撃者にとって有利に働く可能性があります。
つまり、基点のオーバーフローにより、本来アクセスできないメモリが変更される恐れがあります。さらに、基点が別のマシンのアドレス空間に存在する場合、遠隔のAPI呼び出しによりそのメモリにアクセスされる可能性があります。こうした手法はRCE攻撃に利用されるリスクを孕んでおり、バッファオーバーフローの脆弱性がある限り、RCE発生の可能性は否定できません。コード管理者は、RCE攻撃が発生する前に迅速にこれらの脆弱性を修正する必要があります。
メモリ安全性の問題は、システム設計の欠陥に起因する場合もあります。これらはプログラム上の脆弱性ほど一般的ではなく、発見が困難ですが、OS全体に大きな影響を及ぼす可能性があります。
システム上でリモートコード実行攻撃が成功すると、攻撃者はプログラミング言語やサーバの機能を利用し、他のコマンドを実行することが可能になります。多くの言語では、ファイルの書き込み、読み込み、削除などを行うコマンドが実行可能であり、場合によっては他のデータベースへの接続も可能です。
攻撃者がRCE脆弱性を狙う理由は明確です。ペネトレーションテストの場合、RCEの発見は他の多くの脆弱性やセキュリティ問題につながるため、企業にとって重要なポイントとなります。一方、悪意あるハッカーがRCEを発見・悪用すると、企業の信頼性や機密性が著しく損なわれるリスクが高まります。RCEの悪用は企業が直面しうる最悪のシナリオのひとつであり、隔離環境下でも、内部ネットワークへの拡大攻撃の可能性があるため、99%の確率で「重大」と評価されます。
RCEは時に深刻な結果をもたらし、これまでにも多くの事例が報告されています。ここでは、サイバー犯罪者がRCEの脆弱性を利用し、被害サイトやエンドユーザに悪用した最新の例を5件紹介します。
Log4J Shellで発見されたこの問題は、一連の連鎖反応を引き起こしました。つまり、44228脆弱性に起因して、新たに45105や45046という2件の脆弱性が確認されました。この問題はApacheでも発生し、Log4jのさまざまなバージョンに影響を及ぼしました。Log4jはJavaのライブラリであり、何百万ものアプリで使用されていたため、広範囲に影響が波及しました。
この脆弱性を利用し、攻撃者は認証なしで遠隔からコードを実行することが可能でした。偽のLDAPサーバを構築するだけで、悪意あるコードが動作するため、その利用は容易かつ迅速でした。その結果、多くの大手ウェブサービスが被害に遭いました。
この脆弱性はAppleのOSに存在し、世界中の多くのAppleデバイスやユーザに影響を及ぼしました。攻撃者は外部で制御されたURLを利用し、不正なペイロードを任意のデバイス上で実行できるようになりました。iOS、macOS、Safari、watchOSといった主要なApple OS全てが対象となりました。
この問題はMS Windowsに影響し、NFSバージョン3の脆弱性が原因で発生しました。攻撃者は、侵害されたNFSサーバの接続を利用して、ペイロードを送り、任意の非保護エンドポイントで実行することが可能となりました。
この脆弱性はWordPressのセキュリティに大きな影響を与え、従来の運用方法を一変させました。2019年にWordPress 5.0.0で確認された8942を利用し、攻撃者はPHPコードを含むExifメタデータ付きの画像を介して、ターゲットサイトのWordPressディレクトリに不正なコードを追加することが可能でした。その後、コードが実行され、被害サイトに悪影響を及ぼしました。
有名なMicrosoft ExcelのRCE脆弱性は、攻撃者が侵害されたコンピュータ上でマルウェアを実行するきっかけとなりました。攻撃者はこの脆弱性を利用して被害デバイスを完全に制御し、場合によってはユーザの管理者権限を奪うことも可能でした。データやアプリの変更、追加、削除、移動など、あらゆる操作が行われ得たのです。
まず、評価関数内にユーザ入力を渡さないようにすることが重要です。この場合、evalなどの関数の使用を完全に避けるのが最善です。これは望ましくない手法とされ、容易に回避可能です。また、プログラミング言語で解析されたファイルの内容をユーザが編集できないようにすることも推奨されます。たとえば、ウェブアプリにアップロードや作成されるファイル名や拡張子をユーザに決定させるのは避けるべきです。
以下は、RCE攻撃を防ぐために行うべきでない例です:
最新情報を購読