ベリサイン「Secure Site シール」の問題点 プログラムの設計方針に初歩的問題?
3月9日に発見された日本ベリサイン社の「Secure Site シール」の問題点について、内容を解説する。
同社の「Secure Site シール」は、シールの画像をクリックすると同社にwebに移動し、認証されたサイトであることが表示される。
製品・サービス・業界動向
業界動向
同社の「Secure Site シール」は、シールの画像をクリックすると同社にwebに移動し、認証されたサイトであることが表示される。
>> 「Secure Site シール」認証情報表示ステップ
同社のサービスでは、次の3つのステップでの認証情報の表示を行っていた。問題があったのは2つめのステップである。2つめのステップで細工を行うことで、偽装が可能であった。ステップごとにその内容をみてみる。
1.登録 web 利用者がシールをクリックする(登録 web サイト)
ベリサイン社の黄金のシールを表示している web を訪れた利用者が、その web の認証情報を確認するためにシールをクリックする。
この時シールのリンクのリクエストは下記である
https://www.verisign.co.jp/secure/Seal.cgi? 特定のコードSeal.cgi?のパラメータとして指定されている特定のコードが登録 web サイトを特定するために用いられるものと思われる。
2.ボタン表示(ベリサイン社 web サイト)
シールをクリックすると、ボタンだけ表示された画面になる。この利用者はこのボタンを押すようもとめられる。この時、 web はすでにベリサイン社に移動している。
ブラウザに表示されるのは、ボタンだけであるが、実際には、HIDDEN属性でさまざまな情報が含まれている。この段階ですでに「3.」で認証情報として表示する情報がほとんど含まれている。
この段階でHIDDEN属性の内容を書き換えてしまえば、そのまま認証情報として表示できそうなことは容易に想像できる。
3.認証情報表示(ベリサイン社 web サイト)
利用者がボタンを押すと、認証情報が表示される。
「2.」の段階でHIDDEN属性とされていたものを表示する。
つまり、「2.」の内容を改竄あるいは、同じ書式でまったく異なる内容を作成し「3.」を呼び出すことで任意の内容を表示させることが可能となる。
>> 偽装の方法 HTML の基礎知識があれば素人でも偽装できた
偽装を行うには「2.」の段階の見かけ上ボタンだけのHTMLを偽装したい内容に書き換えて、任意のサーバ上に設置すればよい。
「2.」のHTMLファイルが、ベリサイン社以外のところにおいてあっても問題なく認証情報の表示が行われた。書き換える内容の推定も簡単である。
認証表示の際に用いるテンプレートがHIDDEN属性の中に記述されていた。
「Secure Site シール」のテンプレート(現在は表示されない)
https://www.verisign.co.jp/query/authCertDisplay.htm
このテンプレートを見ると、HIDDEN属性のどのパラメータがどの部分にどのように表示されるか、容易に推定できる。
テンプレートには、下記のようなHTML(関係個所のみ抜粋)が記載されている。実際には、グラフィックやテーブルを含んだHTMLであるが、わかりやすくするために、関係個所のみ抽出した。
$$VS_COMMON_NAME$$ は、
VeriSign Secure Site です。
サーバ名(コモンネーム) $$VS_COMMON_NAME$$
ステータス $$VS_STATUS$$
有効期間(GMT) $$VS_VALID_START$$ - $$VS_VALID_END$$
証明書のクラス $$VS_PRODUCT_NAME$$
サブジェクト $$VS_SUBJECT_READABLE$$
<以下略>
「2.」のHTMLのフォームのHIDDEN属性には、次のような記述がされている。部分的に関係する個所を抜き出した。指定すべき個所は便宜上、"X"で記載した。
<INPUT type=hidden name="VS_COMMON_NAME" value="XXXXXXXXXX">
<INPUT type=hidden name="VS_STATUS" value="Valid">
<INPUT type=hidden name="VS_VALID_START" value="XX-XXX-XX">
<INPUT type=hidden name="VS_VALID_END" value="XX-XXX-XX">
<INPUT type=hidden name="VS_PRODUCT_NAME" value="XXXXXXXXX">
フォームとテンプレートで同じ名前のパラメータが記述されているので、すぐに、どの個所になにを記述すればよいか推定できる。
例えば、フォームに下記のように指定するだけでよい。
すると、このように日本ベリサイン社の web に表示される。どうみても認証された画面としか見えない(サイト名はうそっぽいことは別として)。
偽装のサンプル
http://www.vagabond.co.jp/top/image/verisign02.GIF
これまで見てきた内容には、技術的に高度なものは含まれていない。
HTMLのフォームでCGIを呼び出すコードを書いたことのある人なら、問題なく理解できるし、自分で推定することも可能だろう。
>> テンプレートとデータを生で指定し、ファイル名やパスを露出する無神経さ
「Secure Site シール」ならびに3月7日に本誌が発見した問題は、いずれも web 表示の際に、テンプレートと表示データを生のファイルが推定できる形で指定していたことに起因している。
生のファイルおよびディレクトリが推定できることは、そこからさまざまな推定を行うことができるために大変危険といえる。
あらゆるプログラムに、必ずなんらかの問題点は存在する。問題発生を防ぐためにできることは、可能な限り問題を減らすことと問題点を発見されにくくすることである。外部に対して、問題点の推定を可能とするような情報が見えてしまうプログラムは好ましくないと考えられる。
今回の一連の日本ベリサイン社の問題は、外部の第三者に問題点が発見されやすい設計になっていたことにひとつの原因があるといえる。
関連情報
日本ベリサインのWebに重大な問題が! ファイルが丸見えに(2002.3.7)
https://www.netsecurity.ne.jp/article/1/4266.html
日本ベリサインの「SecureSiteシール」サービスが停止(2002.3.9)
https://www.netsecurity.ne.jp/article/1/4280.html
ベリサイン Secure Site に偽装の脆弱性
〜安心のマークが不安のマークに!〜(2002.3.9)
https://www.netsecurity.ne.jp/article/1/4279.html
[ Prisoner Langley ]
(詳しくはScan および Scan Daily EXpress 本誌をご覧ください)
http://shop.vagabond.co.jp/m-ssw01.shtml
http://shop.vagabond.co.jp/m-sdx01.shtml
《ScanNetSecurity》