技術の分かち合い:いくつかのよく見られるJavaScript混同と反混同ツールの分析実戦

23412 ワード

情報セキュリティは常に軍備競争、白い帽子と黒い帽子、浸透テスト者とハッカー、善と悪として記述されており、本稿ではこの永遠に果てしない決闘の小さな点に焦点を当てる.
HTML 5&JSアプリケーションでは入力の検証/注入の問題があふれており,開発者は常に警戒している必要がある.しかし、アプリケーション内のプログラム専用コードのアクセス性というもう一つの問題もあります.海賊版を防止したり、少なくとも海賊版をさらに困難にするために、混同ツールを使用してJSコードを混同することが多い.対立面として,混同防止ツールは混同されたJSコードを復元することも可能である.私は双方のいくつかのツールに触れたことがあります.次は私の研究成果です.
まず、次は私たちのサンプルコード(Google Closure CompilerのWikiページから取得)です.完全なアプリケーションではコードがより複雑になりますが、ここでは実験に十分です.
function displayNoteTitle(note) {
alert(note['title']);
}
var flowerNote = {};
flowerNote['title'] = "Flowers";
displayNoteTitle(flowerNote);

次に,実験を行う混同と反混同ツールを列挙し,本稿では4つの混同ツールと2つの反混同ツールを実験する.
混同ツール:
YUI Compressor
Google Closure Compiler
UglifyJS
JScrambler
アンチエイリアスツール:
jsbeautifier.org
JSDetox
以上はJscramblerが商用ソフトで有料で使用されている以外はすべて無料ソフトです.

縮小と混同


まず、混同ツールの混同効果を見てみましょう.次に、反混同ツールの表現を見てみましょう.

YUI Compressor

function displayNoteTitle(a){alert(a.title)}var flowerNote={};flowerNote.title="Flowers";displayNoteTitle(flowerNote);

Google Closure Compiler


このツールには、最適化と混同の2つのタイプがあります.

単純な最適化:

function displayNoteTitle(a){alert(a.title)}var flowerNote={title:"Flowers"};displayNoteTitle(flowerNote);

深度の最適化:

alert("Flowers");

UglifyJS


前のツールと同様に、UglifyJSにも2つの階層が混同されています.

デフォルト:

function displayNoteTitle(e){alert(e.title)}var flowerNote={};flowerNote.title="Flowers",displayNoteTitle(flowerNote);

詳細:

function t(t){alert(t.title)}var e={};e.title="Flowers",t(e);

JScrambler

/* Obfuscate your JavaScript at https://jscrambler.com */var g5b={'S':"A",'A':function(b){flowerNote['title']=b;},'X':"V",'o':(function(E){return (function(s,p){return (function(G){return {K:G};})(function(m){var c,R=0;for(var U=s;R"length"];R++){var O=p(m,R);c=R===0?O:c^O;}return c?U:!U;});})((function(h,n,a,M){var y=28;return h(E,y)-M(n,a)>y;})(parseInt,Date,(function(n){return (''+n)["substring"](1,(n+'')["length"]-1);})('_getTime2'),function(n,a){return new n()[a]();}),function(m,R){var d=parseInt(m["charAt"](R),16)["toString"](2);return d["charAt"](d["length"]-1);});})('3lrno3f7c'),'e':'title','V':function(b){x=b;},'Q':"Flowers",};function displayNoteTitle(b){alert(b[g5b.e]);}var flowerNote=g5b.o.K("3d3")?{}:"Flowers";g5b[g5b.S](g5b.Q);displayNoteTitle(flowerNote);g5b[g5b.X](g5b.D);

では、上のコードはどういう意味ですか.YUI Compressor、Google closure compilerの単純最適化モードとUglifyJSのデフォルトモードは、同じ方法でJSコードを縮小し、混同していることが明らかになった.縮小は、コードを圧縮したり、アプリケーションのボリュームを縮小したり、ブラウザのロード時間を短縮したりすることを意味します.これらのすべては、変数名を無意味な文字に変更すると、コードが読みにくくなります.
UglifyJSの拡張モードでは、関数名とグローバル変数の名前がさらに混同されます.Google closure compilerの深さ最適化モードは、無駄なコードを積極的に削除し、最もシンプルさを追求します.
Jscramblerは、コードの混同に専念し、コードを縮小するだけでなく、コードの数を増やすことでコードを読みにくくする別の方法です.

美化と反混同


jsbeautifier.org


名前のように、このオンラインツールは縮小されたコードをより読みやすくしようとしていますが、コードをさらに混同しないようです.
YUI Compressor -> jsbeautified
function displayNoteTitle(e) {
    alert(e.title)
}
var flowerNote = {};
flowerNote.title = "Flowers", displayNoteTitle(flowerNote);

UglifyJS Toplevel -> jsbeautified:
function t(t) {
    alert(t.title)
}
var e = {};
e.title = "Flowers", t(e);

JSDetox


UglifyJSの高度なモードのコードに対してJSDetoxを使うのはjsbeautifierに及ばないようです.orgがどれだけよいかは理解できるが,変数/関数名を変換することは不可逆的な過程である.

高度な反混同と悪意のあるコード検出


一般的なコード混同は知的財産権保護によく用いられるが、高度なコード混同はWEBアプリケーションの悪意のあるコードを隠すためによく用いられる.悪意のあるコードを混同するのは、ウイルス対策ソフトウェアの検出を避けるためであり、これらのコードは混同拡張後に悪意のあるソフトウェアと認識されにくい.MetasploitのJavascript混同器は悪意のあるコードを開発するためによく使われているので、次にMetasploitの混同器を使用して私たちのコードを混同します(ドキュメント参照).JSDetoxは、JSコードを混同する能力があると主張しているので、MetasloitとJscramblerを混同したコードについて、高度な混同を試みてみましょう.

Metasploit Javascript混同器

function L(t){window[String.fromCharCode(0141,0x6c,101,0162,0164)](t[String.fromCharCode(0164,105,0164,108,0145)]);}var C={};C[(function () { var K='le',Z='tit'; return Z+K })()]=(function () { var m="s",D="r",J="F",e="lowe"; return J+e+D+m })();L(C);

JSDetoxによる混同防止


JScrambler -> JSDetoxed
var g5b = {
  'S': "A",
  'A': function(b) {
    flowerNote['title'] = b;
  },
  'X': "V",
  'o': (function(E) {
    return (function(s, p) {
      return (function(G) {
        return {
          K: G
};
      })(function(m) {
        var c, R = 0;
        for(var U = s; R < m["length"]; R++) {
          var O = p(m, R);
          c = R === 0 ? O : c ^ O;
        }
        return c ? U : !U;
      });
    })((function(h, n, a, M) {
      return h(E, 28) - M(n, a) > 28;
    })(parseInt, Date, (function(n) {
      return ('' + n)["substring"](1, (n + '')["length"] - 1);
    })('_getTime2'), function(n, a) {
      return new n()[a]();
    }), function(m, R) {
      var d = parseInt(m["charAt"](R), 16)["toString"](2);
      return d["charAt"](d["length"] - 1);
    });
  })('3lrno3f7c'),
  'e': 'title',
  'V': function(b) {
    x = b;
  },
  'Q': "Flowers"
};
function displayNoteTitle(b){
  alert(b[g5b.e]);
}
var flowerNote = g5b.o.K("3d3") ? { } : "Flowers";
g5b[g5b.S](g5b.Q);
displayNoteTitle(flowerNote);
g5b[g5b.X](g5b.D);

Metasploit -> JSDetoxed
function L(t){
  window["alert"](t["title"]);
}
var C = { };
C["title"] = "Flowers";
L(C);

Metaslloitによって混同されたJSコードは依然としてウイルス対策ソフトを避けることができるが、JSDetoxによって混同されやすいように見える.興味深いことに、JSDetoxはJScrambledのコードを逆混同できないように見えます.なぜJSDetoxがmetasploitのコードを反混同できるのか分からないが、Jscramblerを反混同できないのか分からないが、JSDetoxがmetasploitの混同方法を専門にサポートしたと推測している.一方、Jscramblerは完全にブラックボックスですが、これはJscrambled混同後のJavascriptコードが混同されないことを意味するものではありません.Jscrambledコードを混同する機能に特化したツールがあるか、または含まれているツールがあるかもしれません.
*原文:damilarefagbemi、FB編集長xiaixは、FreeBufハッカーと極客(FreeBuf.COM)から