遠隔コード実行(RCE)とは?他人のサーバーでプログラムを動かされる脆弱性

遠隔コード実行、他人のサーバーで、何が起きる?。寅次郎先生と記事の内容を表すイラスト。
確認日:2026年10月24日

脆弱性のニュースでは、「遠隔コード実行のおそれ」という言葉がよく出てきます。2026年10月に公表されたPHPとNode.jsの脆弱性も、どちらもこの種類でした。

本記事では、遠隔コード実行で何が起きるのか、なぜ脆弱性の中でも特に重く扱われるのかを解説します。どんな弱点から起こるのか、被害を小さくするには何をすればよいのかも、あわせて整理しました。

遠隔コード実行とは

遠隔コード実行(RCE:Remote Code Execution)は、インターネットの向こうにいる攻撃者が、他人のコンピューターの上で、自分の用意したプログラムや命令を動かせてしまうことです。「リモートコード実行」と呼ばれることもあります。その流れを、下の図に示しました。

攻撃者がインターネット越しに細工したデータを送ると、サーバーのプログラムの弱点のある処理がそれを命令として動かしてしまい、攻撃者の命令がそのプログラムの権限で動くことを示す図

サーバーで動くプログラムは、本来なら、決められた処理だけを行います。ところが、プログラムに弱点があると、攻撃者が送ったデータが、そのプログラムの中で命令として動いてしまうのです。

動き始めた攻撃者の命令は、乗っ取られたプログラムと同じ権限を持ちます。そのプログラムが読めるファイルは読まれ、書き換えられるページは書き換えられかねません。

遠隔コード実行は、不具合の原因の名前ではなく、攻撃が成功したときに起こる結果の名前です。原因になる弱点にはいくつもの種類があり、どれも行き着く先が「攻撃者の命令が動く」という同じ結果になります。

脆弱性の中で最も重く扱われる理由

脆弱性の深刻度は、CVSSという共通の物差しで、0から10までの点数で表されます。点数と段階の対応は、次のとおりです。

段階 点数
緊急 9.0〜10.0
高 7.0〜8.9
中 4.0〜6.9
低 0.1〜3.9

遠隔コード実行の脆弱性は、緊急の段階に入ることが多くあります。点数を重くする条件がそろいやすいためです。インターネット越しに攻撃でき、ログインや利用者の操作も要らない場合が多くあります。そのうえ、情報を読まれる被害も、書き換えられる被害も、止められる被害もすべて起こりえるのです。PHP2Shellの2件と、Node.jsのBrotliの不具合も、どれも10点満点中9.2でした。

乗っ取られたサーバーの中だけで、被害が終わるとは限りません。攻撃者の命令が届く先を図に描きました。

乗っ取られたサーバーで動く攻撃者の命令が、データベースの情報を盗み、ページを書き換えて訪問者を偽のサイトへ誘い、社内の別のサーバーへの足がかりにもなることを示す図

多くのWebアプリは、記事や会員の情報を保存するデータベースのパスワードを、サーバー上の設定ファイルに書いています。攻撃者はこれを読んで、データベースの中身を盗めるわけです。ページを書き換えて、訪問者を偽のサイトへ誘う仕掛けを埋め込まれることもあるでしょう。

インターネットに公開しているサーバーは、攻撃者が社内のネットワークに入り込む最初の足がかりにもなります。乗っ取ったサーバーから、外からは見えない別のサーバーへ攻撃を広げられるためです。あとから入り直すための裏口(バックドア)を置かれれば、脆弱性を直したあとも、乗っ取られたままになりかねません。

遠隔コード実行につながる主な弱点

遠隔コード実行の原因になる弱点は、大きく3つの種類に分けられ、攻撃者のデータが命令として扱われるまでの道筋が、それぞれ違います。

入力が命令の一部として読まれる

1つ目は、利用者から受け取った入力を使って命令を組み立てるとき、入力をそのまま命令に混ぜてしまう弱点です。命令の一部として読まれる入力を送り込む攻撃を、インジェクション(注入)と呼びます。例を1行ずつ並べました。

利用者名を受け取ってOSの命令に組み立てる処理で、taroを受け取ればそのフォルダーの一覧を出すだけだが、taroの後ろに「;」と別の命令を付けた入力を受け取ると、別の命令まで動いてしまうことを示す図

利用者名を受け取り、その人のフォルダーの一覧を出す処理があるとします。taro と入力されれば、ls -l /home/taro という命令を作って実行するだけです。ところが、入力に ; と別の命令を付けると、; は命令の区切りとして読まれ、後ろの命令まで実行されてしまいます。

防ぐには、入力に含まれる ; のような特別な文字を、命令の区切りとして読まれないように無害にしなければなりません。OSの命令に限らず、プログラムのコードやデータベースへの問い合わせを組み立てるときも、同じ考え方が必要です。

メモリーの扱いを誤る

2つ目は、プログラムがデータを置くメモリーの扱いを誤る弱点です。PHPやNode.jsのように、ほかのプログラムを動かすためのソフトの中で見つかることもあります。代表的な2つを並べました。

メモリーの扱いの弱点として、用意した領域からあふれて隣のデータまで書き込む範囲外書き込みと、片付けた場所を指す古いメモで別のデータを書き換える解放後の使用を並べ、どちらも書き換えたデータを足がかりに命令を動かされることを示す図

範囲外書き込みは、用意した領域に収まらないデータを、その外まで書き込んでしまう不具合です。Node.jsのBrotliの不具合がこれにあたり、隣にある別のデータが書き換えられました。

解放後の使用は、片付けたはずのメモリーを、古い参照を頼りに使い続けてしまう不具合です。PHP2ShellのCVE-2026-109619がこれにあたり、片付けた場所に別のデータが入ったあとも、古いメモを頼りに作業していました。

どちらも、それだけでは「データがおかしくなる」不具合にすぎません。攻撃者が、書き換える場所と中身を思いどおりに選べると、プログラムの次の動きを決めるデータまで書き換えられ、遠隔コード実行につながります。

受け取ったファイルやデータをそのまま動かす

3つ目は、外から受け取ったファイルやデータを、確かめないまま動かしてしまう弱点です。分かりやすい例として、ファイルのアップロードの流れを図にしました。

攻撃者が画像の代わりに.phpのファイルを送ると、サーバーは種類を確かめずに画像のフォルダーに保存する。攻撃者がそのファイルのURLを開くと、サーバーがプログラムとして実行し、攻撃者の命令が動くことを示す図

画像を投稿できるサイトが、届いたファイルの種類を確かめずに、公開しているフォルダーへ保存するとします。攻撃者が画像の代わりにPHPのプログラム(.php のファイル)を送り、そのURLを開くと、サーバーはそれをプログラムとして実行してしまうのです。

似た弱点に、受け取ったデータからプログラムの中のデータの組み立てを元に戻す処理(デシリアライズ)を、中身を確かめずに行うものがあります。組み立て直す途中で、攻撃者の用意した処理を呼び出されることがあるためです。

被害を小さくするための備え

遠隔コード実行の脆弱性は、見つかってから修正版が出るまで、利用者の側では防ぎにくいものです。それでも、修正を早く当てること、乗っ取られたときに届く範囲を小さくすること、修正までの時間を稼ぐことで、被害を小さくできます。

修正版を早く当てる

最も確実な備えは、脆弱性を直した修正版を、できるだけ早く当てることです。修正版が公開されると、どこを直したかを、攻撃者も読めるようになります。そのため、公開から自分の環境に当てるまでの間が、最も危ない期間です。

PHPやNode.jsのように広く使われるソフトでは、修正版の公開から数時間のうちに、攻撃の試みが急に増えることもあります。使っているソフトの修正版の知らせを受け取れるようにし、サポートが続いている版を使い続けることが、日ごろの備えです。

プログラムの権限を小さくする

攻撃者の命令は、乗っ取ったプログラムの権限を超えられません。同じ攻撃を受けたときの違いを比べました。

同じ遠隔コード実行を受けても、権限が大きいプログラムではデータベースのすべてや社内の別のサーバーにまで届くが、権限を絞ったプログラムでは自分の仕事に要るデータとフォルダーにしか届かないことを比べた図

プログラムには、その仕事に要る最小限の権限だけを与えるべきで、この考え方を最小権限の原則と呼びます。たとえば、Webアプリのプログラムを管理者の権限で動かさず、データベースには必要な表だけを読み書きできる利用者でつなぐ設定です。

プログラムを囲いの中で動かす方法も、被害を閉じ込める助けになるでしょう。コンテナやサンドボックスの中で動かしたり、公開するサーバーと社内のネットワークを分けたりすれば、乗っ取られても外へ広がりにくくなります。

修正までの時間を稼ぐ

すぐに修正版を当てられないときは、攻撃が届く道を一時的にふさぐ方法があります。サーバーの手前に置いて攻撃らしい通信を遮断する仕組み(WAF)を使ったり、サイトを一時的に止めたりする方法です。

ただし、WAFは知られている攻撃の形を止めるものなので、すべての攻撃を防げるわけではありません。Node.jsのBrotliの不具合のように、自分のサーバーが外から取ってきたデータで攻撃が成立する場合は、外から届く通信を調べるWAFでは守れないのです。時間稼ぎのあとに、必ず修正版を当ててください。

実際に起きた遠隔コード実行

遠隔コード実行の脆弱性は、毎年のように見つかっています。ここでは、広く使われるソフトで見つかった3つの例を取り上げましょう。

Log4Shell(2021年)

2021年12月に公表されたLog4Shell(CVE-2021-44228)は、Javaのプログラムで広く使われる、ログを書くためのライブラリ「Apache Log4j」の脆弱性でした。ログに書く文字列の中の特別な書き方を、ライブラリが解釈してしまうことが原因です。

ログには、利用者が入力した文字列もそのまま書かれます。そのため攻撃者は、細工した文字列を入力欄などに送るだけで、ログインなしに任意のコードを実行させられました。米国のサイバーセキュリティ機関CISAは、悪用が確認された脆弱性の一覧にこれを加え、成功すればシステムを乗っ取られると警告しています。

PHP2Shell(2026年)

2026年10月に公表されたPHP2Shellは、Webサイトを動かすPHP本体の2件の脆弱性です。処理が途中で失敗したときの後片付けの不備から、ログインなしに遠隔コード実行ができました。PHPで動くページを開かれるだけで攻撃が届くため、多くのサービスが緊急メンテナンスに入っています。詳しくは、PHP2Shellとは?で解説しました。

Node.jsのBrotliの不具合(2026年)

PHP2Shellと同じ日に、Node.jsも、圧縮されたデータを展開する処理の不具合(CVE-2026-111497)を直しました。範囲外書き込みから遠隔コード実行につながるおそれがあり、公開の翌日には、公式の版で命令の実行が確かめられています。詳しくは、Node.jsのBrotli脆弱性とは?で解説しました。

参考にした一次情報

当サイトが作成した本文はCC BY 4.0です。引用画像は対象外です。Webのしくみの記事の一覧へもどる