投稿者: draco

難読化(Javascriptの難読化)

Published / by draco

ソースコードを意図的に読みづらくさせるテクニックの難読化について

難読化とは?

難読化とは、リバースエンジニアリングされないようにソースコードを意図的に読みづらくさせるテクニックです。

難読化を行うことで、攻撃者からのリバースエンジニアリングへのセキュリティ対策になります。Javascriptなどのスクリプト言語は性質上、Web上でソースコードが読めます。そのため、ソースコードを解析されることで攻撃者に脆弱性(セキュリティホール)を見つけられて攻撃されます。

DOM XSSはこのタイプの脆弱性になります。この脆弱性については、後にこのブログでも取り上げていこうと思います。Javascriptでなくても同様にソースコードが読まれることで脆弱性を見つけられたり、ソースコードが盗まれたりします。

ソースコードが読みづらくなるため、相手が読むを諦めたり理解したりすることが難しくなって時間を稼ぐことも出来ます。

しかし、読みづらくなるだけで読めなくなる分けではないので時間をかけて読もうとすれば、遅かれ早かれ解析されます。また、元のソースコードが脆弱な場合は攻撃を普通に受けます。

難読化のメリット

・読みづらくなることで、攻撃者が脆弱性を探すのを妨害することが出来る
・ソースコードがコピーされるのを、防ぐことが出来る
・ソースコードの結果に影響を与えない

難読化のデメリット

・完璧ではないが、難読化を解除することが出来る
・時間をかければ解析出来る
・ソースコード量が増加するため、実行速度やページの読み込み速度が遅くなる場合がある
・難読化前のコードが脆弱な場合は、攻撃されたら攻撃を受けてしまう

難読化してみる

では実際に、難読化していきます。難読化を行うツールはいろいろありますが、今回はJavascriptの難読化を行う時に、Web上で完結できるツールを使っていきたいと思います。

JavaScript Obfuscator

このツールはかなり便利でコードをコピー&ペーストするだけで、難読化してくれます。

試しに下記の脆弱なコードを難読化していきます。ここでは、コードについては触れません。

var text = document.getElementById('text').value;
var result = document.getElementById('result');
result.innerHTML = 'Password is:' + text;

貼り付けたら、「Obfuscate」をクリックするだけです。

function _0x2f5e(_0x5afdfa,_0x1a48c0){var _0x12d764=_0x12d7();return _0x2f5e=function(_0x2f5eda,_0xa5f5ef){_0x2f5eda=_0x2f5eda-0xda;var _0x4d3b5d=_0x12d764[_0x2f5eda];return _0x4d3b5d;},_0x2f5e(_0x5afdfa,_0x1a48c0);}var _0x3e3fb9=_0x2f5e;function _0x12d7(){var _0x287b4e=['52hAbFdV','1405076MmViNJ','5157GAXCSX','result','10jQpxip','2195016lsUgYx','innerHTML','2FDciXL','1496tbDTSn','value','text','93643UhSDLi','Password\x20is:','1225131aFUMmL','98fmsAmP','648786VQhfQP','getElementById','4776940bPQZuU','12PLUzpO'];_0x12d7=function(){return _0x287b4e;};return _0x12d7();}(function(_0x550da1,_0x167de5){var _0x495f2d=_0x2f5e,_0x2b0645=_0x550da1();while(!![]){try{var _0x4c2a2c=-parseInt(_0x495f2d(0xda))/0x1*(-parseInt(_0x495f2d(0xe0))/0x2)+parseInt(_0x495f2d(0xe6))/0x3*(parseInt(_0x495f2d(0xeb))/0x4)+-parseInt(_0x495f2d(0xea))/0x5+parseInt(_0x495f2d(0xe8))/0x6*(-parseInt(_0x495f2d(0xe7))/0x7)+-parseInt(_0x495f2d(0xe1))/0x8*(-parseInt(_0x495f2d(0xdb))/0x9)+parseInt(_0x495f2d(0xdd))/0xa*(-parseInt(_0x495f2d(0xe4))/0xb)+-parseInt(_0x495f2d(0xde))/0xc*(-parseInt(_0x495f2d(0xec))/0xd);if(_0x4c2a2c===_0x167de5)break;else _0x2b0645['push'](_0x2b0645['shift']());}catch(_0x866253){_0x2b0645['push'](_0x2b0645['shift']());}}}(_0x12d7,0xf203f));var text=document[_0x3e3fb9(0xe9)](_0x3e3fb9(0xe3))[_0x3e3fb9(0xe2)],result=document[_0x3e3fb9(0xe9)](_0x3e3fb9(0xdc));result[_0x3e3fb9(0xdf)]=_0x3e3fb9(0xe5)+text;

先ほどのコードが難読化されました。
これだけでもかなり攻撃者は読む気がなくなると思います。

「Download obfuscated code」をクリックすれば難読化されたjsファイルをダウンロードすることが可能です。また、「Upload Javascript File」でjsファイルをアップロードすることでも難読化を行ってくれます。

あとは難読化されたファイルをサーバーなどにアップすれば問題ないです。

どのように難読化するかをオプションでカスタマイズ出来るところも魅力的です。


以上で難読化についての説明は終わりになります。


かなり便利なツールなので、Javascriptのソースコードを読まれたくない方がいらしたら試してみてください。