ソフトの解析を難しく

図2●変数名などを変更し,ソース・コードをわかりにくくした例
ソース・コードをわかりづらくしてから実行ファイルなどを生成すれば,逆コンパイルしたコードもわかりづらいものとなる。例では変数名やクラス名などをわかりにくくしているだけだが,アルゴリズムを冗長化したり複雑化したりする,コードの一部を暗号化する――などの手法を組み合わせることで,いっそう解析しづらくなる。
表1●プログラムを難読化する主なツール
写真4●デバッガで解析されそうになると,プログラムがエラーを発生する
アクセスチケットシステムズの「TRCS」を利用すると,プログラムやデータなどを耐タンパー化できる。デバッガなどによる割り込みを検出すると,エラーを発生させて解析させない仕組みも備えている。
 次に,ソフトウエア・レベルの耐タンパー技術を見てみよう。ソフトウエア・レベルの耐タンパー技術は,暗号カギなど秘密のデータを守る,リバース・エンジニアリングを防ぐなどの目的で利用する。リバース・エンジニアリングによってプログラムの構造などを解析,動作原理などを盗用されたりすることを防ぐ。

 ソフトウエアの耐タンパー技術には,ソース・コードやバイト・コードの処理内容をわかりづらくする,デバッガによる解析を検出して異常終了させる,ディジタル署名を利用して改ざんを検出可能にする――などがある。ハードウエア・レベルの耐タンパー技術とは異なり,重要なデータなどを削除して秘密を守るというのは現実的ではない。ソフトウエアはバックアップが容易で,削除不能な媒体に記録しておくことも可能だからだ。

 ソース・コードやバイト・コードの内容をわかりにくくするのは,逆アセンブルや逆コンパイルに対抗するためだ。具体的な手法はいくつかある。典型的なものは,ソース・コードの変数名などを意味のない文字列に置き換えるもの。例えば,ユーザーIDを格納する変数“user1”を“l1111”に,処理の回数を制御する変数“count”を“l111l”などとする。このように変数名をランダムな英数字列にするだけで,処理内容はわかりにくくなる(図2[拡大表示])。ほかにも,制御構造やアルゴリズムを意図的に複雑化/冗長化する,守りたいデータなどを暗号化する,実行コードの一部を自ら自動生成させる――などの手法を組み合わせる。こうした手法を組み合わせ,ソース・コードやバイト・コードを自動的にわかりにくくするツールもある(表1[拡大表示])。

 プログラムの解析を防ぐには,デバッガの利用を検出する仕組みも必要になる。具体的には,デバッガによる特殊な割り込みを検出し,本来の動作と異なる動きをしてデバッグを難しくする,またはプログラム自体を異常終了させてデバッグされないようする(写真4[拡大表示])。デバッガとは本来,作成したプログラムの不具合を取り除く(デバッグする)ときに使用するツール。ソース・コードに設定したブレーク・ポイントでプログラムに割り込みをかけて動作を止める,ステップ実行する,変数の値を参照するなどを可能にする。このため,デバッグだけでなく,プログラムの解析にも威力を発揮する。

 アクセスチケットシステムズの耐タンパー化ツール「TRCS(耐タンパー・コーディング・システム)」は,C/C++のプログラムをわかりにくくできるだけでなく,マイクロソフトの統合開発ツール「VisualStudio」のデバッガなどを検出可能にする。

 ただし,ハードウエアの動作をエミュレートするICE(内部回路エミュレータ)などを使った解析を「完全に防ぐことは不可能」(アクセスチケットシステムズ 開発部 部長の齋藤 和雄氏)。ICEは,実行した命令をすべて記録できるCPUエミュレータ。OS,デバイス・ドライバ,アプリケーションからは,ICEは通常のCPUとして見える。このため,ソフトウエアがICEによって解析されていることを検出するのは難しい。

評価基準が必要に

 耐タンパー技術を利用した製品などが増えるにつれて,そのセキュリティ・レベルを客観的に判断できるような評価基準が必要とされるようになっている。一口に「耐タンパー化されている」といっても,製品ごとに何をどこまで守ってくれるのかが異なるからである。

 米国には,政府の調達品に必要となる暗号/セキュリティ・レベルを規定した「FIPS140」という規格がある。2002年5月には,最新の攻撃手法を考慮した新たな規格「FIPS140-2」が公開された。日本国内にはまだ明確な評価基準は存在しないが,将来的にはFIPS140-2に準ずるか,同等の規定が定められると見られる。

 FIPS140-2では,暗号/セキュリティ・レベルを4段階に分類する。セキュリティ・レベルの高いものから3つに耐タンパー技術が含まれる。レベル2では,はがした痕跡が残る特殊なテープやシールを利用し,物理的な攻撃があったことを識別できるようにする。レベル3では,それに加えて,攻撃があったときに重要なデータを抹消するなどの機構が要件となる。最高のセキュリティを意味するレベル4は,温度/湿度/電流などの変化を利用した高度な攻撃も検知し,データを抹消してくれる。