挿絵表示切替ボタン
▼配色







▼行間
▼文字サイズ
▼メニューバー
×閉じる
しおりの位置情報を変更しました
エラーが発生しました

ブックマークしました。

設定

設定を保存しました
エラーが発生しました

カテゴリ

ブックマークへ

以下のブックマークを解除します。
よろしければ[解除]を押してください。

ブックマークを解除しました。

ブックマークする場合はログインしてください。
<R15> 15歳未満の方は移動してください。

妹エクスプロイト

後書きに解説書いときました。鉞はやさしく投げてね
「んっ……お兄ちゃん……もう、だめっ……」
 妹の口から小さな声が漏れる。
「見て……オーバーフローしちゃった……」
 見れば、彼女のバッファは確かにオーバーフローしていた。
「お前のここはすぐ溢れちゃうなぁ」
「だってぇ、お兄ちゃんの入力()が長すぎるんだよぉ……」
 それはそうだ。長い入力でバッファをオーバーフローさせ、周辺の領域を同じ()で塗り潰す。それによって、注入の位置に多少のズレがあっても目的の場所まで滑ってうまくいくようになるのだ。
「よし、じゃあ準備もできたし本番いこうか」
「またchroot(コンドーム)しないの……?」
「大丈夫だっ、て」
 奥の奥、普通であれば決して外には露出しない領域へと、ポインタを一気に進めた。
「やっ、急に、やめ、ひゃんっ」
 妹の反応が日常と変わってしまうのも自然なこと、そしていつものことだ。ポインタを進めては戻し、また進め、巧みなアルゴリズムで妹を暴走へと導く。
「そこ、らめぇ、おかひくなっひゃう!」
 そろそろ仕上げといこう。ポインタを一気に奥まで押し進め、本来書き換えられるはずのなかった場所、彼女の最も脆弱な領域へと自身のペイロードをインジェクト(注入)していく。
「今度こそforkしろ!」
「あ、ああぁーー!!」
 ドクドクと、帯域の限界に達する速度でペイロードを送り出した。

 インジェクションを終えれば、あとは様子見だ。妹と繋がったまま、様子を観察する。
「調子はどうだ?」
「もう、本当にforkし(子ができ)ちゃったらどうするの!」
「今までだって大丈夫だったろ」
「そうは言っても! abort(中絶)なんて絶対許さないんだからね!」
「大丈夫、その時はexec(成人)するまでは責任持って面倒見るさ」
「もう……」
 妹は照れたように顔を赤らめた。確かに、外部から子プロセスを作られてしまうなんて、プログラムとしては恥もいいところである。しかし実際のところ、forkしてしまったって、何の問題もないのだ。

——ここはそれを確認するための仮想環境(セカイ)だからな。
解説:

●オーバーフロー
限界を超えて溢れてしまうことを言う。
多くの場合は、(整数などの)値が上限値や下限値を超えてしまうことで不適切な値に変化してしまう「整数オーバーフロー」と、データ領域に用意されたサイズ以上のデータを置いてしまうことで別の領域(本来そのように使うべきでない領域)まで読み書きしてしまう「バッファオーバーフロー」の2種類のことを指す。
整数オーバーフローでは、たとえば255に1を足すと0になってしまったり、16384を2倍すると-32768になってしまったりといった現象が起きる。
(コード例: http://melpon.org/wandbox/permlink/PWm1pHzn454xbQMc )

●バッファ
可変長であったり、逐次送受信されるようなデータを置いて溜めておく領域のことを言う。
この領域の終端を超えて読み書きしてしまうのが、バッファオーバーフローというバグ(脆弱性)だ。

●バッファオーバーフロー
たとえば入力文字列を受け取るための10文字分のバッファがあったとして、そこに15文字の文字列を与えれば、バッファの後ろの5文字分の領域を、文字列の最後の5文字で上書きできてしまう。文字列の長さを調整すれば、書き込む位置も(バッファの後ろであれば)ある程度自由にできる。
つまり、プログラムの外部から任意の値を任意の場所に書き込めてしまうのである。
これが素人からプロまで様々な人がやらかしてしまう、バッファオーバーフローという脆弱性だ。

●脆弱性
バグの一種。
プログラムは本来、自分の意思で(正確には、プログラム設計・開発時に意図されたように)動く必要があるが、バッファオーバーフローをはじめとする一部のバグは、プログラムを外部から操り、本来意図しなかった動作を行わせてしまうことができる場合がある。これを脆弱性(vulnerability)と呼ぶ。
有名なのは「任意コード実行」で、バッファオーバーフローでプログラム片をメモリ上に配置してそれを実行させることで、外部から好きな動作を行わせられる。こいつは極端な例えを出せば、画像を見るためのソフトの脆弱性を攻撃して、PC中のファイルを全部ネットにアップロードさせたりなど、大概のことはできてしまう超危険な脆弱性だ。
余談だが、ソフトウェアのアップデートは、バグ修正というより、この脆弱性の修正の方が重要な目的であることも多いので、アップデートがあれば素直に適用するべきである。

●周辺の領域を同じ値で塗り潰す〜〜目的の場所まで滑ってうまくいくようになる
ペイロードの手前をNOPで塗り潰す、NOPスライドという技術。或いはNOPスレッドという領域。
バッファオーバーフローでは書き込む対象の相対位置(何バイト分後ろを読み書きするか)は割と正確に操作できるが、肝心の「バッファがどの位置にあるか」自体が正確に把握できない場合もある。
そういった場合、悪意あるコードを実行しようとしても、ちょっとズレた場所から実行を開始してしまうことになる。そこで、悪意あるコードを置く場所はある程度余裕を持たせて後ろの方にしておいて、実行がそのコードより前の箇所から始まってしまっても大丈夫なように「何もしない」命令で埋めるというテクニックを用いる。
こうすると、
 何もしない→何もしない→何もしない→悪意あるコード
手前の何もしないコードから実行を開始しても、順調に「何もしない」を繰り返して、最後にはめでたく悪意あるコードを実行できる。
この技術を「NOPスライド」といい、手前の「何もしない」の羅列をNOPスレッドという。
(スレッドはsled、橇のことだ。)
NOPとは"No OPeration"、つまり「何もしない」ということだ。

●chroot
脆弱性を攻撃されて任意のファイルにアクセスされたりすると困るので、そもそもプロセス(実行されたひとつひとつのプログラム)がアクセスできるファイルを制限したい場合がある。そこで用いられるのがchrootだ。
chrootは、ルートディレクトリ(つまり、アクセスできる最上位フォルダ)を指定してプログラムを実行するプログラムだ。ルートディレクトリをどこか辺鄙な場所にしてやれば、chroot上で実行されたプログラムがクラックされても、その辺鄙なフォルダより外は決して読み書きできなくなるわけだ。
chrootで外側の領域にアクセスできなくなるの、コンドームっぽくない?

●アルゴリズム
ある目的(たとえば値を加工したり、何か特定の意味のある値を得たり)のために実行すべき一定の手順、およびそれを記述したもの。
「一定の手順」と書いたのは、アルゴリズムは「どのような入力に対しても、同じ手順の適用によって結果を得られる」からだ。
57がなんとなく素数っぽいからといって「素数!」と言うのではなく、素数っぽかろうがそうでなかろうが、決められた手順で素数かどうか判定するのがアルゴリズムなのだ。
聞いてるかグロタンディーク!

●ポインタ
メモリ上の特定の場所を指す値。ありきたりな喩えとして、「メモリ上の住所(番地)」。
メモリの読み書きをするとき、そのポインタ経由で(すなわちポインタの指す場所に)読み書きする場合はとても多い。
バッファオーバーフローというのは、「バッファ(の内部の場所の)読み書き用のポインタに、バッファ外を指させること」と考えることもできる。

●反応が日常と変わってしまうのも自然なこと
そりゃ何らかの意味のあるデータがオーバーフローの脆弱性で書き換えられれば、滅茶苦茶な値が入ってる場合もあるし、挙動がおかしくなっても不思議じゃない。
(たとえばユーザが「3+2」を実行させようとしたのに、結果を置いてある場所が唐突に「100」で書き換えられてしまえば、当然「結果は100です!」みたいなことになる。クラッキングとはそういうことだ。)

●ペイロード
情報セキュリティ分野では一般英語とは意味が違って、この語は「悪意ある処理の本体」みたいな意味だ。
先のNOPスレッドの解説でも少し書いたが、悪意あるコードを実行するためには、その手前にNOPを並べたり、書き換えた領域上を実行させるためのジャンプ用コードが必要だったりと、前準備で本体とは別のコードが必要になる場合がほとんどだ。
そこで、前準備と区別して、本当にやりたかった悪意のコードの本体をペイロードと呼ぶ。

●インジェクト、インジェクション
注入。情報セキュリティ分野では、インジェクションとは、プログラムを誤動作させるため、悪意あるコードを特殊な入力データに置いておくことを言う。
(一応言っておくと、インジェクト(inject)は動詞、インジェクション(injection)は名詞だが、例のごとく日本語では微妙に区別されない。)

本物のインジェクションではないが、たとえば、入力の文字列(Aとする)を受け取って“「こんにちは、Aさん」”と表示するプログラムがあったとしよう。
ここで“ぐっ」そう言って彼は死んだ。”という文字列を入力として与えるとどうなるかというと、出力は
“「こんにちは、ぐっ」そう言って彼は死んだ。さん」”
となる。要するに“」”という特殊な文字をそのまま表示してしまうから挨拶プログラムを誤動作させ、入力を地の文として表示させることで人を殺せたわけだ。
こういう現象を利用して、入力の一部を文字列や画像等のデータではなくプログラムや命令であると誤認させて悪意ある動作を発生させるのがインジェクションである。

有名なのはSQLインジェクションやOSコマンドインジェクションである。「ナンバープレート SQLインジェクション」で調べると、現実のインジェクション攻撃の例が見られるので一度ググってみることをおすすめする。

●プロセス
実行中のプログラムそれぞれのこと。
プログラムを車種とすれば、プロセスは車の実体、一台一台のことだ。
あるプログラムが複数起動していれば、それは同じプログラムだが異なるプロセスだ。
同じ車種の車が複数台あっても、同じ車種で異なる実体の車だということだ。

●fork
食器のフォークであるが、情報分野においてはプロセスが複製されて2つに分岐すること、またはそのための命令や関数を言う。単性生殖のようなものだ。
プログラムを起動するとプロセスが生まれるが、それは無からポコッと出てくるわけではなく、あるプロセスが複製されて分裂することで、新しいプロセスが起動するのである。
(唯一、最初のプロセスだけは無から生まれるのだが、それゆえinitとも呼ばれるそのプロセスは、システムの中枢とも呼べる重要なプログラムである。)
このとき、分裂元を「親プロセス」、分裂して新たに生まれた方を「子プロセス」と言うが、面倒なので親とか子と略して呼ぶのが普通。また、プロセスに対し「子孫」などの言い方も普通にする。

●exec
プロセスは分裂によって増えるが、クローンばかり増えてもユーザとしては嬉しくない。
そこで、分裂したプログラムは目的によって自身を別のプログラムのプロセスへと変化させるのである。
たとえばブラウザからメールアドレスのリンクをクリックしたところで、そのブラウザにメール機能がなければもう一つブラウザが起動しても何も嬉しくない。
そこで、新しく起動した方のプロセスは、自分が子だと認識して、自身をメールプログラムへ入れ替えるのである。こうして、めでたくブラウザからメールプログラムが起動できることになる。
この変化、入れ替えをexecという命令や関数で行う。
(ちなみにexecはexecute、実行の略。)

●abort
プロセスや処理を中断(異常終了)することを情報界隈ではabortと言うのだが、これは本来の英語では妊娠中絶、堕胎のことだ。
非英語圏のプログラマ各位はこれ知ってるのだろうかね……(まあ知っててもそういう用語だから使うんだけどね)

●仮想環境
コンピュータ上で直接動く環境ではなく、その中で何らかの形で隔離された環境のこと。典型的には仮想マシンとか。
まあ大雑把にはVRのようなイメージで間違っていないかもしれない。
仮想マシンは、ハードウェアやOS、HDD上のファイル群など、ほとんどあらゆるものを隔離していて、仮想マシン内で「システムを壊した」と思っても、仮想マシンの外には全然影響がないようにできるし、仮想マシンからその外部を壊すことは極めて困難だ。
(尤も、仮想マシン自体に脆弱性があれば、当然意図せぬ動作を引き起こしたり任意のコードを実行させることは可能だし、実際そういった事例もある。)
chrootも軽量な仮想環境の一種で、これはファイル群だけを隔離して、ネットワークやシステムは本来の環境と共有している。
コンピュータウイルスの解析などは、仮想マシンのような強力な仮想環境に隔離したうえで実際に動作させて行ったりする。

●エクスプロイト
情報セキュリティ用語では「脆弱性を利用したコード」を意味する。
バッファオーバーフローからの任意コード実行は、説明を聞いただけだと「はっはぁ、そういうことか」となるが、実際やってみようとするとそう簡単ではない。
ましてや最近のシステムなどは攻撃への対処も意識して設計されている場合も多く、バグや脆弱性らしきものを見付けても、それを悪意ある形で利用できるようにするのは簡単ではない。
そこで、「この脆弱性は実際に危険で、こういうコードを使えば利用できてしまうんだよ」ということを実証し表明するために、脆弱性を利用する形で、しかし悪意のない行為(メッセージ表示とか無害なプログラムの実行とか)を行うコードを作成・公開することがある。これがエクスプロイトである。
とはいえエクスプロイトはまともに作ると極めて簡単に悪用できてしまう(コードを有害なものに置き換えるだけだ)から、わかる人にはわかるけどそのままでは実行も利用もできない、という中途半端な形のものをわざと公開することも多いらしい。

●リモートエクスプロイト
『妹エクスプロイト』というタイトルの元になった言葉。
言うまでもないが、リモートとは「遠隔」である。
エクスプロイトの中でも、特に攻撃プログラムを実行するマシンと攻撃対象のマシンが異なる(たとえばネット越しの)ようなもの、すなわち遠隔のエクスプロイトをリモートエクスプロイトと呼ぶのである。

評価や感想は作者の原動力となります。
読了後の評価にご協力をお願いします。 ⇒評価システムについて

文法・文章評価


物語(ストーリー)評価
※評価するにはログインしてください。
感想を書く場合はログインしてください。
お薦めレビューを書く場合はログインしてください。
+注意+
特に記載なき場合、掲載されている小説はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている小説の著作権は作者にあります(一部作品除く)。
作者以外の方による小説の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この小説はリンクフリーです。ご自由にリンク(紹介)してください。
この小説はケータイ対応です。ケータイかパソコンかを自動で判別し、適切なページを表示します。
小説の読了時間は毎分500文字を読むと想定した場合の時間です。目安にして下さい。
↑ページトップへ