Broadband Watch logo
バックナンバー

その116「DLNAの仕組み」
[2007/03/26]
その115「ドメインとActive Directory」
[2007/03/19]
その114「ワークグループができること」
[2007/03/12]
その113「WPSの仕組み」
[2007/03/05]
その112「Gopherの生い立ちと現在」
[2007/02/26]
その111「Wikiの使われ方」
[2007/02/19]
その110「文字コードとは」
[2007/02/05]
その109「IISの生い立ち」
[2007/01/29]
その108「NASの登場と一般への普及」
[2007/01/22]
その107「HomePNAのいろいろ」
[2007/01/15]
その106「Ogg Vorbisの成り立ち」
[2006/12/25]
その105「MIDIの原理とSMFの構造」
[2006/12/18]
その104「AIFFの構造」
[2006/12/11]
その103「WAVの構造と現状」
[2006/12/04]
その102「WMAの歴史」
[2006/11/27]
その101「AACの特徴」
[2006/11/20]
その100「MP3/MPEG Audioの仕組み」
[2006/11/13]
その99「HSDPAの仕組み」
[2006/11/06]
その98「H.264・MPEG-4 AVCの特徴」
[2006/10/30]
その97「IEEE 802.16e(モバイルWiMAX)の特徴」
[2006/10/23]
その96「TIFFの特徴」
[2006/10/16]
その95「PNGの現状と今後」
[2006/10/02]
その94「GIFの構造」
[2006/09/25]
その93「10GBASEの種類(2)」
[2006/09/11]
その92「10GBASEの種類」
[2006/09/04]
その91「GbEのいろいろ」
[2006/08/28]
その90「JPEGの特徴」
[2006/08/21]
その89「DivXの広がり」
[2006/08/07]
その88「MPEGの仕組み」
[2006/07/31]
その87「WMVのこれまで」
[2006/07/24]
その86「AVIの生い立ちとそのコーデック」
[2006/07/10]
その85「QuickTimeの変遷」
[2006/07/03]
その84「Realのこれまでと今後」
[2006/06/26]
その83「ShareとWinny」
[2006/06/19]
その82「DOCSISの仕組み」
[2006/06/12]
その81「SQLインジェクションの流れ」
[2006/06/05]
その80「RSSの動作」
[2006/05/29]
その79「Skypeの仕組み」
[2006/05/22]
その78「BitTorrentの特徴と今後」
[2006/05/15]
その77「Winnyの仕組みと現状」
[2006/05/08]
その76「WinMXの特徴」
[2006/04/24]
その75「Gnutellaの歴史と構造」
[2006/04/17]
その74「Napsterの歴史」
[2006/04/10]
その73「P2Pのいろいろ」
[2006/04/03]
その72「IEEE 802.11nの動向」
[2006/03/27]
その71「ActiveX Scriptingの動作」
[2006/03/20]
その70「Ajaxの仕組み」
[2006/03/13]
その69「DHTMLの動作」
[2006/03/06]
その68「Scriptの定義」
[2006/02/27]
その67「JavaScriptの仕組み」
[2006/02/20]
その66「Javaの動作」
[2006/02/13]
その65「RFCのプロセス」
[2006/02/06]
その64「ActiveX DocumentとActiveX Controlの違いと共通点」
[2006/01/30]
その63「ActiveX Controlの機能」
[2006/01/23]
その62「ActiveXを構成するもの」
[2006/01/16]
その61「Cookieの仕組みと用途」
[2005/12/26]
その60「malwareとその分類」
[2005/12/19]
その59「rootkitの動作」
[2005/12/12]
その58「CSSの役割」
[2005/12/05]
その57「HTMLの変遷」
[2005/11/28]
その56「PONとその種類」
[2005/11/21]
その55「FWAの仕組み」
[2005/11/14]
その54「DoSとDDoS」
[2005/11/07]
その53「SNMPとMIBの動作」
[2005/10/03]
その52「Jumbo Frameとフレームサイズ」
[2005/09/12]
その51「WPA2の仕組み」
[2005/09/05]
その50「WPAとWPA-PSKの違い」
[2005/08/29]
その49「WPAの仕組み」
[2005/08/22]
その48「WebDAVの動作」
[2005/08/08]
その47「OFDMAの仕組みとOFDMとの違い」
[2005/08/01]
その46「OFDMの仕組み」
[2005/07/25]
その45「WiMAXの特徴」
[2005/07/11]
その44「Wi-Fiの役割」
[2005/07/04]
その43「FTPの目的と動作」
[2005/06/27]
その42「UPnPの動作」
[2005/06/20]
その41「ネットマスクの仕組み」
[2005/06/13]
その40「ARPの機能」
[2005/06/06]
その39「DNSの原理」
[2005/05/30]
その38「デフォルトゲートウェイの役割」
[2005/05/23]
その37「MACアドレスの仕組み」
[2005/05/16]
その36「スイッチとその進化」
[2005/05/09]
その35「ルータによるメリット」
[2005/04/25]
その34「ブリッジの原理」
[2005/04/18]
その33「リピータの機能」
[2005/04/11]
その32「IPアドレスのクラス」
[2005/04/04]
その31「ブロードキャスト/マルチキャスト/ユニキャスト」
[2005/03/28]
その30「SMTP AUTHと認証の種類」
[2005/03/14]
その29「Submissionポートとスパムメール対策」
[2005/03/07]
その28「Outbound Port25 Blockingとは」
[2005/02/28]
その27「PGPの仕組み」
[2005/02/21]
その26「PKIと認証局」
[2005/02/14]
その25「公開鍵暗号方式とは」
[2005/02/07]
その24「共通鍵暗号とは」
[2005/01/31]
その23「SSHの仕組みと応用」
[2005/01/24]
その22「SSLの役割」
[2005/01/17]
その21「POP3とIMAP4の違い」
[2004/12/27]
その20「POP3の役割と機能」
[2004/12/20]
その19「SMTPの機能と問題点」
[2004/12/13]
その18「SPIとパケットフィルタリング」
[2004/12/06]
その17「LANの概念とその広がり」
[2004/11/29]
その16「SIPの役割」
[2004/11/15]
その15「プロキシの利用」
[2004/11/08]
その14「VoIPの仕組み」
[2004/11/01]
その13「イーサネットとは」
[2004/10/25]
その12「IP/TCP/UDP/ICMPとは」
[2004/10/18]
その11「DHCPの役割」
[2004/10/04]
その10「MIMOとは」
[2004/09/27]
その9「DMZとその効果」
[2004/09/13]
その8「ファイアウォールとは」
[2004/09/06]
その7「NATとNAPTの違いとIPマスカレード」
[2004/08/30]
その6「VPNとVPNパススルーの仕組み」
[2004/08/23]
その5「無線LANの問題とWEP」
[2004/08/09]
その4「IEEE 802.11a/b/gって何を意味しているの?」
[2004/08/02]
その3「ダイナミックDNSって?」
[2004/07/26]
その2「グローバルIPアドレスとプライベートIPアドレス」
[2004/07/12]
その1「PPPoEって何だろう?」
[2004/07/05]

その63「ActiveX Controlの機能」


ActiveX Controlって何?

図1:手動でのリンケージ
 前回に続いて、ActiveXに関連について、もう少し取り上げていきたいと思います。今回取り上げるのは「ActiveX Control」。先週ちょっと触れましたが、OLEをインターネットに拡張したもの、という説明ではさすがにわからない人も多いと思います。そこで、まずはOLEから説明していきましょう。

 「OLE(Object Linking and Embedding)」というのは、Windows環境で提供されている、複数のプログラム間の連携を取るための技術です。OLEの元になっているのはDDE(Dynamic Data Exchange)という技術になります。

 DDEとは何かというと、複数のプログラム間でデータ交換を行なう手順です。例えば、Excelで集計した結果を使ってWordでレポートを書くというように、プログラムAの出力をプログラムBに入力するケースを考えます。1番手っ取り早いのは図1のように、プログラムAの出力を自分でコピーし、それをプログラムBにペーストするという方法です。図1ではクリップボードと呼ばれるものが間に挟まりますが、これはコピーした内容を一時的に保持するものです。

 このケースでは、人間が明示的に操作しなければなりません。ですので、項目数が少なければ大した手間ではありませんが、項目が増えると作業がバカになりません。そこで、プログラムAとBが自動でデータ交換を行なう方法が用意されました。これが、DDEというものです(図2)。

 DDEの“Dynamic”は、「あらかじめプログラムがDDE対応インターフェイスを用意していれば、どんな(DDE対応)プログラムとの間でもデータ交換ができる」というものです。それまではプログラムAとB、AとC、BとCなどという具合に、プログラムを作る側が「どんなデータをどのプログラムとやり取りするか」をあらかじめ決めた上で、それに合わせて交換方法を作り込むのが一般的でしたから、これは革新的なことでした。

 ちなみに広義には、DDEの中には「プログラムAが出力を自動でクリップボードにコピーし、プログラムBがそれを自動でペーストするという方法」も含まれますが、これはDDEと呼ばないのが一般的です。


図2:DDE

図3:OLE
 さて、これをもう1歩進めたのがOLEです(図3)。OLEでは、DDE同様のデータ交換も可能ですが、そこから1歩進めて「あるアプリケーションの中で、別のアプリケーションを呼び出す」という作業ができるようになりました。例えば、上の例でいえば、Wordの中にExcelを埋め込んでしまい、文章はワードで編集するが、表の部分ではExcelが動くなんてケースです。

 写真01は実際にこれをやってみた例です。表を編集するときだけ、Wordの中でExcelが動いているのがわかるかと思います。そして、編集が終わると、結果だけがWordに残るので、写真02のようにExcelが動いていたという痕跡は(ここからは)わかりません。

 ちなみに前回出てきたOCXとは、このOLE用に特化したプログラムの部品ということです。ExcelはOLE経由で呼び出されなくても、単独でも実行できます。ところがOCXはOLEを前提にしたものなので、単独では実行できません。従って、どこか別のプログラムがOLE経由で呼び出す仕組みが必要になります。

 ということで、やっと話がActiveX Controlにたどり着きました。ActiveX Controlでは、呼び出すプログラムと呼び出されるプログラムが、同じWindows上で動いている必要がありません。その間にインターネットが入ることすら許されており、あるPCのWindowsから別のマシン上で動いているWindowsのプログラムを呼び出し、実行させてその結果を得ることができます。

 前回、Windows Updateを例に取りましたが、Windows Updateではまず最初に各クライアントがどんなOSで、どのようなプログラムと修正パッチがインストールされているか、という情報を収集し、そこからどんなパッチを当てられるかの一覧が表示される形になります。この際に「データ収集」を行なうプログラムが、ActiveX Controlで動作しているわけです。


写真1 写真2

ActiveX Controlの問題点

ActiveX Control
 最大の問題点は、前回も書いたとおりこれがWindows環境でしか使えないものである、という点ですが、これは前回触れたのでここでは省略します。ちなみにOLEに似た仕組みは、例えば、かつてAppleがOpenDocという名前で提供していましたが、すでにOpenDocのメンテナンスは終わっており、それどころかOpenDocそのものが黒歴史入りしている関係で、似た仕組みを持ち“現在提供されている”ものはほとんどありません。

 では、ActiveX Controlの問題点は何かというと、大きく2つあります。1つは危険な動作ができてしまうこと、もう1つは配布の問題です。まず最初について説明しましょう。

 ActiveX Controlの場合、通常これはWebブラウザ経由で起動されるパターンがほとんどです。図4で言えば、サーバー側がマシンA、クライアントがマシンBになるわけですが、サーバーはプログラムCを起動するために、まずWebブラウザにリクエストを出し、「こういうActiveX Controlを実行して」と頼みます。これを受けてWebブラウザが該当するActiveX Controlを起動すると、あとはサーバーとActiveX Controlが勝手に通信をしてくれるわけです。

 これと似た仕組みを持つものに、Javaがあります。Javaの場合は、Webブラウザなどを経由してJavaのプログラムをダウンロードし、これをJava Engineに渡すと、これをJava Engineが実行してくれる形になります。仮に必要ならば、Javaプログラムは直接Webサーバーと通信することも可能ですから、そうした点だけ見れば極めて両者は似通っていると言えるでしょう。

 ところが、JavaとActiveX Controlの間には根本的な相違点が幾つかあります。JRE(Java Run-time Environment)さえあればどこでも動くというのもその1つですが(ActiveX ControlはWindows環境に限られる)、ここで問題にしたいのは安全性です。Javaの場合、仮想的なSandBoxと呼ばれる環境が作られ、JavaのプログラムはこのSandBoxの外にアクセスすることができません(図5)。

 ですので、外部にアクセスするためにはSandBox経由ということになるのですが、このSandBoxはあらかじめシステムに侵入したり、あるいは不法な処理を行なったりできないように配慮されています。また、仮にJavaプログラムが暴走したりクラッシュしたりしても、その影響はSandBox内部に限られるため、外部に悪影響を与えません。

 一方、ActiveX Controlの場合、内部はWindowsのアプリケーションそのもので、SandBoxのような「隔離された動作環境」にあたるものがありません。このため、例えばシステムをクラッシュさせたりすることも技術的には十分可能ですし、Windows自身のセキュリティホールなどを突いてシステム権限を獲得し、システムを乗っ取るようなActiveX Controlを作ることもできます。実際にActiveX Controlの形態を取ったウィルスやワーム、ルートキット、スパイウェアが存在しており、こうした懸念は取り越し苦労ではないことも(残念ながら)証明されています。


 もう1つの問題は、配布形態です。Internet Explorer(IE)を使うとダイナミックにActiveX Controlをインストール・実行を行なうことができます。例えば、Windows Updateを最初に使うと写真03のようなメッセージが出てくるわけですが、このメッセージだけで「これをインストールして良いか否か」を判断しなければなりません。それでもWindows Updateの場合はまだ説明があるからマシな方で(写真04)、「この先に進むには『インストールする』を押してください」とだけ書かれたWebページで、インストールしたものかどうか、という判断をどうやって行なうべきかに関して明確な指針はありません。

 Microsoftは「はじめてのセキュリティ対策」というページの「安全なダウンロードの基本:パート2」の中で「信頼できるサイトからダウンロードする」と説明していますが、ほとんどの人にとって、世の中のサイトの大半は信頼するもしないも、係わりあいが今までまったくないわけです。ドメイン名だけで信頼できるかどうかを判断するのは極めて困難、というケースがほとんどでしょう。

 もちろんこれはActiveX Controlに限った話ではありませんが、ActiveXを使わないとWebで先に進めない(先のWindows Updateなどがその最たるものでしょう)という作り方をしているサイトが多いため、潜在的に危険に陥りやすいという危険性を内包しています。これに関して、根本的な対策はActiveX Controlを使うサイトにはアクセスしない位しか手がないわけですが、世の中には「IE 6以上を使用してください」と記載しているサイトも少なくなく、これを実行するのはなかなか難しかったりします。筆者としても、あまりうまい解決法は残念ながら提示できません。


写真3 写真4

2006/01/23 11:02

槻ノ木 隆
 国内某メーカーのネットワーク関係「エンジニア」から「元エンジニア」に限りなく近いところに流れてきてしまった。ここ2年ほどは、企画とか教育、営業に近いことばかりやっており、まもなく肩書きは「退役エンジニア」になると思われる。(イラスト:Mikebow)
Broadband Watch ホームページ
Copyright (c) 2006 Impress Watch Corporation, an Impress Group company. All rights reserved.