エクスプロイト
エクスプロイト("exploit")とは、コンピュータのセキュリティ用語。もともとは、脆弱性を利用したソースコードを指し、そこから広まった複数の意味を持つ。
コンピュータ関連のソフトウェアやハードウェアの脆弱性を利用した悪意ある行為のために書かれた、スクリプトまたはプログラムを指す言葉である。脆弱性攻撃や脆弱性利用と翻訳される例もあるものの、あまり使われては居ない。あるいは全く逆のセキュリティ確認目的での、脆弱性検証するための実証コード(Proof of concept：PoC)を指すこともある。また、前記のようなスクリプトやプログラムを用いて脆弱性を攻撃するという意味合いでも用いられる。そのため、前記のようなスクリプトやプログラムをエクスプロイトコード("exploit code")と呼んで区別する場合もある。エクスプロイトは、それ単体では自己増殖機能を持つものを意味しないため、狭義のコンピュータウイルスではないが、そのコードの性質上、コンピューターに害をなすプログラムの一種としてアンチウイルスソフトウェアによってマルウェアに分類されることも多く、その意味では広義のウイルスと言える。
なお、エクスプロイトは、英語で偉業・手柄・功績を意味し、元々クラッカーの間で用いられていたスラングであった。そのため、ソースコードを記述する視点からの命名と言えよう。2014年上半期でのエクスプロイトは、javaが9割を超えると報告されている。
エクスプロイトは、その攻撃の種類から「DoS攻撃」と「権限昇格攻撃」に分類可能である。前者は、対象となるサービスを妨害する攻撃となる。後者は、対象となるソフトウェアの実行権限の範囲であれば、何でも実行可能である。例えば、DDoS攻撃の踏み台となるアプリケーションやバックドアの設置、機密情報や個人情報の外部への持ち出し、SQLインジェクションによるデータベース上のアクセス制限されたデータの読み書きなどが例示できるが、これらに限定されず、エクスプロイト作者の考えによってその動作は千差万別である。上記の分類は利用する脆弱性に依存し、一部の脆弱性は「DoS攻撃」としてしか利用できない。他の脆弱性は「権限昇格攻撃」として利用可能であるが、大抵は「権限昇格攻撃」によって取得した権限を用いて攻撃対象となったソフトウェアの実行停止、つまり結果として「DoS攻撃」を行うことも可能である。
「権限昇格攻撃」には「アクセス制限の回避」という特別な攻撃が含まれる。ファイアウォールなどのフィルタリングルールを回避してアクセス可能とするという攻撃で、本来アクセスできないはずのサービスへのアクセス権限を得るという「権限昇格攻撃」の一種である。例示するなら、タイニーIPフラグメント攻撃やパケットフィルタリングソフトウェアの脆弱性を突くような攻撃が挙げられる。但し、これらだけでは攻撃者は単にサービスへの入り口が得られるだけであるため、この脆弱性だけを利用して攻撃対象に実被害を与えるようなエクスプロイトコードは成立し得ない。
エクスプロイトは、攻撃対象の場所によって「リモートエクスプロイト」と「ローカルエクスプロイト」に分類可能である。この分類は、securityfocusなどのセキュリティ団体や脆弱性情報データベースなどで用いられている脆弱性の分類と一致する。リモートエクスプロイトは、エクスプロイトコードの実行マシンと攻撃対象マシンが異なる場合を指し、ローカルエクスプロイトは、エクスプロイトコードの実行マシンと攻撃対象マシンが同一である場合を指す。例えば、リモート端末への一般ユーザ権限での不正アクセスを実現するエクスプロイトがリモートエクスプロイト、不正アクセス後にリモート端末へエクスプロイトコードを転送した後、リモート端末上で実行し管理者権限を不正に得るエクスプロイトがローカルエクスプロイトといった具合である。
エクスプロイトは、攻撃対象の種類によって「ソフトウェア」を対象としたものと「テキストコンテンツ」を対象としたものに分類可能である。旧来は前者、とりわけバイナリ形式のソフトウェアが主流であったが、CGIなどの動的にHTMLを生成する仕組みが使われ始めると、テキスト形式の言語が用いられることが多いCGIスクリプトがコードインジェクションの対象となった。バイナリ形式のソフトウェアに比べてマシン語の理解が不要なテキスト形式のソフトウェアは、攻撃する上で必要となる知識量が少なく、Webコンテンツの書き換えに重宝された。ネットショッピングなどSQLデータベースを用いたWebアプリケーションが登場すると、データベースへの不正アクセスのためにSQLインジェクションが用いられるようになった。また、クロスサイトスクリプティングのように、クライアントソフトウェアを対象としたリモートエクスプロイトも登場するようになった。JavaScriptはテキストベースの言語であるため、前記同様、バイナリベースのエクスプロイトにくらべて攻撃に必要な知識量が少ないことなどから、クライアントを対象としたエクスプロイトを成功させる上で重宝された。
これらの分類は、主流や傾向はあるが、特定一部のものを除いて独立した概念である。「DoS攻撃」で「リモートエクスプロイト」であるものには「Land攻撃」などが挙げられる。「DoS攻撃」で「ローカルエクスプロイト」であるものには「Pentium F00F バグ」や「CONCON問題」を用いたエクスプロイトが挙げられる。「テキストコンテンツ」を対象としたものは総じて「リモートエクスプロイト」に限定されがちである。「SQLインジェクション」はほとんどの場合「リモートエクスプロイト」の「権限昇格攻撃」となるが、「SQL解釈に不具合を持つ、特定のSQLを発行するとサーバが高負荷となり、正常なサービスを提供できなくなる」といった形で「DoS攻撃」となることも全くないわけではない。
エクスプロイト、とりわけ権限昇格攻撃は、空き巣に例えれば、窓や扉を無化する工具であると言えよう。これらを実行することにより、攻撃者たちは、被害者のパソコンに侵入する突破口をこじ開けることが可能となる。エクスプロイトの中でも、 未知である脆弱性を利用するものは通称ゼロデイ(0day)と呼ばれる。
ペイロードとは、エクスプロイトがこじ開けた穴を通してどのような行為を行うのかを指示するコードである。ほとんどのエクスプロイトは、このペイロードがコードの一部に含まれている。
ペイロードが、被害者に対する攻撃の内容を決定する。
例えば、ウェブサーバの脆弱性を利用して侵入後、別のウェブサーバ上にあらかじめアップロードした悪意あるプログラムをダウンロードし、インストールさせるコードをペイロードとして盛り込んでおけば、その通りに実行される。
バッファオーバーラン、とりわけReturn-to-libc攻撃や書式文字列攻撃などはエクスプロイトに頻繁に用いられる攻撃手法の一つであり、書き換えられるリターンアドレス部分にペイロードが組み込まれることになる。
エクスプロイトが利用するのは脆弱性である。すなわち、常に脆弱性に関する最新情報に注意を払い、脆弱性を解消するパッチなどを適用する、パッチが適用されるまでに時間が必要な場合や、テスト系でのパッチの評価に時間がかかるために運用系に適用できないような場合は、回避策が公開されている場合は回避策を施し、回避策が公開されていない場合にはそのソフトウェアの脆弱性を持った機能あるいはそのソフトウェア自体の使用を一時中止するというのも検討候補に挙げられる。コンピュータセキュリティに深く関与する者、企業などの団体のネットワーク管理者などであれば、このような対策となるであろう。
コンピュータセキュリティに深く関与していない一般ユーザーの視点では、上記のようなことを継続的に行うのは現実的でないと言える。そのようなユーザーの場合は、使用しているソフトウェア（オペレーティングシステムを含む）の最新バージョン情報に注意を払い、常に最新の状態を保つことが大切である。Microsoft Updateなどのように、ソフトウェアがオンラインによるバージョン更新やバージョン更新通知をサポートしている場合は、これらを利用することも有用である。また、Webブラウズやメール受信に用いているマシンでは、マルウェアを検出および除去可能なアンチウイルスソフトウェアを導入することが重要な対策となりうる。この場合も、定義ファイルを最新の状態に保っておくことが大切である。
また、利用者が多いソフトウェアや脆弱性がよく見つかるソフトウェアは、総じてエクスプロイトの攻撃対象となりやすい。頻繁にエクスプロイトの攻撃対象となっているのであれば、代替のソフトウェアやハードウェアがあるならそれらへの置き換えを行うことも、検討に値する予防策と言える。