内部からの脅威をコードの難読化で抑え込む
内部からの攻撃は、どれほど深刻な脅威なのだろうか。Ernst & Young 2004 Security Surveyには、「回答者の一部はメディアの論調やベンダの誇張話に惑わされ、ウィルスやワームばかりに目がいって、最大の脅威である部内者のことを忘れている」とある。
善良な従業員が攻撃者に変身するのはどんなときだろうか。米国財務省秘密検察局とCERTが出したMay 2005 Insider Threat Studyには、あるデータベース管理者のケースが紹介されている。この管理者は女性で、在職中はとても信頼され、仕事面での評価も一貫して高かったが、あるとき、職場でセクハラが行われていると苦情を申し立てた。調査の結果は否定的で、この管理者はそのことに不満を募らせ、結局、他社へ転職した。だが、新会社で働きはじめてから、旧勤め先からの紹介状に芳しくない勤務評定が添えられていたことを知り、復讐のため、旧職場のサーバからいくつかの重要ファイルを削除して、システムを大混乱に陥れた。
金銭的誘惑や産業スパイも、残念ながら今日のビジネス社会の現実である。元従業員であれ現従業員であれ、およそ従業員であれば、セキュリティ手順について部内者しか知りえない情報をもっている。従業員が辞めていくとき、この社内セキュリティ情報が持ち出されないよう何らかの手を打っておかないと、金銭的誘惑に負け、あるいは復讐に燃える元従業員にとって、かつての勤め先は恰好の標的になる。
部内者は伝統的セキュリティ手順をすり抜ける
部内者は、セキュリティ手順を迂回して重要システムに入り込める。小さな職場では従業員どうしの間に暗黙の信頼関係が存在し、パスワードを教え合ったり、頼まれれば重要システムへのアクセスを認めたりすることが日常茶飯事である。一方、大組織では、ハッカーに社会工学的な策を弄する余地があり、やはりセキュリティ手段の迂回が可能となる。たとえば、下心のあるシステム管理者が経営幹部に電話をし、「データベースの切り替え」を口実にパスワードを聞き出す、といったたぐいである。「フィッシング」被害の続出を見てもわかるとおり、技術的理由を持ち出されると、分別のあるユーザでさえ簡単に情報を与えてしまう。
情報セキュリティの観点からすると、企業はセキュリティを満遍なく行き渡らせなければならず、その点で大きなハンデを負っている。というのは、攻撃する側は弱い箇所を1つ見つけるだけで攻撃できるからである。部内者は社内のセキュリティ態勢をさまざまな状況で見ており、弱点を1つ見つけるくらい簡単にできるだろう。たとえば、不平たらたらの従業員Malloryは、管理者が毎週金曜日に早引けすることを知り、クリスマスイブには職場の人手が足りなくなることを知っている。それに付け込み、標準セキュリティ手順に1度だけ目をつぶるよう同僚を説得するかもしれない。管理する立場の人間が不在なら、同僚もMalloryに自分のマシンを使わせてやるかもしれない。
難読化されていないコードからソースレベル情報が漏洩する
危険にさらされているのは稼動中のシステムだけではない。企業のソースコードも同様である。ソースコードはデータの宝庫であり、データベース情報、肝心要のアルゴリズム、システム内部の仕組みなど、さまざまな情報を含んでいる。管理の行き届いている環境では、このソースコードにアクセスできるのを開発者だけとし、ユーザにはバイナリファイルだけを渡して、実行させるのが普通である。
しかし、.NetアセンブリやJavaアセンブリの性格からして、難読化していないバイナリを配布することは、実はソースコードを配布することとあまり変わらない。逆コンパイラなるものがいくらでも存在し、ほんの数秒で実行可能ファイルからソースコードを再生できるからである。それはまずいと思うなら、何らかの対策が必要となる。
コードからどんな情報が読み取れるのだろうか。次の表をご覧いただきたい。ここには、バイナリファイルを逆コンパイラで処理した結果を示している。左側は難読化しておかなかった場合、右側はコードを強力に難読化しておいた場合の逆コンパイル結果である。
逆コンパイル出力 |
||
難読化されていないコード |
難読化されているコード |
|
string myConnectionString = “Initial Catalog=Northwind;” + “Data Source=localhost;” + “User ID=sa;” + “Password=password”; SqlConnection myConnection = new SqlConnection(myConnectionString); string mySQL = “INSERT INTO Employees” + “(FirstName,LastName) VALUES ” + “(‘J’,’Smith’)”; SqlCommand myCommand = new SqlCommand(mySQL,myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); |
This item appears to be obfuscated and can not be translated. System.NotSupportedException: break at offset 00CE can not be translated into an expression. |
一見して、難読化されていないJavaプログラムや.Netプログラムからは手早く――いつもこれほど簡単とは限らないだろうが――重要情報が読み取れることがわかる。不心得の開発者なら、アプリケーションの内部や、それを支えているネットワークの仕組みまで読み解くことができる。そんな部内者が重要アプリケーションのソースコードを見つけたら、各種プロセスを隅々まで把握し、鍵となる情報がどこにあるかを突き止められるだろう。アプリケーションの弱点を探り出し、それを公開し、販売し、何かの秘密と交換するかもしれない。
攻撃者がコードを理解すればするほど、セキュリティ上の弱点が発見される危険も大きくなる。だが、難読化を導入してコンテキストを不明にすれば、攻撃者に対する防御壁を1つ追加できる。
コードの難読化はどう行うのだろうか。Web上で探せば、すぐに10を超える難読化アプリケーションが見つかる。.Netアプリケーションを専門に扱うもの、Javaに特化したもの、その他の言語用と、種類はさまざまだが、どれもクラスとメソッドの真の目的を隠すことは同じである。コンテキストを取り去って、ハッカーを混乱させ、迷わせる。
難読化ソリューション
企業は、アプリケーションの詳細を見られる人間を、知る必要のある少数のグループに限らなければならない。エンドユーザにすべてを公開してしまうことは、攻撃に利用できる情報を多数の人間に明かすことを意味する。たまたま難読化されていないコードが、復讐に燃える従業員の手に渡ったらどうなるだろう。アプリケーションを逆コンパイルし、そこに悪意ある変更を加え、その変更バージョンを実行する機会を虎視眈々と狙うことになる。極端な場合には、その従業員の隠密の行動によって重要な記録が削除され、不可欠のデータが改竄され、その他企業活動に支障を来すことさえないとは言えない。
内部からの攻撃には、知的財産の窃盗も含まれる。企業はソフトウェアの開発に多大な投資をしていて、アプリケーションの一部は競争相手にとって大きな価値をもっている。また、不満のある従業員は、アプリケーションの詳細を漏洩することで、セキュリティを弱体化させ、企業の評判を落とそうと考えるかもしれない。この種の攻撃に高度の技術はいらない。.NetアプリケーションやJavaアプリケーションを実行できるユーザなら、プログラミングの経験などなくても、どこからかフリーの逆コンパイラを探してきて、ソースコードをながめ、他に漏らすことができる。
覗こうとする目から社内のソフトウェアを保護する上で、難読化は重要である。情報セキュリティを確保するための重層的システムでは、難読化層が鍵となるだろう。
Mark Fagerholmは、Preemptive Solutions社の財務担当役員(CFO)である。同社は難読化ソリューションとして、.Netアプリケーション用にDotfuscator、Javaアプリケーション用にDashOを製造している。