2015年09月09日

バッファオーバーラン攻撃について

※この記事はC言語がわかる人でないと少々難しい。

先日、システムでまた一つ不具合があった。本来、不具合は部下の開発者に修正してもらうことが多いのだが、その時は全員非常に忙しい状況だったため、仕方なく私が自分自身で修正を行なうことになった。

調べてみると、不具合の原因はC言語のプログラムで起こっていることがわかった。原因は、関数のパラメータに、変数で確保しているバッファ以上の文字列を渡すことにより引き起こされていた。これは、世に言う「メモリ破壊」と呼ばれるもので、C言語の不具合としては一般的なものである。また、この不具合を利用したセキュリティ攻撃を「バッファオーバーラン」などと呼ぶ。

このプログラムはもう10年以上も前に開発され、長く稼働してきたものだが、ふとしたことからこの不具合が顕在化することになった。アプリケーションで突如として長い文字列のパラメータが渡されるようになり、coreダンプを出力して終了していたのである。

------------------------------
void func(const char* msg)
{
 char buf[20];
 memset(buf, 0, sizeof(buf));

 strcpy(buf, msg);
}
------------------------------

イメージとしては、上のような感じである。受け取ったパラメータmsgが変数bufの容量19バイトよりも大きい場合、バッファをオーバーしてプログラムの誤作動が引き起こされる。これをメモリ破壊という。(最後の1バイトはNULL終端である。)

では、この時のパラメータがバッファをオーバーした場合、20バイトより後ろの文字列はどこへ行くのだろうか。それは、メモリの他の部分を浸食するのである。例えば、次のようなプログラムがあったとする。パラメータmsgに30バイトの文字列を渡した場合、変数bufの20バイトを超え、残りの10バイトが変数tmpに格納されてしまうのである。

------------------------------
void func(const char* msg)
{
 char tmp[20];
 char buf[20];
 memset(tmp, 0, sizeof(tmp));
 memset(buf, 0, sizeof(buf));

 strcpy(buf, msg);
}
------------------------------

もし、変数tmpがプログラムの動作に重要な影響を与える部分であった場合、システムの攻撃者はこの不具合を利用して意図的に長いパラメータを送り込み、誤作動を引き起こすことができる。これが、バッファオーバーラン攻撃である。

ポール・グレアムは、C言語のレベルの低さ(低水準の意)を「ポータブルなアセンブリ言語」と呼んだ上で、次のように語っている。

------------------------------
C言語では、外部からの入力の長さをチェックしてない箇所はどこでも、セキュリティホールになる。このような穴を利用する攻撃をバッファオーバーフローアタックと呼んでいる。バッファオーバーフローアタック以外にもコンピュータを乗っ取る方法はあるが、リターンアドレスを上書きするのは古典的な方法だ。
------------------------------

ところで、私はもちろんこのプログラムで変数のバッファを拡張する修正を行なったのだが、このプログラムはシステムの至るところから使用される共通部品であった。すると、同僚の開発者がこの修正を非常に嫌がったのである。私には意味がわからなかった。

彼によると、C言語で作られたプログラムはメモリを直接操作できる関係上、至るところにバグが潜んでいる可能性がある。そのため、システム全体に影響のある共通部品を修正した場合、他で“たまたま”うまく動作していた潜在バグが、システムのメモリの持ち方が変わったことで突如として顕在化する可能性がある。彼はその危険性を懸念したのである。

私はC言語の経験が少ないので、彼の指摘には全く気付かなかった。Javaなどの言語ではメモリの確保の仕方を気にすることはないので、システムが正常に動作していれば、それはプログラムが正しいことの証拠であったのである。しかし、C言語はそうはいかない。この時私は、C言語は非常に恐ろしい言語だということを知った。

今回の不具合はバグの箇所を見つかるのが難しく、原因の把握に非常に時間がかかった。しかし、おかげでC言語の性質をより深く理解するきっかけとなった。バッファオーバーラン攻撃Wikipediaなどにも非常に詳しく記載されており、開発者として知っておいた方がよいセキュリティホールである。仕事を通して勉強ができるというのは、研究者・開発者にとって非常に面白いことの一つである。

(Wikipedia)
バッファオーバーラン
(参考)
メモリを壊してみましょう(1)
バッファオーバーフローを起こして、バッファオーバーランさせようとしたけど駄目だった話


応援よろしくお願いします。





タグ:記事一覧
posted by 良源 at 00:00| アプリケーション | このブログの読者になる | 更新情報をチェックする

2015年07月22日

ハッカー語としてのLeet Speak

インターネット上で使われるスラングに、「ハッカー語」と呼ばれるものがある。専門用語では、「Leet Speak」(リートスピーク)や単に「Leet」(リート)と呼ばれる。これは、日本語で言う「ギャル文字」みたいなものだが、チャットやオンラインゲームで使われる特殊な表記方法である。例えば、このLeetでは、次のような表記の仕方をする。

------------------------------
cOmPuTeR ScIeNcE Is tHe sCiEnTiFiC AnD PrAcTiCaL ApPrOaCh tO CoMpUtAtIoN AnD ItS ApPlIcAtIoNs.
------------------------------

これは、「Computer science is the scientific and practical approach to computation and its applications.」という英文をLeet表記で記述したものだ。アルファベットの小文字と大文字が変換されていて、やや怪しげな文章になっている。この他にも、アルファベットの「A」を数字の「4」や記号の「@」に変換するなど、もっと複雑で読みにくい変換の仕方もある。

これらは、チャットでのちょっとした会話や、著作権問題を回避するための逃げ道としてまで幅広く使われているという。しかし、私は実際にこのような「ハッカー語」が使われているのを見たことはない。ただ、「53xy」(sexy)「ru nubi?」(are you a newbie?)というような単語レベルでの置き換えなら、簡単だし英語圏で使われているような気がする。

確か、私がこのLeet表記を最初に見たのは2000年前後だったと思う。当時、この「ハッカー語」の変わった雰囲気が何だか恰好良く思えたものだ。下記が、その時見たLeet表記の画像である。もう15年も前の画像ファイルが未だに私のPCに保存されていたなんて、非常に驚きである。内容はよくわからないが、どうもGoogleの検索エンジンに関するものらしい。

【15年前に見たLeet表記】
Leet Speak.jpg

私は、この時見たLeet表記がその後も強く印象に残っており、2005年くらいにJavaの練習がてらLeet表記への変換プログラムを書いた。仕組みは簡単で、アルファベットのA〜Zまでをそれぞれ変換テーブルに当てはめ、与えられた文字列をランダムで変換し、吐き出すというものである。

【Leet表記への変換テーブルの例】
char table[][] = {
  {‘a’, ‘A’, ‘@’},
  {‘b’, ‘B’, ‘3’, ‘ß’},
  {‘c’, ‘C’, ‘[’, ‘(’},
      :
  {‘z’, ‘Z’, ‘2’, ‘s’}};

このプログラムはとても良くできたので、何かに使えないかと思ったのだが、当時既に大学生になってしまっていた。そのため、友人に馬鹿にされることを恐れ、使うことができなかった。Javaのソースはその後しばらく取っておいたのだが、数年前ついにパソコンを整理した際に削除してしまった。

今でもLeet表記というのは非常に面白いと思う。現在ではWeb上で変換器が提供されていたり、何とGoogleではLeet版の検索エンジンが提供されている。よく知らないが、この検索エンジンにはあまり意味はなさそうで、表記が単にLeetになっているだけだと思う。(興味のある人は自分で調べてほしい。)

私が中学生の頃にこんなものに興味があったなんてお笑いだが、こうしたコンピュータへの興味が、現在の自分につながっているのである。過去のことを思い出すのは懐かしいし、そうしたことも数ある偶然の一つである。そう思うと、今在る自分に感謝しなければならないだろう。

(参考) 私がシステムエンジニアになった理由


応援よろしくお願いします。





タグ:記事一覧
posted by 良源 at 00:00| アプリケーション | このブログの読者になる | 更新情報をチェックする

2015年07月15日

AI研究のターミネーター化について

7月10日から映画「ターミネーター:新起動/ジェニシス」が公開されている。私は「ターミネーター」シリーズは全て観ているので、今回もさっそく映画館で鑑賞してきた。

全体としては、まずまずの出来だったと思う。特に不自然なところはないのだが、アーノルド・シュワルツェネッガーがかなり年を取っているにも関わらず、彼のスタントに合わせてストーリーが作られているようで、ちょっと強引な感じがした。(シュワちゃんが人気があるのはわかるが、やはりアクション俳優は若くなくては…。)

本来、私はあまりアクション映画を観ないので、たまに見ると酷評になってしまう。「ターミネーター」シリーズでは、私はシリーズ2で液体金属(T-1000)と戦うところが一番好きである。それ以外のシリーズはあまり驚きや感動がなかった。

ところで、人工知能(AI)の研究は今非常にいい線までいっているらしい。どういうことかというと、AI研究は、コンピュータの自然言語処理の研究に合わせて1980年代からずっと行なわれてきたものだが、なかなか成果が上がらなかった。AI研究では、人間と同じようにコンピュータに音声や画像を認識させるのが非常に難しいことがわかったのである。ところが、Googleやその他の最先端の研究機関では、今やAI研究が実用化できるところまで進んでいるというのである。

例えば、先日こんな記事を読んだ。7月2日ウォール・ストリート・ジャーナルによると、Googleで開発しているフォトアプリ「グーグル・フォト」が、黒人の画像を誤ってゴリラとタグ付けしてしまったという。私はこのプログラムのことをよく知らないが、画像認識の一環で自動的に単語を関連付けるものだと思う。Googleはこのグーグル・フォトにAI研究の成果を応用しているらしいが、そのグーグル・フォトが黒人とゴリラを区別できなかったということだ。

しかし、実際に記事を読めばわかるが、このグーグル・フォトは、それ以外の情報、例えば、人が自転車に乗っている画像を「自転車」とタグ付けしたり、アカデミックドレスを着ている人の画像を「卒業」とタグ付けするなど、ほとんどの画像を正しく処理している。このことはつまり、AI研究の実用化は、既に非常に多角的な面で高度な画像認識が行なえる段階まで来ているということである。

また、こんなニュースもあった。7月6日には、ITmediaニュースで、AIの“ターミネーター化”防止目的の37の研究に、非営利団体FLI(Future of Life Institute)が総額700万ドルを提供するという記事が出ている。これはつまり、既に私たち人類はAI研究に関して、映画「ターミネーター」シリーズのように、機械が暴走しないように考慮しなければならない時代に入っているということである。私はこの記事を見て、伊達にSF映画は未来を予想していないと思った。

おそらく、将来的にもAIは人間と同じように感情や自我を持つことは不可能なのだろうが、人間と同じレベルの倫理観や判断力を持つことは可能だと思う。そうすれば、もはやAIが感情を持っているかどうかは別問題となり、実社会のあらゆる側面で人間に影響力を行使するようになるだろう。その時にはきっと、人間が行なっている戦争や利益競争はAIによって厳しく抑制されるに違いない。

そういえば、私は数年前に少しだけ人工知能に興味を持っていたことがあり、有料のチャットサービスに申し込んだことがあった。それは、米国のA. L. I. C. E. Artificial Intelligence Foundationという組織のもので、PayPalでいくらか支払うと、一定期間英語でAIとチャットができるというものである。これは主にESL(English as a Second Language)を目的としたもので、私も英語学習に役立てられないかと思って申し込んだのである。このサービスは今でも利用可能なので、興味がある人はやってみるといいかもしれない。

何にせよ、既に私たちの知らないところでAI研究は予想以上に進んでいるということだ。私はこれ自体は非常に良いことだと思う。それに、AIがターミネーター化しないように十分配慮されているというのも良い方向である。結局、本物のAIが完成してしまったら、映画「ターミネーター」シリーズのように何が起こるかわからないから。

AI研究はやはり素晴らしい。私もそういう研究ができたら面白いと思うが、民間企業ではそういう利益にならないことはやらせてくれないのである。

(参考)
プログラマ不要論について
グーグル、黒人を誤って「ゴリラ」とタグ アルゴリズムの限界か
人工知能(AI)の“ターミネーター化”防止目的の37の研究にFLIが総額700万ドル提供
A. L. I. C. E. The Artificial Linguistic Internet Computer Entity
join the ALICE A.I. Foundation - Alicebot


応援よろしくお願いします。





タグ:記事一覧
posted by 良源 at 00:00| アプリケーション | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。